@blac/core 2.0.0-rc-4 → 2.0.0-rc-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.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +12 -12
- package/dist/index.es.js +3 -3
- package/dist/index.es.js.map +1 -1
- package/package.json +1 -1
- package/src/Blac.ts +20 -18
package/dist/index.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var w=Object.defineProperty;var y=(d,e,t)=>e in d?w(d,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):d[e]=t;var n=(d,e,t)=>y(d,typeof e!="symbol"?e+"":e,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=class h{getInstance(){return h._instance||(h._instance=new l({__unsafe_ignore_singleton:!0})),h._instance}setInstance(e){h._instance=e}resetInstance(){const e=h._instance;h._instance=new l({__unsafe_ignore_singleton:!0});for(const t of e.keepAliveBlocs)h._instance.keepAliveBlocs.add(t),h._instance.uidRegistry.set(t.uid,t)}};n(h,"_instance");let B=h,u=new B;function m(d){u=d}const r=class r{constructor(e={}){n(this,"createdAt",Date.now());n(this,"blocInstanceMap",new Map);n(this,"isolatedBlocMap",new Map);n(this,"isolatedBlocIndex",new Map);n(this,"uidRegistry",new Map);n(this,"keepAliveBlocs",new Set);n(this,"postChangesToDocument",!1);n(this,"log",(...e)=>{r.enableLog&&console.warn(`☢️ [Blac ${this.createdAt.toString()}]`,...e)});n(this,"warn",(e,...t)=>{r.enableLog&&console.warn(`🚨 [Blac ${String(r.instance.createdAt)}]`,e,...t)});n(this,"error",(e,...t)=>{r.enableLog&&console.error(`🚨 [Blac ${String(r.instance.createdAt)}]`,e,...t)});n(this,"resetInstance",()=>{this.log("Reset Blac instance");const e=new Map(this.blocInstanceMap),t=new Map(this.isolatedBlocMap);e.forEach(s=>{s._keepAlive||s._dispose()}),t.forEach(s=>{s.forEach(i=>{i._keepAlive||i._dispose()})}),this.blocInstanceMap.clear(),this.isolatedBlocMap.clear(),this.isolatedBlocIndex.clear(),u.resetInstance()});n(this,"disposeBloc",e=>{const t=e.constructor,s=this.createBlocInstanceMapKey(e._name,e._id);this.log(`[${e._name}:${String(e._id)}] disposeBloc called. Isolated: ${String(t.isolated)}`),t.isolated?(this.unregisterIsolatedBlocInstance(e),this.blocInstanceMap.delete(s)):this.unregisterBlocInstance(e),this.log("dispatched bloc",e)});n(this,"activateBloc",e=>{const t=e.constructor;(e.isIsolated?this.findIsolatedBlocInstance(t,e._id):this.findRegisteredBlocInstance(t,e._id))||(this.log(`[${e._name}:${String(e._id)}] activateBloc called. Isolated: ${String(e.isIsolated)}`),e.isIsolated?this.registerIsolatedBlocInstance(e):this.registerBlocInstance(e))});n(this,"getBloc",(e,t={})=>{const{id:s}=t,i=e,a=s??e.name;if(i.isolated){const c=this.findIsolatedBlocInstance(e,a);if(c)return this.log(`[${e.name}:${String(a)}] (getBloc) Found existing isolated instance.`,t),c;if(t.throwIfNotFound)throw new Error(`Isolated bloc ${e.name} not found`)}else{const c=this.findRegisteredBlocInstance(e,a);if(c)return this.log(`[${e.name}:${String(a)}] (getBloc) Found existing registered instance.`,t),c;if(t.throwIfNotFound)throw new Error(`Registered bloc ${e.name} not found`)}const o=this.createNewBlocInstance(e,a,t);return this.log(`[${e.name}:${String(a)}] (getBloc) No existing instance found. Creating new one.`,t,o),o});n(this,"getBlocOrThrow",(e,t={})=>{const s=e.isolated,i=t.id||e.name,a=s?this.findIsolatedBlocInstance(e,i):this.findRegisteredBlocInstance(e,i);if(a)return a;throw new Error(`Bloc ${e.name} not found`)});n(this,"getAllBlocs",(e,t={})=>{const s=[];if(this.blocInstanceMap.forEach(i=>{i.constructor===e&&s.push(i)}),t.searchIsolated!==!1){const i=this.isolatedBlocMap.get(e);i&&s.push(...i.map(a=>a))}return s});n(this,"disposeKeepAliveBlocs",e=>{const t=[];for(const s of this.keepAliveBlocs)(!e||s.constructor===e)&&t.push(s);t.forEach(s=>s._dispose())});n(this,"disposeBlocs",e=>{const t=[];for(const s of this.blocInstanceMap.values())e(s)&&t.push(s);for(const s of this.isolatedBlocMap.values())for(const i of s)e(i)&&t.push(i);t.forEach(s=>s._dispose())});n(this,"getMemoryStats",()=>({totalBlocs:this.uidRegistry.size,registeredBlocs:this.blocInstanceMap.size,isolatedBlocs:Array.from(this.isolatedBlocMap.values()).reduce((e,t)=>e+t.length,0),keepAliveBlocs:this.keepAliveBlocs.size,isolatedBlocTypes:this.isolatedBlocMap.size}));n(this,"validateConsumers",()=>{for(const e of this.uidRegistry.values())e._consumers.size===0&&!e._keepAlive&&setTimeout(()=>{e._consumers.size===0&&!e._keepAlive&&e._dispose()},1e3)});const{__unsafe_ignore_singleton:t=!1}=e;if(!t)return r.instance;u.setInstance(this)}static get instance(){return u.getInstance()}static get getAllBlocs(){return r.instance.getAllBlocs}static get log(){return r.instance.log}static getInstance(){return u.getInstance()}static get warn(){return r.instance.warn}static get error(){return r.instance.error}createBlocInstanceMapKey(e,t){return`${e}:${String(t)}`}unregisterBlocInstance(e){const t=this.createBlocInstanceMapKey(e._name,e._id);this.blocInstanceMap.delete(t),this.uidRegistry.delete(e.uid),this.keepAliveBlocs.delete(e)}registerBlocInstance(e){const t=this.createBlocInstanceMapKey(e._name,e._id);this.blocInstanceMap.set(t,e),this.uidRegistry.set(e.uid,e),e._keepAlive&&this.keepAliveBlocs.add(e)}findRegisteredBlocInstance(e,t){if(e.isolated)return;const i=this.createBlocInstanceMapKey(e.name,t);return this.blocInstanceMap.get(i)}registerIsolatedBlocInstance(e){const t=e.constructor,s=this.isolatedBlocMap.get(t);s?s.push(e):this.isolatedBlocMap.set(t,[e]),this.isolatedBlocIndex.set(e.uid,e),this.uidRegistry.set(e.uid,e),e._keepAlive&&this.keepAliveBlocs.add(e)}unregisterIsolatedBlocInstance(e){const t=e.constructor,s=this.isolatedBlocMap.get(t);if(s){const i=s.findIndex(a=>a.uid===e.uid);i!==-1&&s.splice(i,1),s.length===0&&this.isolatedBlocMap.delete(t)}this.isolatedBlocIndex.delete(e.uid),this.uidRegistry.delete(e.uid),this.keepAliveBlocs.delete(e)}findIsolatedBlocInstance(e,t){if(!e.isolated)return;const i=this.isolatedBlocMap.get(e);return i?i.find(o=>o._id===t):void 0}findIsolatedBlocInstanceByUid(e){return this.isolatedBlocIndex.get(e)}createNewBlocInstance(e,t,s={}){const{props:i,instanceRef:a}=s,o=new e(i);return o._instanceRef=a,o.props=i||null,o._updateId(t),o._setDisposalHandler(c=>this.disposeBloc(c)),o.isIsolated?(this.registerIsolatedBlocInstance(o),o):(this.registerBlocInstance(o),o)}static get activateBloc(){return r.instance.activateBloc}static get getBloc(){return r.instance.getBloc}static get getBlocOrThrow(){return r.instance.getBlocOrThrow}static get disposeKeepAliveBlocs(){return r.instance.disposeKeepAliveBlocs}static get disposeBlocs(){return r.instance.disposeBlocs}static get getMemoryStats(){return r.instance.getMemoryStats}static get validateConsumers(){return r.instance.validateConsumers}};n(r,"enableLog",!1),n(r,"resetInstance",()=>{u.resetInstance()});let l=r;class I{constructor(e){n(this,"bloc");n(this,"_observers",new Set);this.bloc=e}get size(){return this._observers.size}get observers(){return this._observers}subscribe(e){return l.log("BlacObservable.subscribe: Subscribing observer.",this.bloc,e),this._observers.add(e),e.lastState||(e.lastState=e.dependencyArray?e.dependencyArray(this.bloc.state):[]),()=>{l.log("BlacObservable.subscribe: Unsubscribing observer.",this.bloc,e),this.unsubscribe(e)}}unsubscribe(e){this._observers.delete(e),this.size===0&&(l.log("BlacObservable.unsubscribe: No observers left. Disposing bloc.",this.bloc),this.bloc._dispose())}notify(e,t,s){this._observers.forEach(i=>{let a=!1;if(i.dependencyArray){const o=i.lastState||[],c=i.dependencyArray(e);for(let f=0;f<c.length;f++){const _=c[f],v=o[f]||[];for(let g=0;g<_.length;g++)if(!Object.is(_[g],v[g])){a=!0;break}}i.lastState=c}else a=!0;a&&i.fn(e,t,s)})}clear(){this._observers.forEach(e=>{this.unsubscribe(e)}),this._observers.clear()}}class p{constructor(e){n(this,"uid",crypto.randomUUID());n(this,"defaultDependencySelector");n(this,"_isolated",!1);n(this,"_observer");n(this,"_id");n(this,"_instanceRef");n(this,"_keepAlive",!1);n(this,"_createdAt",Date.now());n(this,"_state");n(this,"_oldState");n(this,"props",null);n(this,"_updateId",e=>{const t=this._id;!e||e===t||(this._id=e)});n(this,"onDispose");n(this,"_consumers",new Set);n(this,"_consumerRefs",new WeakSet);n(this,"_addConsumer",(e,t)=>{this._consumers.has(e)||(this._consumers.add(e),t&&this._consumerRefs.add(t))});n(this,"_removeConsumer",e=>{this._consumers.has(e)&&(this._consumers.delete(e),this._consumers.size===0&&!this._keepAlive&&this._scheduleDisposal())});n(this,"_disposalHandler");n(this,"lastUpdate",Date.now());n(this,"_batchingEnabled",!1);n(this,"_pendingUpdates",[]);n(this,"_pushState",(e,t,s)=>{if(e===void 0){console.warn("BlocBase._pushState: newState is undefined",this);return}if(s!=null){const i=typeof s;["string","object","number"].includes(i)||console.warn("BlocBase._pushState: Invalid action type",this,s)}if(this._batchingEnabled){this._pendingUpdates.push({newState:e,oldState:t,action:s});return}this._oldState=t,this._state=e,this._observer.notify(e,t,s),this.lastUpdate=Date.now()});n(this,"batch",e=>{const t=this._batchingEnabled;this._batchingEnabled=!0;try{const s=e();if(this._pendingUpdates.length>0){const i=this._pendingUpdates[this._pendingUpdates.length-1];this._oldState=this._pendingUpdates[0].oldState,this._state=i.newState,this._observer.notify(i.newState,this._oldState,i.action),this.lastUpdate=Date.now(),this._pendingUpdates=[]}return s}finally{this._batchingEnabled=t}});this._state=e,this._observer=new I(this),this._id=this.constructor.name;const t=this.constructor;this._keepAlive=typeof t.keepAlive=="boolean"?t.keepAlive:!1,this._isolated=typeof t.isolated=="boolean"?t.isolated:!1}get isIsolated(){return this._isolated}get isKeepAlive(){return this._keepAlive}get state(){return this._state}get _name(){return this.constructor.name}_dispose(){var e;this._consumers.clear(),this._observer.clear(),(e=this.onDispose)==null||e.call(this)}_setDisposalHandler(e){this._disposalHandler=e}_scheduleDisposal(){setTimeout(()=>{this._consumers.size===0&&!this._keepAlive&&(this._disposalHandler?this._disposalHandler(this):this._dispose())},0)}}n(p,"isolated",!1),n(p,"keepAlive",!1);class b extends p{constructor(){super(...arguments);n(this,"eventHandlers",new Map);n(this,"add",async t=>{const s=t.constructor,i=this.eventHandlers.get(s);if(i){const a=o=>{const c=this.state;this._pushState(o,c,t)};try{await i(t,a)}catch(o){l.error(`[Bloc ${this._name}:${String(this._id)}] Error in event handler for '${s.name}':`,o,"Action:",t)}}else{const a=t.constructor.name||"UnnamedConstructor";l.warn(`[Bloc ${this._name}:${String(this._id)}] No handler registered for action type: '${a}'. Action was:`,t)}})}on(t,s){this.eventHandlers.has(t)&&l.warn(`[Bloc ${this._name}:${String(this._id)}] Handler for event '${t.name}' already registered. It will be overwritten.`),this.eventHandlers.set(t,s)}}class A extends p{emit(e){if(Object.is(e,this.state))return;const t=this.state,s=e;this._pushState(s,t)}patch(e,t=!1){if(typeof this.state!="object"||this.state===null){l.warn("Cubit.patch: was called on a cubit where the state is not an object. This is a no-op.");return}let s=!1;if(t)s=!0;else for(const i in e)if(Object.prototype.hasOwnProperty.call(e,i)){const o=this.state[i];if(!Object.is(e[i],o)){s=!0;break}}s&&this.emit({...this.state,...e})}}exports.Blac=l;exports.BlacObservable=I;exports.Bloc=b;exports.BlocBase=p;exports.Cubit=A;exports.setBlacInstanceManager=m;
|
|
1
|
+
"use strict";var w=Object.defineProperty;var y=(d,e,t)=>e in d?w(d,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):d[e]=t;var n=(d,e,t)=>y(d,typeof e!="symbol"?e+"":e,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=class h{getInstance(){return h._instance||(h._instance=new l({__unsafe_ignore_singleton:!0})),h._instance}setInstance(e){h._instance=e}resetInstance(){const e=h._instance;if(h._instance=new l({__unsafe_ignore_singleton:!0}),e)for(const t of e.keepAliveBlocs)h._instance.keepAliveBlocs.add(t),h._instance.uidRegistry.set(t.uid,t)}};n(h,"_instance");let B=h,u=new B;function m(d){u=d}const r=class r{constructor(e={}){n(this,"createdAt",Date.now());n(this,"blocInstanceMap",new Map);n(this,"isolatedBlocMap",new Map);n(this,"isolatedBlocIndex",new Map);n(this,"uidRegistry",new Map);n(this,"keepAliveBlocs",new Set);n(this,"postChangesToDocument",!1);n(this,"log",(...e)=>{r.enableLog&&console.warn(`☢️ [Blac ${this.createdAt.toString()}]`,...e)});n(this,"warn",(e,...t)=>{r.enableLog&&console.warn(`🚨 [Blac ${String(r.instance.createdAt)}]`,e,...t)});n(this,"error",(e,...t)=>{r.enableLog&&console.error(`🚨 [Blac ${String(r.instance.createdAt)}]`,e,...t)});n(this,"resetInstance",()=>{this.log("Reset Blac instance");const e=new Map(this.blocInstanceMap),t=new Map(this.isolatedBlocMap);e.forEach(s=>{s._keepAlive||s._dispose()}),t.forEach(s=>{s.forEach(i=>{i._keepAlive||i._dispose()})}),this.blocInstanceMap.clear(),this.isolatedBlocMap.clear(),this.isolatedBlocIndex.clear(),u.resetInstance()});n(this,"disposeBloc",e=>{const t=e.constructor,s=this.createBlocInstanceMapKey(e._name,e._id);this.log(`[${e._name}:${String(e._id)}] disposeBloc called. Isolated: ${String(t.isolated)}`),t.isolated?(this.unregisterIsolatedBlocInstance(e),this.blocInstanceMap.delete(s)):this.unregisterBlocInstance(e),this.log("dispatched bloc",e)});n(this,"activateBloc",e=>{const t=e.constructor;(e.isIsolated?this.findIsolatedBlocInstance(t,e._id):this.findRegisteredBlocInstance(t,e._id))||(this.log(`[${e._name}:${String(e._id)}] activateBloc called. Isolated: ${String(e.isIsolated)}`),e.isIsolated?this.registerIsolatedBlocInstance(e):this.registerBlocInstance(e))});n(this,"getBloc",(e,t={})=>{const{id:s}=t,i=e,a=s??e.name;if(i.isolated){const c=this.findIsolatedBlocInstance(e,a);if(c)return this.log(`[${e.name}:${String(a)}] (getBloc) Found existing isolated instance.`,t),c;if(t.throwIfNotFound)throw new Error(`Isolated bloc ${e.name} not found`)}else{const c=this.findRegisteredBlocInstance(e,a);if(c)return this.log(`[${e.name}:${String(a)}] (getBloc) Found existing registered instance.`,t),c;if(t.throwIfNotFound)throw new Error(`Registered bloc ${e.name} not found`)}const o=this.createNewBlocInstance(e,a,t);return this.log(`[${e.name}:${String(a)}] (getBloc) No existing instance found. Creating new one.`,t,o),o});n(this,"getBlocOrThrow",(e,t={})=>{const s=e.isolated,i=t.id||e.name,a=s?this.findIsolatedBlocInstance(e,i):this.findRegisteredBlocInstance(e,i);if(a)return a;throw new Error(`Bloc ${e.name} not found`)});n(this,"getAllBlocs",(e,t={})=>{const s=[];if(this.blocInstanceMap.forEach(i=>{i.constructor===e&&s.push(i)}),t.searchIsolated!==!1){const i=this.isolatedBlocMap.get(e);i&&s.push(...i.map(a=>a))}return s});n(this,"disposeKeepAliveBlocs",e=>{const t=[];for(const s of this.keepAliveBlocs)(!e||s.constructor===e)&&t.push(s);t.forEach(s=>s._dispose())});n(this,"disposeBlocs",e=>{const t=[];for(const s of this.blocInstanceMap.values())e(s)&&t.push(s);for(const s of this.isolatedBlocMap.values())for(const i of s)e(i)&&t.push(i);t.forEach(s=>s._dispose())});n(this,"getMemoryStats",()=>({totalBlocs:this.uidRegistry.size,registeredBlocs:this.blocInstanceMap.size,isolatedBlocs:Array.from(this.isolatedBlocMap.values()).reduce((e,t)=>e+t.length,0),keepAliveBlocs:this.keepAliveBlocs.size,isolatedBlocTypes:this.isolatedBlocMap.size}));n(this,"validateConsumers",()=>{for(const e of this.uidRegistry.values())e._consumers.size===0&&!e._keepAlive&&setTimeout(()=>{e._consumers.size===0&&!e._keepAlive&&e._dispose()},1e3)});const{__unsafe_ignore_singleton:t=!1}=e;if(!t)return r.instance;u.setInstance(this)}static get instance(){return u.getInstance()}static get getAllBlocs(){return r.instance.getAllBlocs}static get log(){return r.instance.log}static getInstance(){return u.getInstance()}static get warn(){return r.instance.warn}static get error(){return r.instance.error}createBlocInstanceMapKey(e,t){return`${e}:${String(t)}`}unregisterBlocInstance(e){const t=this.createBlocInstanceMapKey(e._name,e._id);this.blocInstanceMap.delete(t),this.uidRegistry.delete(e.uid),this.keepAliveBlocs.delete(e)}registerBlocInstance(e){const t=this.createBlocInstanceMapKey(e._name,e._id);this.blocInstanceMap.set(t,e),this.uidRegistry.set(e.uid,e),e._keepAlive&&this.keepAliveBlocs.add(e)}findRegisteredBlocInstance(e,t){if(e.isolated)return;const i=this.createBlocInstanceMapKey(e.name,t);return this.blocInstanceMap.get(i)}registerIsolatedBlocInstance(e){const t=e.constructor,s=this.isolatedBlocMap.get(t);s?s.push(e):this.isolatedBlocMap.set(t,[e]),this.isolatedBlocIndex.set(e.uid,e),this.uidRegistry.set(e.uid,e),e._keepAlive&&this.keepAliveBlocs.add(e)}unregisterIsolatedBlocInstance(e){const t=e.constructor,s=this.isolatedBlocMap.get(t);if(s){const i=s.findIndex(a=>a.uid===e.uid);i!==-1&&s.splice(i,1),s.length===0&&this.isolatedBlocMap.delete(t)}this.isolatedBlocIndex.delete(e.uid),this.uidRegistry.delete(e.uid),this.keepAliveBlocs.delete(e)}findIsolatedBlocInstance(e,t){if(!e.isolated)return;const i=this.isolatedBlocMap.get(e);return i?i.find(o=>o._id===t):void 0}findIsolatedBlocInstanceByUid(e){return this.isolatedBlocIndex.get(e)}createNewBlocInstance(e,t,s={}){const{props:i,instanceRef:a}=s,o=new e(i);return o._instanceRef=a,o.props=i||null,o._updateId(t),o._setDisposalHandler(c=>this.disposeBloc(c)),o.isIsolated?(this.registerIsolatedBlocInstance(o),o):(this.registerBlocInstance(o),o)}static get activateBloc(){return r.instance.activateBloc}static get getBloc(){return r.instance.getBloc}static get getBlocOrThrow(){return r.instance.getBlocOrThrow}static get disposeKeepAliveBlocs(){return r.instance.disposeKeepAliveBlocs}static get disposeBlocs(){return r.instance.disposeBlocs}static get getMemoryStats(){return r.instance.getMemoryStats}static get validateConsumers(){return r.instance.validateConsumers}};n(r,"enableLog",!1),n(r,"resetInstance",()=>{u.resetInstance()});let l=r;class I{constructor(e){n(this,"bloc");n(this,"_observers",new Set);this.bloc=e}get size(){return this._observers.size}get observers(){return this._observers}subscribe(e){return l.log("BlacObservable.subscribe: Subscribing observer.",this.bloc,e),this._observers.add(e),e.lastState||(e.lastState=e.dependencyArray?e.dependencyArray(this.bloc.state):[]),()=>{l.log("BlacObservable.subscribe: Unsubscribing observer.",this.bloc,e),this.unsubscribe(e)}}unsubscribe(e){this._observers.delete(e),this.size===0&&(l.log("BlacObservable.unsubscribe: No observers left. Disposing bloc.",this.bloc),this.bloc._dispose())}notify(e,t,s){this._observers.forEach(i=>{let a=!1;if(i.dependencyArray){const o=i.lastState||[],c=i.dependencyArray(e);for(let f=0;f<c.length;f++){const _=c[f],v=o[f]||[];for(let g=0;g<_.length;g++)if(!Object.is(_[g],v[g])){a=!0;break}}i.lastState=c}else a=!0;a&&i.fn(e,t,s)})}clear(){this._observers.forEach(e=>{this.unsubscribe(e)}),this._observers.clear()}}class p{constructor(e){n(this,"uid",crypto.randomUUID());n(this,"defaultDependencySelector");n(this,"_isolated",!1);n(this,"_observer");n(this,"_id");n(this,"_instanceRef");n(this,"_keepAlive",!1);n(this,"_createdAt",Date.now());n(this,"_state");n(this,"_oldState");n(this,"props",null);n(this,"_updateId",e=>{const t=this._id;!e||e===t||(this._id=e)});n(this,"onDispose");n(this,"_consumers",new Set);n(this,"_consumerRefs",new WeakSet);n(this,"_addConsumer",(e,t)=>{this._consumers.has(e)||(this._consumers.add(e),t&&this._consumerRefs.add(t))});n(this,"_removeConsumer",e=>{this._consumers.has(e)&&(this._consumers.delete(e),this._consumers.size===0&&!this._keepAlive&&this._scheduleDisposal())});n(this,"_disposalHandler");n(this,"lastUpdate",Date.now());n(this,"_batchingEnabled",!1);n(this,"_pendingUpdates",[]);n(this,"_pushState",(e,t,s)=>{if(e===void 0){console.warn("BlocBase._pushState: newState is undefined",this);return}if(s!=null){const i=typeof s;["string","object","number"].includes(i)||console.warn("BlocBase._pushState: Invalid action type",this,s)}if(this._batchingEnabled){this._pendingUpdates.push({newState:e,oldState:t,action:s});return}this._oldState=t,this._state=e,this._observer.notify(e,t,s),this.lastUpdate=Date.now()});n(this,"batch",e=>{const t=this._batchingEnabled;this._batchingEnabled=!0;try{const s=e();if(this._pendingUpdates.length>0){const i=this._pendingUpdates[this._pendingUpdates.length-1];this._oldState=this._pendingUpdates[0].oldState,this._state=i.newState,this._observer.notify(i.newState,this._oldState,i.action),this.lastUpdate=Date.now(),this._pendingUpdates=[]}return s}finally{this._batchingEnabled=t}});this._state=e,this._observer=new I(this),this._id=this.constructor.name;const t=this.constructor;this._keepAlive=typeof t.keepAlive=="boolean"?t.keepAlive:!1,this._isolated=typeof t.isolated=="boolean"?t.isolated:!1}get isIsolated(){return this._isolated}get isKeepAlive(){return this._keepAlive}get state(){return this._state}get _name(){return this.constructor.name}_dispose(){var e;this._consumers.clear(),this._observer.clear(),(e=this.onDispose)==null||e.call(this)}_setDisposalHandler(e){this._disposalHandler=e}_scheduleDisposal(){setTimeout(()=>{this._consumers.size===0&&!this._keepAlive&&(this._disposalHandler?this._disposalHandler(this):this._dispose())},0)}}n(p,"isolated",!1),n(p,"keepAlive",!1);class b extends p{constructor(){super(...arguments);n(this,"eventHandlers",new Map);n(this,"add",async t=>{const s=t.constructor,i=this.eventHandlers.get(s);if(i){const a=o=>{const c=this.state;this._pushState(o,c,t)};try{await i(t,a)}catch(o){l.error(`[Bloc ${this._name}:${String(this._id)}] Error in event handler for '${s.name}':`,o,"Action:",t)}}else{const a=t.constructor.name||"UnnamedConstructor";l.warn(`[Bloc ${this._name}:${String(this._id)}] No handler registered for action type: '${a}'. Action was:`,t)}})}on(t,s){this.eventHandlers.has(t)&&l.warn(`[Bloc ${this._name}:${String(this._id)}] Handler for event '${t.name}' already registered. It will be overwritten.`),this.eventHandlers.set(t,s)}}class A extends p{emit(e){if(Object.is(e,this.state))return;const t=this.state,s=e;this._pushState(s,t)}patch(e,t=!1){if(typeof this.state!="object"||this.state===null){l.warn("Cubit.patch: was called on a cubit where the state is not an object. This is a no-op.");return}let s=!1;if(t)s=!0;else for(const i in e)if(Object.prototype.hasOwnProperty.call(e,i)){const o=this.state[i];if(!Object.is(e[i],o)){s=!0;break}}s&&this.emit({...this.state,...e})}}exports.Blac=l;exports.BlacObservable=I;exports.Bloc=b;exports.BlocBase=p;exports.Cubit=A;exports.setBlacInstanceManager=m;
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/Blac.ts","../src/BlacObserver.ts","../src/BlocBase.ts","../src/Bloc.ts","../src/Cubit.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n// TODO: Remove this eslint disable once any types are properly replaced\nimport { BlocBase, BlocInstanceId } from \"./BlocBase\";\nimport {\n BlocBaseAbstract,\n BlocConstructor,\n BlocHookDependencyArrayFn,\n BlocState,\n InferPropsFromGeneric\n} from \"./types\";\n\n/**\n * Configuration options for the Blac instance\n */\nexport interface BlacConfig {\n /** Whether to expose the Blac instance globally */\n exposeBlacInstance?: boolean;\n}\n\nexport interface GetBlocOptions<B extends BlocBase<unknown>> {\n id?: string;\n selector?: BlocHookDependencyArrayFn<BlocState<B>>;\n props?: InferPropsFromGeneric<B>;\n onMount?: (bloc: B) => void;\n instanceRef?: string;\n throwIfNotFound?: boolean;\n}\n\n/**\n * Interface for Blac instance management\n */\nexport interface BlacInstanceManager {\n getInstance(): Blac;\n setInstance(instance: Blac): void;\n resetInstance(): void;\n}\n\n/**\n * Default singleton implementation of BlacInstanceManager\n */\nclass SingletonBlacManager implements BlacInstanceManager {\n private static _instance: Blac;\n\n getInstance(): Blac {\n if (!SingletonBlacManager._instance) {\n SingletonBlacManager._instance = new Blac({ __unsafe_ignore_singleton: true });\n }\n return SingletonBlacManager._instance;\n }\n\n setInstance(instance: Blac): void {\n SingletonBlacManager._instance = instance;\n }\n\n resetInstance(): void {\n const oldInstance = SingletonBlacManager._instance;\n SingletonBlacManager._instance = new Blac({ __unsafe_ignore_singleton: true });\n \n // Transfer any keep-alive blocs to the new instance\n for (const bloc of oldInstance.keepAliveBlocs) {\n SingletonBlacManager._instance.keepAliveBlocs.add(bloc);\n SingletonBlacManager._instance.uidRegistry.set(bloc.uid, bloc);\n }\n }\n}\n\n/**\n * Global instance manager (can be replaced for testing or different patterns)\n */\nlet instanceManager: BlacInstanceManager = new SingletonBlacManager();\n\n/**\n * Sets a custom instance manager (useful for testing or advanced patterns)\n */\nexport function setBlacInstanceManager(manager: BlacInstanceManager): void {\n instanceManager = manager;\n}\n\n/**\n * Main Blac class that manages the state management system.\n * Can work with singleton pattern or dependency injection.\n * Handles bloc lifecycle, and instance tracking.\n * \n * Key responsibilities:\n * - Managing bloc instances (creation, disposal, lookup)\n * - Handling isolated and non-isolated blocs\n * - Providing logging and debugging capabilities\n */\nexport class Blac {\n /** @deprecated Use getInstance() instead */\n static get instance(): Blac {\n return instanceManager.getInstance();\n }\n /** Timestamp when the instance was created */\n createdAt = Date.now();\n static get getAllBlocs() {\n return Blac.instance.getAllBlocs;\n }\n /** Map storing all registered bloc instances by their class name and ID */\n blocInstanceMap: Map<string, BlocBase<unknown>> = new Map();\n /** Map storing isolated bloc instances grouped by their constructor */\n isolatedBlocMap: Map<BlocConstructor<unknown>, BlocBase<unknown>[]> = new Map();\n /** Map for O(1) lookup of isolated blocs by UID */\n private isolatedBlocIndex: Map<string, BlocBase<unknown>> = new Map();\n /** Map tracking UIDs to prevent memory leaks */\n uidRegistry: Map<string, BlocBase<unknown>> = new Map();\n /** Set of keep-alive blocs for controlled cleanup */\n keepAliveBlocs: Set<BlocBase<unknown>> = new Set();\n /** Flag to control whether changes should be posted to document */\n postChangesToDocument = false;\n\n /**\n * Creates a new Blac instance.\n * @param options - Configuration options including singleton control\n */\n constructor(options: { __unsafe_ignore_singleton?: boolean } = {}) {\n const { __unsafe_ignore_singleton = false } = options;\n if (!__unsafe_ignore_singleton) {\n return Blac.instance;\n }\n instanceManager.setInstance(this);\n }\n\n /** Flag to enable/disable logging */\n static enableLog = false;\n\n /**\n * Logs messages to console when logging is enabled\n * @param args - Arguments to log\n */\n log = (...args: unknown[]) => {\n if (Blac.enableLog) console.warn(`☢️ [Blac ${this.createdAt.toString()}]`, ...args);\n };\n static get log() { return Blac.instance.log; }\n\n /**\n * Gets the current Blac instance\n * @returns The Blac instance\n */\n static getInstance(): Blac {\n return instanceManager.getInstance();\n }\n\n\n /**\n * Logs a warning message\n * @param message - Warning message\n * @param args - Additional arguments\n */\n warn = (message: string, ...args: unknown[]) => {\n if (Blac.enableLog) {\n console.warn(`🚨 [Blac ${String(Blac.instance.createdAt)}]`, message, ...args);\n }\n };\n static get warn() { return Blac.instance.warn; }\n /**\n * Logs an error message\n * @param message - Error message\n * @param args - Additional arguments\n */\n error = (message: string, ...args: unknown[]) => {\n if (Blac.enableLog) {\n console.error(`🚨 [Blac ${String(Blac.instance.createdAt)}]`, message, ...args);\n }\n };\n static get error() { return Blac.instance.error; }\n\n /**\n * Resets the Blac instance to a new one, disposing non-keepAlive blocs\n * from the old instance.\n */\n resetInstance = (): void => {\n this.log(\"Reset Blac instance\");\n\n // Dispose non-keepAlive blocs from the current instance\n const oldBlocInstanceMap = new Map(this.blocInstanceMap);\n const oldIsolatedBlocMap = new Map(this.isolatedBlocMap);\n\n oldBlocInstanceMap.forEach((bloc) => {\n if (!bloc._keepAlive) {\n bloc._dispose();\n }\n });\n\n oldIsolatedBlocMap.forEach((blocArray) => {\n blocArray.forEach((bloc) => {\n if (!bloc._keepAlive) {\n bloc._dispose();\n }\n });\n });\n\n this.blocInstanceMap.clear();\n this.isolatedBlocMap.clear();\n this.isolatedBlocIndex.clear();\n\n // Use instance manager to reset\n instanceManager.resetInstance();\n }\n static resetInstance = (): void => {\n instanceManager.resetInstance();\n };\n\n /**\n * Disposes of a bloc instance by removing it from the appropriate registry\n * @param bloc - The bloc instance to dispose\n */\n disposeBloc = (bloc: BlocBase<unknown>): void => {\n const base = bloc.constructor as unknown as BlocBaseAbstract;\n const key = this.createBlocInstanceMapKey(bloc._name, bloc._id);\n this.log(`[${bloc._name}:${String(bloc._id)}] disposeBloc called. Isolated: ${String(base.isolated)}`);\n\n if (base.isolated) {\n this.unregisterIsolatedBlocInstance(bloc);\n this.blocInstanceMap.delete(key);\n } else {\n this.unregisterBlocInstance(bloc);\n }\n this.log('dispatched bloc', bloc)\n };\n\n /**\n * Creates a unique key for a bloc instance in the map based on the bloc class name and instance ID\n * @param blocClassName - The name of the bloc class\n * @param id - The instance ID\n * @returns A unique key string in the format \"className:id\"\n */\n createBlocInstanceMapKey(blocClassName: string, id: BlocInstanceId): string {\n return `${blocClassName}:${String(id)}`;\n }\n\n /**\n * Unregister a bloc instance from the main registry\n * @param bloc - The bloc instance to unregister\n */\n unregisterBlocInstance(bloc: BlocBase<unknown>): void {\n const key = this.createBlocInstanceMapKey(bloc._name, bloc._id);\n this.blocInstanceMap.delete(key);\n \n // Clean up UID tracking\n this.uidRegistry.delete(bloc.uid);\n \n // Remove from keep-alive set\n this.keepAliveBlocs.delete(bloc);\n }\n\n /**\n * Registers a bloc instance in the main registry\n * @param bloc - The bloc instance to register\n */\n registerBlocInstance(bloc: BlocBase<unknown>): void {\n const key = this.createBlocInstanceMapKey(bloc._name, bloc._id);\n this.blocInstanceMap.set(key, bloc);\n \n // Track UID for cleanup\n this.uidRegistry.set(bloc.uid, bloc);\n \n // Track keep-alive blocs\n if (bloc._keepAlive) {\n this.keepAliveBlocs.add(bloc);\n }\n }\n\n /**\n * Finds a registered bloc instance by its class and ID\n * @param blocClass - The bloc class to search for\n * @param id - The instance ID\n * @returns The found bloc instance or undefined if not found\n */\n findRegisteredBlocInstance<B extends BlocConstructor<unknown>>(\n blocClass: B,\n id: BlocInstanceId,\n ): InstanceType<B> | undefined {\n const base = blocClass as unknown as BlocBaseAbstract;\n if (base.isolated) return undefined;\n\n const key = this.createBlocInstanceMapKey(blocClass.name, id);\n const found = this.blocInstanceMap.get(key) as InstanceType<B> | undefined;\n return found\n }\n\n /**\n * Registers an isolated bloc instance in the isolated registry\n * @param bloc - The isolated bloc instance to register\n */\n registerIsolatedBlocInstance(bloc: BlocBase<unknown>): void {\n const blocClass = bloc.constructor as BlocConstructor<unknown>;\n const blocs = this.isolatedBlocMap.get(blocClass);\n if (blocs) {\n blocs.push(bloc);\n } else {\n this.isolatedBlocMap.set(blocClass, [bloc]);\n }\n \n // Add to isolated index for O(1) lookups\n this.isolatedBlocIndex.set(bloc.uid, bloc);\n \n // Track UID for cleanup\n this.uidRegistry.set(bloc.uid, bloc);\n \n // Track keep-alive blocs\n if (bloc._keepAlive) {\n this.keepAliveBlocs.add(bloc);\n }\n }\n\n /**\n * Unregister an isolated bloc instance from the isolated registry\n * @param bloc - The isolated bloc instance to unregister\n */\n unregisterIsolatedBlocInstance(bloc: BlocBase<unknown>): void {\n const blocClass = bloc.constructor;\n const blocs = this.isolatedBlocMap.get(blocClass as BlocConstructor<unknown>);\n if (blocs) {\n const index = blocs.findIndex((b) => b.uid === bloc.uid);\n if (index !== -1) {\n blocs.splice(index, 1);\n }\n\n if (blocs.length === 0) {\n this.isolatedBlocMap.delete(blocClass as BlocConstructor<unknown>);\n }\n }\n \n // Remove from isolated index\n this.isolatedBlocIndex.delete(bloc.uid);\n \n // Clean up UID tracking\n this.uidRegistry.delete(bloc.uid);\n \n // Remove from keep-alive set\n this.keepAliveBlocs.delete(bloc);\n }\n\n /**\n * Finds an isolated bloc instance by its class and ID (O(n) lookup)\n */\n findIsolatedBlocInstance<B extends BlocConstructor<unknown>>(\n blocClass: B,\n id: BlocInstanceId,\n ): InstanceType<B> | undefined {\n const base = blocClass as unknown as BlocBaseAbstract;\n if (!base.isolated) return undefined;\n\n const blocs = this.isolatedBlocMap.get(blocClass);\n if (!blocs) {\n return undefined;\n }\n // Find the specific bloc by ID within the isolated array\n const found = blocs.find((b) => b._id === id) as InstanceType<B> | undefined;\n return found;\n }\n\n /**\n * Finds an isolated bloc instance by UID (O(1) lookup)\n */\n findIsolatedBlocInstanceByUid<B extends BlocBase<unknown>>(\n uid: string\n ): B | undefined {\n return this.isolatedBlocIndex.get(uid) as B | undefined;\n }\n\n /**\n * Creates a new bloc instance and registers it in the appropriate registry\n * @param blocClass - The bloc class to instantiate\n * @param id - The instance ID\n * @param props - Properties to pass to the bloc constructor\n * @param instanceRef - Optional reference string for the instance\n * @returns The newly created bloc instance\n */\n createNewBlocInstance<B extends BlocConstructor<BlocBase<unknown>>>(\n blocClass: B,\n id: BlocInstanceId,\n options: GetBlocOptions<InstanceType<B>> = {},\n ): InstanceType<B> {\n const { props, instanceRef } = options;\n const newBloc = new blocClass(props as never) as InstanceType<BlocConstructor<BlocBase<unknown>>>;\n newBloc._instanceRef = instanceRef;\n newBloc.props = props || null;\n newBloc._updateId(id);\n\n // Set up disposal handler to break circular dependency\n newBloc._setDisposalHandler((bloc) => this.disposeBloc(bloc));\n\n if (newBloc.isIsolated) {\n this.registerIsolatedBlocInstance(newBloc);\n return newBloc as InstanceType<B>;\n }\n\n this.registerBlocInstance(newBloc);\n return newBloc as InstanceType<B>;\n }\n\n\n activateBloc = (bloc: BlocBase<unknown>): void => {\n const base = bloc.constructor as unknown as BlocConstructor<BlocBase<unknown>>;\n const isIsolated = bloc.isIsolated;\n\n let found = isIsolated ? this.findIsolatedBlocInstance(base, bloc._id) : this.findRegisteredBlocInstance(base, bloc._id);\n if (found) {\n return;\n }\n\n this.log(`[${bloc._name}:${String(bloc._id)}] activateBloc called. Isolated: ${String(bloc.isIsolated)}`);\n if (bloc.isIsolated) {\n this.registerIsolatedBlocInstance(bloc);\n } else {\n this.registerBlocInstance(bloc);\n }\n };\n static get activateBloc() { return Blac.instance.activateBloc; }\n\n /**\n * Gets or creates a bloc instance based on the provided class and options.\n * If a bloc with the given ID exists, it will be returned. Otherwise, a new instance will be created.\n * \n * @param blocClass - The bloc class to get or create\n * @param options - Options including:\n * - id: The instance ID (defaults to class name if not provided)\n * - props: Properties to pass to the bloc constructor\n * - instanceRef: Optional reference string for the instance\n * @returns The bloc instance\n */\n getBloc = <B extends BlocConstructor<BlocBase<unknown>>>(\n blocClass: B,\n options: GetBlocOptions<InstanceType<B>> = {},\n ): InstanceType<B> => {\n const { id } = options;\n const base = blocClass as unknown as BlocBaseAbstract;\n const blocId = id ?? blocClass.name;\n\n\n if (base.isolated) {\n const isolatedBloc = this.findIsolatedBlocInstance<B>(blocClass, blocId)\n if (isolatedBloc) {\n this.log(`[${blocClass.name}:${String(blocId)}] (getBloc) Found existing isolated instance.`, options);\n return isolatedBloc;\n } else {\n if (options.throwIfNotFound) {\n throw new Error(`Isolated bloc ${blocClass.name} not found`);\n }\n }\n } else {\n const registeredBloc = this.findRegisteredBlocInstance(blocClass, blocId)\n if (registeredBloc) {\n this.log(`[${blocClass.name}:${String(blocId)}] (getBloc) Found existing registered instance.`, options);\n return registeredBloc\n } else {\n if (options.throwIfNotFound) {\n throw new Error(`Registered bloc ${blocClass.name} not found`);\n }\n }\n }\n\n const bloc = this.createNewBlocInstance(\n blocClass,\n blocId,\n options,\n );\n this.log(`[${blocClass.name}:${String(blocId)}] (getBloc) No existing instance found. Creating new one.`, options, bloc);\n return bloc;\n };\n static get getBloc() { return Blac.instance.getBloc; }\n\n /**\n * Gets a bloc instance or throws an error if it doesn't exist\n * @param blocClass - The bloc class to get\n * @param options - Options including:\n * - id: The instance ID (defaults to class name if not provided)\n * - props: Properties to pass to the bloc constructor\n * - instanceRef: Optional reference string for the instance\n */\n getBlocOrThrow = <B extends BlocConstructor<unknown>>(\n blocClass: B,\n options: {\n id?: BlocInstanceId;\n props?: InferPropsFromGeneric<B>;\n instanceRef?: string;\n } = {},\n ): InstanceType<B> => {\n const isIsolated = (blocClass as unknown as BlocBaseAbstract).isolated;\n const id = options.id || blocClass.name;\n\n const registered = isIsolated\n ? this.findIsolatedBlocInstance(blocClass, id)\n : this.findRegisteredBlocInstance(blocClass, id);\n\n if (registered) {\n return registered;\n }\n throw new Error(`Bloc ${blocClass.name} not found`);\n };\n static get getBlocOrThrow() { return Blac.instance.getBlocOrThrow; }\n\n /**\n * Gets all instances of a specific bloc class\n * @param blocClass - The bloc class to search for\n * @param options - Options including:\n * - searchIsolated: Whether to search in isolated blocs (defaults to bloc's isolated property)\n * @returns Array of matching bloc instances\n */\n getAllBlocs = <B extends BlocConstructor<unknown>>(\n blocClass: B,\n options: {\n searchIsolated?: boolean;\n } = {},\n ): InstanceType<B>[] => {\n const results: InstanceType<B>[] = [];\n // const blocClassName = (blocClass as any).name; // Temporarily removed for debugging\n\n // Search non-isolated blocs\n this.blocInstanceMap.forEach((blocInstance) => {\n if (blocInstance.constructor === blocClass) { // Strict constructor check\n results.push(blocInstance as InstanceType<B>);\n }\n });\n\n // Optionally search isolated blocs\n if (options.searchIsolated !== false) {\n const isolatedBlocs = this.isolatedBlocMap.get(blocClass);\n if (isolatedBlocs) {\n results.push(...isolatedBlocs.map(bloc => bloc as InstanceType<B>));\n }\n }\n\n return results;\n };\n\n /**\n * Disposes all keep-alive blocs of a specific type\n * @param blocClass - The bloc class to dispose\n */\n disposeKeepAliveBlocs = <B extends BlocConstructor<unknown>>(\n blocClass?: B\n ): void => {\n const toDispose: BlocBase<unknown>[] = [];\n \n for (const bloc of this.keepAliveBlocs) {\n if (!blocClass || bloc.constructor === blocClass) {\n toDispose.push(bloc);\n }\n }\n \n toDispose.forEach(bloc => bloc._dispose());\n };\n static get disposeKeepAliveBlocs() { return Blac.instance.disposeKeepAliveBlocs; }\n\n /**\n * Disposes all blocs matching a pattern\n * @param predicate - Function to test each bloc for disposal\n */\n disposeBlocs = (predicate: (bloc: BlocBase<unknown>) => boolean): void => {\n const toDispose: BlocBase<unknown>[] = [];\n \n // Check registered blocs\n for (const bloc of this.blocInstanceMap.values()) {\n if (predicate(bloc)) {\n toDispose.push(bloc);\n }\n }\n \n // Check isolated blocs\n for (const blocs of this.isolatedBlocMap.values()) {\n for (const bloc of blocs) {\n if (predicate(bloc)) {\n toDispose.push(bloc);\n }\n }\n }\n \n toDispose.forEach(bloc => bloc._dispose());\n };\n static get disposeBlocs() { return Blac.instance.disposeBlocs; }\n\n /**\n * Gets memory usage statistics for debugging\n */\n getMemoryStats = () => {\n return {\n totalBlocs: this.uidRegistry.size,\n registeredBlocs: this.blocInstanceMap.size,\n isolatedBlocs: Array.from(this.isolatedBlocMap.values()).reduce((sum, arr) => sum + arr.length, 0),\n keepAliveBlocs: this.keepAliveBlocs.size,\n isolatedBlocTypes: this.isolatedBlocMap.size,\n };\n };\n static get getMemoryStats() { return Blac.instance.getMemoryStats; }\n\n /**\n * Validates consumer references and cleans up orphaned consumers\n */\n validateConsumers = (): void => {\n for (const bloc of this.uidRegistry.values()) {\n // This would need to be called periodically to clean up orphaned consumers\n // Implementation depends on how we want to handle consumer validation\n if (bloc._consumers.size === 0 && !bloc._keepAlive) {\n // Schedule disposal for blocs with no consumers\n setTimeout(() => {\n if (bloc._consumers.size === 0 && !bloc._keepAlive) {\n bloc._dispose();\n }\n }, 1000); // Give a grace period\n }\n }\n };\n static get validateConsumers() { return Blac.instance.validateConsumers; }\n}\n","import { Blac } from './Blac';\nimport { BlocBase } from './BlocBase';\nimport { BlocHookDependencyArrayFn } from './types';\n\n/**\n * Represents an observer that can subscribe to state changes in a Bloc\n * @template S - The type of state being observed\n */\nexport type BlacObserver<S> = {\n /** Function to be called when state changes */\n fn: (newState: S, oldState: S, action?: unknown) => void | Promise<void>;\n /** Optional function to determine if the observer should be notified of state changes */\n dependencyArray?: BlocHookDependencyArrayFn<S>;\n /** Dispose function for the observer */\n dispose?: () => void;\n /** Cached state values used for dependency comparison */\n lastState?: unknown[][];\n /** Unique identifier for the observer */\n id: string;\n};\n\n/**\n * A class that manages observers for a Bloc's state changes\n * @template S - The type of state being observed\n */\nexport class BlacObservable<S = unknown> {\n /** The Bloc instance this observable is associated with */\n bloc: BlocBase<S>;\n\n /**\n * Creates a new BlacObservable instance\n * @param bloc - The Bloc instance to observe\n */\n constructor(bloc: BlocBase<S>) {\n this.bloc = bloc;\n }\n\n private _observers = new Set<BlacObserver<S>>();\n\n /**\n * Gets the number of active observers\n * @returns The number of observers currently subscribed\n */\n get size(): number {\n return this._observers.size;\n }\n\n /**\n * Gets the set of all observers\n * @returns The Set of all BlacObserver instances\n */\n get observers() {\n return this._observers;\n }\n\n /**\n * Subscribes an observer to state changes\n * @param observer - The observer to subscribe\n * @returns A function that can be called to unsubscribe the observer\n */\n subscribe(observer: BlacObserver<S>): () => void {\n Blac.log('BlacObservable.subscribe: Subscribing observer.', this.bloc, observer);\n this._observers.add(observer);\n // Blac.instance.dispatchEvent(BlacLifecycleEvent.LISTENER_ADDED, this.bloc, { listenerId: observer.id });\n if (!observer.lastState) {\n observer.lastState = observer.dependencyArray\n ? observer.dependencyArray(this.bloc.state)\n : [];\n }\n return () => {\n Blac.log('BlacObservable.subscribe: Unsubscribing observer.', this.bloc, observer);\n this.unsubscribe(observer);\n }\n }\n\n /**\n * Unsubscribes an observer from state changes\n * @param observer - The observer to unsubscribe\n */\n unsubscribe(observer: BlacObserver<S>) {\n this._observers.delete(observer);\n // Blac.instance.dispatchEvent(BlacLifecycleEvent.LISTENER_REMOVED, this.bloc, { listenerId: observer.id });\n\n if (this.size === 0) {\n Blac.log('BlacObservable.unsubscribe: No observers left. Disposing bloc.', this.bloc);\n this.bloc._dispose();\n }\n }\n\n /**\n * Notifies all observers of a state change\n * @param newState - The new state value\n * @param oldState - The previous state value\n * @param action - Optional action that triggered the state change\n */\n notify(newState: S, oldState: S, action?: unknown) {\n this._observers.forEach((observer) => {\n let shouldUpdate = false;\n\n if (observer.dependencyArray) {\n const lastDependencyCheck = observer.lastState || [];\n const newDependencyCheck = observer.dependencyArray(newState);\n\n for (let o = 0; o < newDependencyCheck.length; o++) {\n const partNew = newDependencyCheck[o];\n const partOld = lastDependencyCheck[o] || [];\n for (let i = 0; i < partNew.length; i++) {\n if (!Object.is(partNew[i], partOld[i])) {\n shouldUpdate = true;\n break;\n }\n }\n }\n\n observer.lastState = newDependencyCheck;\n } else {\n shouldUpdate = true;\n }\n\n if (shouldUpdate) {\n void observer.fn(newState, oldState, action);\n }\n });\n }\n\n /**\n * Clears the observer set\n */\n clear() {\n this._observers.forEach((observer) => {\n this.unsubscribe(observer);\n });\n this._observers.clear();\n }\n}\n","import { BlacObservable } from './BlacObserver';\nimport { BlocConstructor } from './types';\n\nexport type BlocInstanceId = string | number | undefined;\ntype DependencySelector<S> = (newState: S) => unknown[][];\n\n// Define an interface for the static properties expected on a Bloc/Cubit constructor\ninterface BlocStaticProperties {\n isolated: boolean;\n keepAlive: boolean;\n}\n\n/**\n * Base class for both Blocs and Cubits that provides core state management functionality.\n * Handles state transitions, observer notifications, lifecycle management, and addon integration.\n * \n * @abstract This class should be extended, not instantiated directly\n * @template S The type of state managed by this Bloc\n * @template P The type of props that can be passed during instance creation (optional)\n */\nexport abstract class BlocBase<\n S,\n P = unknown\n> {\n public uid = crypto.randomUUID();\n /**\n * When true, every consumer will receive its own unique instance of this Bloc.\n * Use this when state should not be shared between components.\n * @default false\n */\n static isolated = false;\n get isIsolated() {\n return this._isolated;\n }\n \n /**\n * When true, the Bloc instance persists even when there are no active consumers.\n * Useful for maintaining state between component unmount/remount cycles.\n * @default false\n */\n static keepAlive = false;\n get isKeepAlive() {\n return this._keepAlive;\n }\n \n /**\n * Defines how dependencies are selected from the state for efficient updates.\n * When provided, observers will only be notified when selected dependencies change.\n */\n defaultDependencySelector: DependencySelector<S> | undefined;\n \n /**\n * @internal\n * Indicates if this specific Bloc instance is isolated from others of the same type.\n */\n public _isolated = false;\n \n /**\n * @internal\n * Observable responsible for managing state listeners and notifying consumers.\n */\n public _observer: BlacObservable<S>;\n \n /**\n * The unique identifier for this Bloc instance.\n * Defaults to the class name, but can be customized.\n */\n public _id: BlocInstanceId;\n \n /**\n * @internal\n * Reference string used internally for tracking and debugging.\n */\n public _instanceRef?: string;\n \n /**\n * @internal\n * Indicates if this specific Bloc instance should be kept alive when no consumers are present.\n */\n public _keepAlive = false;\n \n /**\n * @readonly\n * Timestamp when this Bloc instance was created, useful for debugging and performance tracking.\n */\n public readonly _createdAt = Date.now();\n\n /**\n * @internal\n * The current state of the Bloc.\n */\n public _state: S;\n \n /**\n * @internal\n * The previous state of the Bloc, maintained for comparison and history.\n */\n public _oldState: S | undefined;\n \n /**\n * Props passed during Bloc instance creation.\n * Can be used to configure or parameterize the Bloc's behavior.\n */\n public props: P | null = null;\n\n /**\n * Creates a new BlocBase instance with the given initial state.\n * Sets up the observer, registers with the Blac manager, and initializes addons.\n * \n * @param initialState The initial state value for this Bloc\n */\n constructor(initialState: S) {\n this._state = initialState;\n this._observer = new BlacObservable(this);\n this._id = this.constructor.name;\n\n // Access static properties safely with proper type checking\n const Constructor = this.constructor as typeof BlocBase & BlocStaticProperties;\n \n // Validate that the static properties exist and are boolean\n this._keepAlive = typeof Constructor.keepAlive === 'boolean' ? Constructor.keepAlive : false;\n this._isolated = typeof Constructor.isolated === 'boolean' ? Constructor.isolated : false;\n }\n\n /**\n * Returns the current state of the Bloc.\n * Use this getter to access the state in a read-only manner.\n */\n get state(): S {\n return this._state;\n }\n\n /**\n * @internal\n * Returns the name of the Bloc class for identification and debugging.\n */\n get _name() {\n return this.constructor.name;\n }\n\n /**\n * @internal\n * Updates the Bloc instance's ID to a new value.\n * Only updates if the new ID is defined and different from the current one.\n * \n * @param id The new ID to assign to this Bloc instance\n */\n _updateId = (id?: BlocInstanceId) => {\n const originalId = this._id;\n if (!id || id === originalId) return;\n this._id = id;\n };\n\n /**\n * @internal\n * Cleans up resources and removes this Bloc from the system.\n * Notifies the Blac manager and clears all observers.\n */\n _dispose() {\n // Clear all consumers\n this._consumers.clear();\n \n // Clear observer subscriptions\n this._observer.clear();\n \n // Call user-defined disposal hook\n this.onDispose?.();\n \n // The Blac manager will handle removal from registry\n // This method is called by Blac.disposeBloc, so we don't need to call it again\n }\n\n /**\n * @internal\n * Optional function to be called when the Bloc is disposed.\n */\n onDispose?: () => void;\n\n /**\n * @internal\n * Set of consumer IDs currently listening to this Bloc's state changes.\n */\n _consumers = new Set<string>();\n\n /**\n * @internal\n * WeakSet to track consumer references for cleanup validation\n */\n private _consumerRefs = new WeakSet<object>();\n\n /**\n * @internal\n * Registers a new consumer to this Bloc instance.\n * Notifies the Blac manager that a consumer has been added.\n * \n * @param consumerId The unique ID of the consumer being added\n * @param consumerRef Optional reference to the consumer object for cleanup validation\n */\n _addConsumer = (consumerId: string, consumerRef?: object) => {\n if (this._consumers.has(consumerId)) return;\n this._consumers.add(consumerId);\n \n if (consumerRef) {\n this._consumerRefs.add(consumerRef);\n }\n \n // this._blac.dispatchEvent(BlacLifecycleEvent.BLOC_CONSUMER_ADDED, this, { consumerId });\n };\n\n /**\n * @internal\n * Unregisters a consumer from this Bloc instance.\n * Notifies the Blac manager that a consumer has been removed.\n * \n * @param consumerId The unique ID of the consumer being removed\n */\n _removeConsumer = (consumerId: string) => {\n if (!this._consumers.has(consumerId)) return;\n this._consumers.delete(consumerId);\n // this._blac.dispatchEvent(BlacLifecycleEvent.BLOC_CONSUMER_REMOVED, this, { consumerId });\n \n // If no consumers remain and not keep-alive, schedule disposal\n if (this._consumers.size === 0 && !this._keepAlive) {\n this._scheduleDisposal();\n }\n };\n\n /**\n * @internal\n * Handler function for disposal (can be set by Blac manager)\n */\n private _disposalHandler?: (bloc: BlocBase<unknown>) => void;\n\n /**\n * @internal\n * Sets the disposal handler for this bloc\n */\n _setDisposalHandler(handler: (bloc: BlocBase<unknown>) => void) {\n this._disposalHandler = handler;\n }\n\n /**\n * @internal\n * Schedules disposal of this bloc instance if it has no consumers\n */\n private _scheduleDisposal() {\n // Use setTimeout to avoid disposal during render cycles\n setTimeout(() => {\n if (this._consumers.size === 0 && !this._keepAlive) {\n if (this._disposalHandler) {\n this._disposalHandler(this as any);\n } else {\n this._dispose();\n }\n }\n }, 0);\n }\n\n lastUpdate = Date.now();\n\n /**\n * @internal\n * Flag to indicate if batching is enabled for this bloc\n */\n private _batchingEnabled = false;\n\n /**\n * @internal\n * Pending state updates when batching is enabled\n */\n private _pendingUpdates: Array<{newState: S, oldState: S, action?: unknown}> = [];\n\n /**\n * @internal\n * Updates the state and notifies all observers of the change.\n * \n * @param newState The new state to be set\n * @param oldState The previous state for comparison\n * @param action Optional metadata about what caused the state change\n */\n _pushState = (newState: S, oldState: S, action?: unknown): void => {\n // Runtime validation for state changes\n if (newState === undefined) {\n console.warn('BlocBase._pushState: newState is undefined', this);\n return;\n }\n \n // Validate action type if provided\n if (action !== undefined && action !== null) {\n const actionType = typeof action;\n if (!(['string', 'object', 'number'].includes(actionType))) {\n console.warn('BlocBase._pushState: Invalid action type', this, action);\n }\n }\n\n // If batching is enabled, queue the update\n if (this._batchingEnabled) {\n this._pendingUpdates.push({ newState, oldState, action });\n return;\n }\n \n this._oldState = oldState;\n this._state = newState;\n this._observer.notify(newState, oldState, action);\n this.lastUpdate = Date.now();\n };\n\n /**\n * Enables batching for multiple state updates\n * @param batchFn Function to execute with batching enabled\n */\n batch = <T>(batchFn: () => T): T => {\n const wasBatching = this._batchingEnabled;\n this._batchingEnabled = true;\n \n try {\n const result = batchFn();\n \n // Process all pending updates\n if (this._pendingUpdates.length > 0) {\n const lastUpdate = this._pendingUpdates[this._pendingUpdates.length - 1];\n this._oldState = this._pendingUpdates[0].oldState;\n this._state = lastUpdate.newState;\n \n // Notify with the final state\n this._observer.notify(lastUpdate.newState, this._oldState, lastUpdate.action);\n this.lastUpdate = Date.now();\n \n this._pendingUpdates = [];\n }\n \n return result;\n } finally {\n this._batchingEnabled = wasBatching;\n }\n };\n}\n","import { Blac } from './Blac';\nimport { BlocBase } from './BlocBase';\n\n// A should be the base type for all events this Bloc handles and must be an object type\n// to access action.constructor. Events are typically class instances.\n// P is for props, changed from any to unknown.\nexport abstract class Bloc<\n S, // State type\n A extends object, // Base Action/Event type, constrained to object\n P = unknown // Props type\n> extends BlocBase<S, P> {\n // Stores handlers: Map<EventConstructor (subtype of A), HandlerFunction>\n // The handler's event parameter will be correctly typed to the specific EventConstructor\n // by the 'on' method's signature.\n readonly eventHandlers: Map<\n // Key: Constructor of a specific event E (where E extends A)\n // Using 'any[]' for constructor arguments for broader compatibility.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]) => A,\n // Value: Handler function. 'event: A' is used here for the stored function type.\n // The 'on' method ensures the specific handler (event: E) is correctly typed.\n (event: A, emit: (newState: S) => void) => void | Promise<void>\n > = new Map();\n\n /**\n * Registers an event handler for a specific event type.\n * This method is typically called in the constructor of a derived Bloc class.\n * @param eventConstructor The constructor of the event to handle (e.g., LoadDataEvent).\n * @param handler A function that processes the event and can emit new states.\n * The 'event' parameter in the handler will be typed to the specific eventConstructor.\n */\n protected on<E extends A>(\n // Using 'any[]' for constructor arguments for broader compatibility.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n eventConstructor: new (...args: any[]) => E, \n handler: (event: E, emit: (newState: S) => void) => void | Promise<void>\n ): void {\n if (this.eventHandlers.has(eventConstructor)) {\n // Using Blac.warn or a similar logging mechanism from BlocBase if available,\n // otherwise console.warn. Assuming this._name and this._id are available from BlocBase.\n Blac.warn(\n `[Bloc ${this._name}:${String(this._id)}] Handler for event '${eventConstructor.name}' already registered. It will be overwritten.`\n );\n }\n // Cast the specific handler (event: E) to a more general (event: A) for storage.\n // This is safe because E extends A. When the handler is called with an 'action' of type A,\n // if it was originally registered for type E, 'action' must be an instance of E.\n this.eventHandlers.set(\n eventConstructor,\n handler as (event: A, emit: (newState: S) => void) => void | Promise<void>\n );\n }\n\n /**\n * Dispatches an action/event to the Bloc.\n * If a handler is registered for this specific event type (via 'on'), it will be invoked.\n * Asynchronous handlers are awaited.\n * @param action The action/event instance to be processed.\n */\n public add = async (action: A): Promise<void> => {\n // Using 'any[]' for constructor arguments for broader compatibility.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const eventConstructor = action.constructor as new (...args: any[]) => A;\n const handler = this.eventHandlers.get(eventConstructor);\n\n if (handler) {\n // Define the 'emit' function that handlers will use to update state.\n // It captures the current state ('this.state') right before each emission\n // to provide the correct 'previousState' to _pushState.\n const emit = (newState: S): void => {\n const previousState = this.state; // State just before this specific emission\n // The 'action' passed to _pushState is the original action that triggered the handler,\n // providing context for the state change (e.g., for logging or plugins).\n this._pushState(newState, previousState, action);\n };\n\n try {\n // Await the handler in case it's an async function (e.g., performs API calls).\n // The 'action' is passed to the handler, and due to the way 'on' is typed,\n // the 'event' parameter within the handler function will be correctly\n // typed to its specific class (e.g., LoadMyFeatureData).\n await handler(action, emit);\n } catch (error) {\n // It's good practice to handle errors occurring within event handlers.\n Blac.error(\n `[Bloc ${this._name}:${String(this._id)}] Error in event handler for '${eventConstructor.name}':`,\n error,\n \"Action:\", action\n );\n // Depending on the desired error handling strategy, you might:\n // 1. Emit a specific error state: this.emit(new MyErrorState(error));\n // 2. Re-throw the error: throw error;\n // 3. Log and ignore (as done here by default).\n // This should be decided based on application requirements.\n }\n } else {\n // action.constructor.name should be safe due to 'A extends object' and common JS practice for constructors.\n // If linting still complains, it might be overly strict for this common pattern.\n const constructorName = (action.constructor as { name?: string }).name || 'UnnamedConstructor';\n Blac.warn(\n `[Bloc ${this._name}:${String(this._id)}] No handler registered for action type: '${constructorName}'. Action was:`,\n action\n );\n // If no handler is found, the action is effectively ignored.\n // Consider if this is the desired behavior or if an error should be thrown\n // or a default handler should be invoked.\n }\n };\n}\n","import { Blac } from './Blac';\nimport { BlocBase } from './BlocBase';\n\n/**\n * A Cubit is a simpler version of a Bloc that doesn't handle events.\n * It manages state and provides methods to update it.\n * @template S - The type of state this Cubit manages\n * @template P - The type of parameters (optional, defaults to null)\n */\nexport abstract class Cubit<S, P = null> extends BlocBase<S, P> {\n /**\n * Updates the current state and notifies all observers of the change.\n * If the new state is identical to the current state (using Object.is),\n * no update will occur.\n * @param state - The new state to set\n */\n emit(state: S): void {\n if (Object.is(state, this.state)) {\n return;\n }\n\n const oldState = this.state;\n const newState = state;\n this._pushState(newState, oldState);\n }\n\n /**\n * Partially updates the current state by merging it with the provided state patch.\n * This method is only applicable when the state is an object type.\n * \n * @param statePatch - A partial state object containing only the properties to update\n * @param ignoreChangeCheck - If true, skips checking if the state has actually changed\n * @throws {TypeError} If the state is not an object type\n */\n patch(\n statePatch: S extends object ? Partial<S> : S,\n ignoreChangeCheck = false,\n ): void {\n if (typeof this.state !== 'object' || this.state === null) {\n Blac.warn(\n 'Cubit.patch: was called on a cubit where the state is not an object. This is a no-op.',\n );\n return;\n }\n\n let changes = false;\n if (!ignoreChangeCheck) {\n for (const key in statePatch) {\n if (Object.prototype.hasOwnProperty.call(statePatch, key)) {\n const s = this.state;\n const current = s[key as keyof S];\n if (!Object.is(statePatch[key as keyof S], current)) {\n changes = true;\n break;\n }\n }\n }\n } else {\n changes = true;\n }\n\n if (changes) {\n this.emit({\n ...this.state,\n ...(statePatch as Partial<S>),\n } as S);\n }\n }\n}\n"],"names":["_SingletonBlacManager","Blac","instance","oldInstance","bloc","__publicField","SingletonBlacManager","instanceManager","setBlacInstanceManager","manager","_Blac","options","args","message","oldBlocInstanceMap","oldIsolatedBlocMap","blocArray","base","key","blocClass","id","blocId","isolatedBloc","registeredBloc","isIsolated","registered","results","blocInstance","isolatedBlocs","toDispose","predicate","blocs","sum","arr","__unsafe_ignore_singleton","blocClassName","index","b","uid","props","instanceRef","newBloc","BlacObservable","observer","newState","oldState","action","shouldUpdate","lastDependencyCheck","newDependencyCheck","o","partNew","partOld","i","BlocBase","initialState","originalId","consumerId","consumerRef","actionType","batchFn","wasBatching","result","lastUpdate","Constructor","_a","handler","Bloc","eventConstructor","emit","previousState","error","constructorName","Cubit","state","statePatch","ignoreChangeCheck","changes","current"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/Blac.ts","../src/BlacObserver.ts","../src/BlocBase.ts","../src/Bloc.ts","../src/Cubit.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n// TODO: Remove this eslint disable once any types are properly replaced\nimport { BlocBase, BlocInstanceId } from \"./BlocBase\";\nimport {\n BlocBaseAbstract,\n BlocConstructor,\n BlocHookDependencyArrayFn,\n BlocState,\n InferPropsFromGeneric\n} from \"./types\";\n\n/**\n * Configuration options for the Blac instance\n */\nexport interface BlacConfig {\n /** Whether to expose the Blac instance globally */\n exposeBlacInstance?: boolean;\n}\n\nexport interface GetBlocOptions<B extends BlocBase<unknown>> {\n id?: string;\n selector?: BlocHookDependencyArrayFn<BlocState<B>>;\n props?: InferPropsFromGeneric<B>;\n onMount?: (bloc: B) => void;\n instanceRef?: string;\n throwIfNotFound?: boolean;\n}\n\n/**\n * Interface for Blac instance management\n */\nexport interface BlacInstanceManager {\n getInstance(): Blac;\n setInstance(instance: Blac): void;\n resetInstance(): void;\n}\n\n/**\n * Default singleton implementation of BlacInstanceManager\n */\nclass SingletonBlacManager implements BlacInstanceManager {\n private static _instance: Blac;\n\n getInstance(): Blac {\n if (!SingletonBlacManager._instance) {\n SingletonBlacManager._instance = new Blac({ __unsafe_ignore_singleton: true });\n }\n return SingletonBlacManager._instance;\n }\n\n setInstance(instance: Blac): void {\n SingletonBlacManager._instance = instance;\n }\n\n resetInstance(): void {\n const oldInstance = SingletonBlacManager._instance;\n SingletonBlacManager._instance = new Blac({ __unsafe_ignore_singleton: true });\n \n // Transfer any keep-alive blocs to the new instance\n if (oldInstance) {\n for (const bloc of oldInstance.keepAliveBlocs) {\n SingletonBlacManager._instance.keepAliveBlocs.add(bloc);\n SingletonBlacManager._instance.uidRegistry.set(bloc.uid, bloc);\n }\n }\n }\n}\n\n/**\n * Global instance manager (can be replaced for testing or different patterns)\n */\nlet instanceManager: BlacInstanceManager = new SingletonBlacManager();\n\n/**\n * Sets a custom instance manager (useful for testing or advanced patterns)\n */\nexport function setBlacInstanceManager(manager: BlacInstanceManager): void {\n instanceManager = manager;\n}\n\n/**\n * Main Blac class that manages the state management system.\n * Can work with singleton pattern or dependency injection.\n * Handles bloc lifecycle, and instance tracking.\n * \n * Key responsibilities:\n * - Managing bloc instances (creation, disposal, lookup)\n * - Handling isolated and non-isolated blocs\n * - Providing logging and debugging capabilities\n */\nexport class Blac {\n /** @deprecated Use getInstance() instead */\n static get instance(): Blac {\n return instanceManager.getInstance();\n }\n /** Timestamp when the instance was created */\n createdAt = Date.now();\n static get getAllBlocs() {\n return Blac.instance.getAllBlocs;\n }\n /** Map storing all registered bloc instances by their class name and ID */\n blocInstanceMap: Map<string, BlocBase<unknown>> = new Map();\n /** Map storing isolated bloc instances grouped by their constructor */\n isolatedBlocMap: Map<BlocConstructor<any>, BlocBase<unknown>[]> = new Map();\n /** Map for O(1) lookup of isolated blocs by UID */\n private isolatedBlocIndex: Map<string, BlocBase<unknown>> = new Map();\n /** Map tracking UIDs to prevent memory leaks */\n uidRegistry: Map<string, BlocBase<unknown>> = new Map();\n /** Set of keep-alive blocs for controlled cleanup */\n keepAliveBlocs: Set<BlocBase<unknown>> = new Set();\n /** Flag to control whether changes should be posted to document */\n postChangesToDocument = false;\n\n /**\n * Creates a new Blac instance.\n * @param options - Configuration options including singleton control\n */\n constructor(options: { __unsafe_ignore_singleton?: boolean } = {}) {\n const { __unsafe_ignore_singleton = false } = options;\n if (!__unsafe_ignore_singleton) {\n return Blac.instance;\n }\n instanceManager.setInstance(this);\n }\n\n /** Flag to enable/disable logging */\n static enableLog = false;\n\n /**\n * Logs messages to console when logging is enabled\n * @param args - Arguments to log\n */\n log = (...args: unknown[]) => {\n if (Blac.enableLog) console.warn(`☢️ [Blac ${this.createdAt.toString()}]`, ...args);\n };\n static get log() { return Blac.instance.log; }\n\n /**\n * Gets the current Blac instance\n * @returns The Blac instance\n */\n static getInstance(): Blac {\n return instanceManager.getInstance();\n }\n\n\n /**\n * Logs a warning message\n * @param message - Warning message\n * @param args - Additional arguments\n */\n warn = (message: string, ...args: unknown[]) => {\n if (Blac.enableLog) {\n console.warn(`🚨 [Blac ${String(Blac.instance.createdAt)}]`, message, ...args);\n }\n };\n static get warn() { return Blac.instance.warn; }\n /**\n * Logs an error message\n * @param message - Error message\n * @param args - Additional arguments\n */\n error = (message: string, ...args: unknown[]) => {\n if (Blac.enableLog) {\n console.error(`🚨 [Blac ${String(Blac.instance.createdAt)}]`, message, ...args);\n }\n };\n static get error() { return Blac.instance.error; }\n\n /**\n * Resets the Blac instance to a new one, disposing non-keepAlive blocs\n * from the old instance.\n */\n resetInstance = (): void => {\n this.log(\"Reset Blac instance\");\n\n // Dispose non-keepAlive blocs from the current instance\n const oldBlocInstanceMap = new Map(this.blocInstanceMap);\n const oldIsolatedBlocMap = new Map(this.isolatedBlocMap);\n\n oldBlocInstanceMap.forEach((bloc) => {\n if (!bloc._keepAlive) {\n bloc._dispose();\n }\n });\n\n oldIsolatedBlocMap.forEach((blocArray) => {\n blocArray.forEach((bloc) => {\n if (!bloc._keepAlive) {\n bloc._dispose();\n }\n });\n });\n\n this.blocInstanceMap.clear();\n this.isolatedBlocMap.clear();\n this.isolatedBlocIndex.clear();\n\n // Use instance manager to reset\n instanceManager.resetInstance();\n }\n static resetInstance = (): void => {\n instanceManager.resetInstance();\n };\n\n /**\n * Disposes of a bloc instance by removing it from the appropriate registry\n * @param bloc - The bloc instance to dispose\n */\n disposeBloc = (bloc: BlocBase<unknown>): void => {\n const base = bloc.constructor as unknown as BlocBaseAbstract;\n const key = this.createBlocInstanceMapKey(bloc._name, bloc._id);\n this.log(`[${bloc._name}:${String(bloc._id)}] disposeBloc called. Isolated: ${String(base.isolated)}`);\n\n if (base.isolated) {\n this.unregisterIsolatedBlocInstance(bloc);\n this.blocInstanceMap.delete(key);\n } else {\n this.unregisterBlocInstance(bloc);\n }\n this.log('dispatched bloc', bloc)\n };\n\n /**\n * Creates a unique key for a bloc instance in the map based on the bloc class name and instance ID\n * @param blocClassName - The name of the bloc class\n * @param id - The instance ID\n * @returns A unique key string in the format \"className:id\"\n */\n createBlocInstanceMapKey(blocClassName: string, id: BlocInstanceId): string {\n return `${blocClassName}:${String(id)}`;\n }\n\n /**\n * Unregister a bloc instance from the main registry\n * @param bloc - The bloc instance to unregister\n */\n unregisterBlocInstance(bloc: BlocBase<unknown>): void {\n const key = this.createBlocInstanceMapKey(bloc._name, bloc._id);\n this.blocInstanceMap.delete(key);\n \n // Clean up UID tracking\n this.uidRegistry.delete(bloc.uid);\n \n // Remove from keep-alive set\n this.keepAliveBlocs.delete(bloc);\n }\n\n /**\n * Registers a bloc instance in the main registry\n * @param bloc - The bloc instance to register\n */\n registerBlocInstance(bloc: BlocBase<unknown>): void {\n const key = this.createBlocInstanceMapKey(bloc._name, bloc._id);\n this.blocInstanceMap.set(key, bloc);\n \n // Track UID for cleanup\n this.uidRegistry.set(bloc.uid, bloc);\n \n // Track keep-alive blocs\n if (bloc._keepAlive) {\n this.keepAliveBlocs.add(bloc);\n }\n }\n\n /**\n * Finds a registered bloc instance by its class and ID\n * @param blocClass - The bloc class to search for\n * @param id - The instance ID\n * @returns The found bloc instance or undefined if not found\n */\n findRegisteredBlocInstance<B extends BlocConstructor<any>>(\n blocClass: B,\n id: BlocInstanceId,\n ): InstanceType<B> | undefined {\n const base = blocClass as unknown as BlocBaseAbstract;\n if (base.isolated) return undefined;\n\n const key = this.createBlocInstanceMapKey(blocClass.name, id);\n const found = this.blocInstanceMap.get(key) as InstanceType<B> | undefined;\n return found\n }\n\n /**\n * Registers an isolated bloc instance in the isolated registry\n * @param bloc - The isolated bloc instance to register\n */\n registerIsolatedBlocInstance(bloc: BlocBase<unknown>): void {\n const blocClass = bloc.constructor as BlocConstructor<any>;\n const blocs = this.isolatedBlocMap.get(blocClass);\n if (blocs) {\n blocs.push(bloc);\n } else {\n this.isolatedBlocMap.set(blocClass, [bloc]);\n }\n \n // Add to isolated index for O(1) lookups\n this.isolatedBlocIndex.set(bloc.uid, bloc);\n \n // Track UID for cleanup\n this.uidRegistry.set(bloc.uid, bloc);\n \n // Track keep-alive blocs\n if (bloc._keepAlive) {\n this.keepAliveBlocs.add(bloc);\n }\n }\n\n /**\n * Unregister an isolated bloc instance from the isolated registry\n * @param bloc - The isolated bloc instance to unregister\n */\n unregisterIsolatedBlocInstance(bloc: BlocBase<unknown>): void {\n const blocClass = bloc.constructor;\n const blocs = this.isolatedBlocMap.get(blocClass as BlocConstructor<any>);\n if (blocs) {\n const index = blocs.findIndex((b) => b.uid === bloc.uid);\n if (index !== -1) {\n blocs.splice(index, 1);\n }\n\n if (blocs.length === 0) {\n this.isolatedBlocMap.delete(blocClass as BlocConstructor<any>);\n }\n }\n \n // Remove from isolated index\n this.isolatedBlocIndex.delete(bloc.uid);\n \n // Clean up UID tracking\n this.uidRegistry.delete(bloc.uid);\n \n // Remove from keep-alive set\n this.keepAliveBlocs.delete(bloc);\n }\n\n /**\n * Finds an isolated bloc instance by its class and ID (O(n) lookup)\n */\n findIsolatedBlocInstance<B extends BlocConstructor<any>>(\n blocClass: B,\n id: BlocInstanceId,\n ): InstanceType<B> | undefined {\n const base = blocClass as unknown as BlocBaseAbstract;\n if (!base.isolated) return undefined;\n\n const blocs = this.isolatedBlocMap.get(blocClass);\n if (!blocs) {\n return undefined;\n }\n // Find the specific bloc by ID within the isolated array\n const found = blocs.find((b) => b._id === id) as InstanceType<B> | undefined;\n return found;\n }\n\n /**\n * Finds an isolated bloc instance by UID (O(1) lookup)\n */\n findIsolatedBlocInstanceByUid<B extends BlocBase<unknown>>(\n uid: string\n ): B | undefined {\n return this.isolatedBlocIndex.get(uid) as B | undefined;\n }\n\n /**\n * Creates a new bloc instance and registers it in the appropriate registry\n * @param blocClass - The bloc class to instantiate\n * @param id - The instance ID\n * @param props - Properties to pass to the bloc constructor\n * @param instanceRef - Optional reference string for the instance\n * @returns The newly created bloc instance\n */\n createNewBlocInstance<B extends BlocConstructor<BlocBase<any>>>(\n blocClass: B,\n id: BlocInstanceId,\n options: GetBlocOptions<InstanceType<B>> = {},\n ): InstanceType<B> {\n const { props, instanceRef } = options;\n const newBloc = new blocClass(props as never) as InstanceType<B>;\n newBloc._instanceRef = instanceRef;\n newBloc.props = props || null;\n newBloc._updateId(id);\n\n // Set up disposal handler to break circular dependency\n newBloc._setDisposalHandler((bloc) => this.disposeBloc(bloc));\n\n if (newBloc.isIsolated) {\n this.registerIsolatedBlocInstance(newBloc);\n return newBloc;\n }\n\n this.registerBlocInstance(newBloc);\n return newBloc;\n }\n\n\n activateBloc = (bloc: BlocBase<unknown>): void => {\n const base = bloc.constructor as unknown as BlocConstructor<BlocBase<any>>;\n const isIsolated = bloc.isIsolated;\n\n let found = isIsolated ? this.findIsolatedBlocInstance(base, bloc._id) : this.findRegisteredBlocInstance(base, bloc._id);\n if (found) {\n return;\n }\n\n this.log(`[${bloc._name}:${String(bloc._id)}] activateBloc called. Isolated: ${String(bloc.isIsolated)}`);\n if (bloc.isIsolated) {\n this.registerIsolatedBlocInstance(bloc);\n } else {\n this.registerBlocInstance(bloc);\n }\n };\n static get activateBloc() { return Blac.instance.activateBloc; }\n\n /**\n * Gets or creates a bloc instance based on the provided class and options.\n * If a bloc with the given ID exists, it will be returned. Otherwise, a new instance will be created.\n * \n * @param blocClass - The bloc class to get or create\n * @param options - Options including:\n * - id: The instance ID (defaults to class name if not provided)\n * - props: Properties to pass to the bloc constructor\n * - instanceRef: Optional reference string for the instance\n * @returns The bloc instance\n */\n getBloc = <B extends BlocConstructor<BlocBase<any>>>(\n blocClass: B,\n options: GetBlocOptions<InstanceType<B>> = {},\n ): InstanceType<B> => {\n const { id } = options;\n const base = blocClass as unknown as BlocBaseAbstract;\n const blocId = id ?? blocClass.name;\n\n\n if (base.isolated) {\n const isolatedBloc = this.findIsolatedBlocInstance<B>(blocClass, blocId)\n if (isolatedBloc) {\n this.log(`[${blocClass.name}:${String(blocId)}] (getBloc) Found existing isolated instance.`, options);\n return isolatedBloc;\n } else {\n if (options.throwIfNotFound) {\n throw new Error(`Isolated bloc ${blocClass.name} not found`);\n }\n }\n } else {\n const registeredBloc = this.findRegisteredBlocInstance(blocClass, blocId)\n if (registeredBloc) {\n this.log(`[${blocClass.name}:${String(blocId)}] (getBloc) Found existing registered instance.`, options);\n return registeredBloc\n } else {\n if (options.throwIfNotFound) {\n throw new Error(`Registered bloc ${blocClass.name} not found`);\n }\n }\n }\n\n const bloc = this.createNewBlocInstance(\n blocClass,\n blocId,\n options,\n );\n this.log(`[${blocClass.name}:${String(blocId)}] (getBloc) No existing instance found. Creating new one.`, options, bloc);\n return bloc;\n };\n static get getBloc() { return Blac.instance.getBloc; }\n\n /**\n * Gets a bloc instance or throws an error if it doesn't exist\n * @param blocClass - The bloc class to get\n * @param options - Options including:\n * - id: The instance ID (defaults to class name if not provided)\n * - props: Properties to pass to the bloc constructor\n * - instanceRef: Optional reference string for the instance\n */\n getBlocOrThrow = <B extends BlocConstructor<any>>(\n blocClass: B,\n options: {\n id?: BlocInstanceId;\n props?: InferPropsFromGeneric<B>;\n instanceRef?: string;\n } = {},\n ): InstanceType<B> => {\n const isIsolated = (blocClass as unknown as BlocBaseAbstract).isolated;\n const id = options.id || blocClass.name;\n\n const registered = isIsolated\n ? this.findIsolatedBlocInstance(blocClass, id)\n : this.findRegisteredBlocInstance(blocClass, id);\n\n if (registered) {\n return registered;\n }\n throw new Error(`Bloc ${blocClass.name} not found`);\n };\n static get getBlocOrThrow() { return Blac.instance.getBlocOrThrow; }\n\n /**\n * Gets all instances of a specific bloc class\n * @param blocClass - The bloc class to search for\n * @param options - Options including:\n * - searchIsolated: Whether to search in isolated blocs (defaults to bloc's isolated property)\n * @returns Array of matching bloc instances\n */\n getAllBlocs = <B extends BlocConstructor<any>>(\n blocClass: B,\n options: {\n searchIsolated?: boolean;\n } = {},\n ): InstanceType<B>[] => {\n const results: InstanceType<B>[] = [];\n // const blocClassName = (blocClass as any).name; // Temporarily removed for debugging\n\n // Search non-isolated blocs\n this.blocInstanceMap.forEach((blocInstance) => {\n if (blocInstance.constructor === blocClass) { // Strict constructor check\n results.push(blocInstance as InstanceType<B>);\n }\n });\n\n // Optionally search isolated blocs\n if (options.searchIsolated !== false) {\n const isolatedBlocs = this.isolatedBlocMap.get(blocClass);\n if (isolatedBlocs) {\n results.push(...isolatedBlocs.map(bloc => bloc as InstanceType<B>));\n }\n }\n\n return results;\n };\n\n /**\n * Disposes all keep-alive blocs of a specific type\n * @param blocClass - The bloc class to dispose\n */\n disposeKeepAliveBlocs = <B extends BlocConstructor<any>>(\n blocClass?: B\n ): void => {\n const toDispose: BlocBase<unknown>[] = [];\n \n for (const bloc of this.keepAliveBlocs) {\n if (!blocClass || bloc.constructor === blocClass) {\n toDispose.push(bloc);\n }\n }\n \n toDispose.forEach(bloc => bloc._dispose());\n };\n static get disposeKeepAliveBlocs() { return Blac.instance.disposeKeepAliveBlocs; }\n\n /**\n * Disposes all blocs matching a pattern\n * @param predicate - Function to test each bloc for disposal\n */\n disposeBlocs = (predicate: (bloc: BlocBase<unknown>) => boolean): void => {\n const toDispose: BlocBase<unknown>[] = [];\n \n // Check registered blocs\n for (const bloc of this.blocInstanceMap.values()) {\n if (predicate(bloc)) {\n toDispose.push(bloc);\n }\n }\n \n // Check isolated blocs\n for (const blocs of this.isolatedBlocMap.values()) {\n for (const bloc of blocs) {\n if (predicate(bloc)) {\n toDispose.push(bloc);\n }\n }\n }\n \n toDispose.forEach(bloc => bloc._dispose());\n };\n static get disposeBlocs() { return Blac.instance.disposeBlocs; }\n\n /**\n * Gets memory usage statistics for debugging\n */\n getMemoryStats = () => {\n return {\n totalBlocs: this.uidRegistry.size,\n registeredBlocs: this.blocInstanceMap.size,\n isolatedBlocs: Array.from(this.isolatedBlocMap.values()).reduce((sum, arr) => sum + arr.length, 0),\n keepAliveBlocs: this.keepAliveBlocs.size,\n isolatedBlocTypes: this.isolatedBlocMap.size,\n };\n };\n static get getMemoryStats() { return Blac.instance.getMemoryStats; }\n\n /**\n * Validates consumer references and cleans up orphaned consumers\n */\n validateConsumers = (): void => {\n for (const bloc of this.uidRegistry.values()) {\n // This would need to be called periodically to clean up orphaned consumers\n // Implementation depends on how we want to handle consumer validation\n if (bloc._consumers.size === 0 && !bloc._keepAlive) {\n // Schedule disposal for blocs with no consumers\n setTimeout(() => {\n if (bloc._consumers.size === 0 && !bloc._keepAlive) {\n bloc._dispose();\n }\n }, 1000); // Give a grace period\n }\n }\n };\n static get validateConsumers() { return Blac.instance.validateConsumers; }\n}\n","import { Blac } from './Blac';\nimport { BlocBase } from './BlocBase';\nimport { BlocHookDependencyArrayFn } from './types';\n\n/**\n * Represents an observer that can subscribe to state changes in a Bloc\n * @template S - The type of state being observed\n */\nexport type BlacObserver<S> = {\n /** Function to be called when state changes */\n fn: (newState: S, oldState: S, action?: unknown) => void | Promise<void>;\n /** Optional function to determine if the observer should be notified of state changes */\n dependencyArray?: BlocHookDependencyArrayFn<S>;\n /** Dispose function for the observer */\n dispose?: () => void;\n /** Cached state values used for dependency comparison */\n lastState?: unknown[][];\n /** Unique identifier for the observer */\n id: string;\n};\n\n/**\n * A class that manages observers for a Bloc's state changes\n * @template S - The type of state being observed\n */\nexport class BlacObservable<S = unknown> {\n /** The Bloc instance this observable is associated with */\n bloc: BlocBase<S>;\n\n /**\n * Creates a new BlacObservable instance\n * @param bloc - The Bloc instance to observe\n */\n constructor(bloc: BlocBase<S>) {\n this.bloc = bloc;\n }\n\n private _observers = new Set<BlacObserver<S>>();\n\n /**\n * Gets the number of active observers\n * @returns The number of observers currently subscribed\n */\n get size(): number {\n return this._observers.size;\n }\n\n /**\n * Gets the set of all observers\n * @returns The Set of all BlacObserver instances\n */\n get observers() {\n return this._observers;\n }\n\n /**\n * Subscribes an observer to state changes\n * @param observer - The observer to subscribe\n * @returns A function that can be called to unsubscribe the observer\n */\n subscribe(observer: BlacObserver<S>): () => void {\n Blac.log('BlacObservable.subscribe: Subscribing observer.', this.bloc, observer);\n this._observers.add(observer);\n // Blac.instance.dispatchEvent(BlacLifecycleEvent.LISTENER_ADDED, this.bloc, { listenerId: observer.id });\n if (!observer.lastState) {\n observer.lastState = observer.dependencyArray\n ? observer.dependencyArray(this.bloc.state)\n : [];\n }\n return () => {\n Blac.log('BlacObservable.subscribe: Unsubscribing observer.', this.bloc, observer);\n this.unsubscribe(observer);\n }\n }\n\n /**\n * Unsubscribes an observer from state changes\n * @param observer - The observer to unsubscribe\n */\n unsubscribe(observer: BlacObserver<S>) {\n this._observers.delete(observer);\n // Blac.instance.dispatchEvent(BlacLifecycleEvent.LISTENER_REMOVED, this.bloc, { listenerId: observer.id });\n\n if (this.size === 0) {\n Blac.log('BlacObservable.unsubscribe: No observers left. Disposing bloc.', this.bloc);\n this.bloc._dispose();\n }\n }\n\n /**\n * Notifies all observers of a state change\n * @param newState - The new state value\n * @param oldState - The previous state value\n * @param action - Optional action that triggered the state change\n */\n notify(newState: S, oldState: S, action?: unknown) {\n this._observers.forEach((observer) => {\n let shouldUpdate = false;\n\n if (observer.dependencyArray) {\n const lastDependencyCheck = observer.lastState || [];\n const newDependencyCheck = observer.dependencyArray(newState);\n\n for (let o = 0; o < newDependencyCheck.length; o++) {\n const partNew = newDependencyCheck[o];\n const partOld = lastDependencyCheck[o] || [];\n for (let i = 0; i < partNew.length; i++) {\n if (!Object.is(partNew[i], partOld[i])) {\n shouldUpdate = true;\n break;\n }\n }\n }\n\n observer.lastState = newDependencyCheck;\n } else {\n shouldUpdate = true;\n }\n\n if (shouldUpdate) {\n void observer.fn(newState, oldState, action);\n }\n });\n }\n\n /**\n * Clears the observer set\n */\n clear() {\n this._observers.forEach((observer) => {\n this.unsubscribe(observer);\n });\n this._observers.clear();\n }\n}\n","import { BlacObservable } from './BlacObserver';\nimport { BlocConstructor } from './types';\n\nexport type BlocInstanceId = string | number | undefined;\ntype DependencySelector<S> = (newState: S) => unknown[][];\n\n// Define an interface for the static properties expected on a Bloc/Cubit constructor\ninterface BlocStaticProperties {\n isolated: boolean;\n keepAlive: boolean;\n}\n\n/**\n * Base class for both Blocs and Cubits that provides core state management functionality.\n * Handles state transitions, observer notifications, lifecycle management, and addon integration.\n * \n * @abstract This class should be extended, not instantiated directly\n * @template S The type of state managed by this Bloc\n * @template P The type of props that can be passed during instance creation (optional)\n */\nexport abstract class BlocBase<\n S,\n P = unknown\n> {\n public uid = crypto.randomUUID();\n /**\n * When true, every consumer will receive its own unique instance of this Bloc.\n * Use this when state should not be shared between components.\n * @default false\n */\n static isolated = false;\n get isIsolated() {\n return this._isolated;\n }\n \n /**\n * When true, the Bloc instance persists even when there are no active consumers.\n * Useful for maintaining state between component unmount/remount cycles.\n * @default false\n */\n static keepAlive = false;\n get isKeepAlive() {\n return this._keepAlive;\n }\n \n /**\n * Defines how dependencies are selected from the state for efficient updates.\n * When provided, observers will only be notified when selected dependencies change.\n */\n defaultDependencySelector: DependencySelector<S> | undefined;\n \n /**\n * @internal\n * Indicates if this specific Bloc instance is isolated from others of the same type.\n */\n public _isolated = false;\n \n /**\n * @internal\n * Observable responsible for managing state listeners and notifying consumers.\n */\n public _observer: BlacObservable<S>;\n \n /**\n * The unique identifier for this Bloc instance.\n * Defaults to the class name, but can be customized.\n */\n public _id: BlocInstanceId;\n \n /**\n * @internal\n * Reference string used internally for tracking and debugging.\n */\n public _instanceRef?: string;\n \n /**\n * @internal\n * Indicates if this specific Bloc instance should be kept alive when no consumers are present.\n */\n public _keepAlive = false;\n \n /**\n * @readonly\n * Timestamp when this Bloc instance was created, useful for debugging and performance tracking.\n */\n public readonly _createdAt = Date.now();\n\n /**\n * @internal\n * The current state of the Bloc.\n */\n public _state: S;\n \n /**\n * @internal\n * The previous state of the Bloc, maintained for comparison and history.\n */\n public _oldState: S | undefined;\n \n /**\n * Props passed during Bloc instance creation.\n * Can be used to configure or parameterize the Bloc's behavior.\n */\n public props: P | null = null;\n\n /**\n * Creates a new BlocBase instance with the given initial state.\n * Sets up the observer, registers with the Blac manager, and initializes addons.\n * \n * @param initialState The initial state value for this Bloc\n */\n constructor(initialState: S) {\n this._state = initialState;\n this._observer = new BlacObservable(this);\n this._id = this.constructor.name;\n\n // Access static properties safely with proper type checking\n const Constructor = this.constructor as typeof BlocBase & BlocStaticProperties;\n \n // Validate that the static properties exist and are boolean\n this._keepAlive = typeof Constructor.keepAlive === 'boolean' ? Constructor.keepAlive : false;\n this._isolated = typeof Constructor.isolated === 'boolean' ? Constructor.isolated : false;\n }\n\n /**\n * Returns the current state of the Bloc.\n * Use this getter to access the state in a read-only manner.\n */\n get state(): S {\n return this._state;\n }\n\n /**\n * @internal\n * Returns the name of the Bloc class for identification and debugging.\n */\n get _name() {\n return this.constructor.name;\n }\n\n /**\n * @internal\n * Updates the Bloc instance's ID to a new value.\n * Only updates if the new ID is defined and different from the current one.\n * \n * @param id The new ID to assign to this Bloc instance\n */\n _updateId = (id?: BlocInstanceId) => {\n const originalId = this._id;\n if (!id || id === originalId) return;\n this._id = id;\n };\n\n /**\n * @internal\n * Cleans up resources and removes this Bloc from the system.\n * Notifies the Blac manager and clears all observers.\n */\n _dispose() {\n // Clear all consumers\n this._consumers.clear();\n \n // Clear observer subscriptions\n this._observer.clear();\n \n // Call user-defined disposal hook\n this.onDispose?.();\n \n // The Blac manager will handle removal from registry\n // This method is called by Blac.disposeBloc, so we don't need to call it again\n }\n\n /**\n * @internal\n * Optional function to be called when the Bloc is disposed.\n */\n onDispose?: () => void;\n\n /**\n * @internal\n * Set of consumer IDs currently listening to this Bloc's state changes.\n */\n _consumers = new Set<string>();\n\n /**\n * @internal\n * WeakSet to track consumer references for cleanup validation\n */\n private _consumerRefs = new WeakSet<object>();\n\n /**\n * @internal\n * Registers a new consumer to this Bloc instance.\n * Notifies the Blac manager that a consumer has been added.\n * \n * @param consumerId The unique ID of the consumer being added\n * @param consumerRef Optional reference to the consumer object for cleanup validation\n */\n _addConsumer = (consumerId: string, consumerRef?: object) => {\n if (this._consumers.has(consumerId)) return;\n this._consumers.add(consumerId);\n \n if (consumerRef) {\n this._consumerRefs.add(consumerRef);\n }\n \n // this._blac.dispatchEvent(BlacLifecycleEvent.BLOC_CONSUMER_ADDED, this, { consumerId });\n };\n\n /**\n * @internal\n * Unregisters a consumer from this Bloc instance.\n * Notifies the Blac manager that a consumer has been removed.\n * \n * @param consumerId The unique ID of the consumer being removed\n */\n _removeConsumer = (consumerId: string) => {\n if (!this._consumers.has(consumerId)) return;\n this._consumers.delete(consumerId);\n // this._blac.dispatchEvent(BlacLifecycleEvent.BLOC_CONSUMER_REMOVED, this, { consumerId });\n \n // If no consumers remain and not keep-alive, schedule disposal\n if (this._consumers.size === 0 && !this._keepAlive) {\n this._scheduleDisposal();\n }\n };\n\n /**\n * @internal\n * Handler function for disposal (can be set by Blac manager)\n */\n private _disposalHandler?: (bloc: BlocBase<unknown>) => void;\n\n /**\n * @internal\n * Sets the disposal handler for this bloc\n */\n _setDisposalHandler(handler: (bloc: BlocBase<unknown>) => void) {\n this._disposalHandler = handler;\n }\n\n /**\n * @internal\n * Schedules disposal of this bloc instance if it has no consumers\n */\n private _scheduleDisposal() {\n // Use setTimeout to avoid disposal during render cycles\n setTimeout(() => {\n if (this._consumers.size === 0 && !this._keepAlive) {\n if (this._disposalHandler) {\n this._disposalHandler(this as any);\n } else {\n this._dispose();\n }\n }\n }, 0);\n }\n\n lastUpdate = Date.now();\n\n /**\n * @internal\n * Flag to indicate if batching is enabled for this bloc\n */\n private _batchingEnabled = false;\n\n /**\n * @internal\n * Pending state updates when batching is enabled\n */\n private _pendingUpdates: Array<{newState: S, oldState: S, action?: unknown}> = [];\n\n /**\n * @internal\n * Updates the state and notifies all observers of the change.\n * \n * @param newState The new state to be set\n * @param oldState The previous state for comparison\n * @param action Optional metadata about what caused the state change\n */\n _pushState = (newState: S, oldState: S, action?: unknown): void => {\n // Runtime validation for state changes\n if (newState === undefined) {\n console.warn('BlocBase._pushState: newState is undefined', this);\n return;\n }\n \n // Validate action type if provided\n if (action !== undefined && action !== null) {\n const actionType = typeof action;\n if (!(['string', 'object', 'number'].includes(actionType))) {\n console.warn('BlocBase._pushState: Invalid action type', this, action);\n }\n }\n\n // If batching is enabled, queue the update\n if (this._batchingEnabled) {\n this._pendingUpdates.push({ newState, oldState, action });\n return;\n }\n \n this._oldState = oldState;\n this._state = newState;\n this._observer.notify(newState, oldState, action);\n this.lastUpdate = Date.now();\n };\n\n /**\n * Enables batching for multiple state updates\n * @param batchFn Function to execute with batching enabled\n */\n batch = <T>(batchFn: () => T): T => {\n const wasBatching = this._batchingEnabled;\n this._batchingEnabled = true;\n \n try {\n const result = batchFn();\n \n // Process all pending updates\n if (this._pendingUpdates.length > 0) {\n const lastUpdate = this._pendingUpdates[this._pendingUpdates.length - 1];\n this._oldState = this._pendingUpdates[0].oldState;\n this._state = lastUpdate.newState;\n \n // Notify with the final state\n this._observer.notify(lastUpdate.newState, this._oldState, lastUpdate.action);\n this.lastUpdate = Date.now();\n \n this._pendingUpdates = [];\n }\n \n return result;\n } finally {\n this._batchingEnabled = wasBatching;\n }\n };\n}\n","import { Blac } from './Blac';\nimport { BlocBase } from './BlocBase';\n\n// A should be the base type for all events this Bloc handles and must be an object type\n// to access action.constructor. Events are typically class instances.\n// P is for props, changed from any to unknown.\nexport abstract class Bloc<\n S, // State type\n A extends object, // Base Action/Event type, constrained to object\n P = unknown // Props type\n> extends BlocBase<S, P> {\n // Stores handlers: Map<EventConstructor (subtype of A), HandlerFunction>\n // The handler's event parameter will be correctly typed to the specific EventConstructor\n // by the 'on' method's signature.\n readonly eventHandlers: Map<\n // Key: Constructor of a specific event E (where E extends A)\n // Using 'any[]' for constructor arguments for broader compatibility.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]) => A,\n // Value: Handler function. 'event: A' is used here for the stored function type.\n // The 'on' method ensures the specific handler (event: E) is correctly typed.\n (event: A, emit: (newState: S) => void) => void | Promise<void>\n > = new Map();\n\n /**\n * Registers an event handler for a specific event type.\n * This method is typically called in the constructor of a derived Bloc class.\n * @param eventConstructor The constructor of the event to handle (e.g., LoadDataEvent).\n * @param handler A function that processes the event and can emit new states.\n * The 'event' parameter in the handler will be typed to the specific eventConstructor.\n */\n protected on<E extends A>(\n // Using 'any[]' for constructor arguments for broader compatibility.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n eventConstructor: new (...args: any[]) => E, \n handler: (event: E, emit: (newState: S) => void) => void | Promise<void>\n ): void {\n if (this.eventHandlers.has(eventConstructor)) {\n // Using Blac.warn or a similar logging mechanism from BlocBase if available,\n // otherwise console.warn. Assuming this._name and this._id are available from BlocBase.\n Blac.warn(\n `[Bloc ${this._name}:${String(this._id)}] Handler for event '${eventConstructor.name}' already registered. It will be overwritten.`\n );\n }\n // Cast the specific handler (event: E) to a more general (event: A) for storage.\n // This is safe because E extends A. When the handler is called with an 'action' of type A,\n // if it was originally registered for type E, 'action' must be an instance of E.\n this.eventHandlers.set(\n eventConstructor,\n handler as (event: A, emit: (newState: S) => void) => void | Promise<void>\n );\n }\n\n /**\n * Dispatches an action/event to the Bloc.\n * If a handler is registered for this specific event type (via 'on'), it will be invoked.\n * Asynchronous handlers are awaited.\n * @param action The action/event instance to be processed.\n */\n public add = async (action: A): Promise<void> => {\n // Using 'any[]' for constructor arguments for broader compatibility.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const eventConstructor = action.constructor as new (...args: any[]) => A;\n const handler = this.eventHandlers.get(eventConstructor);\n\n if (handler) {\n // Define the 'emit' function that handlers will use to update state.\n // It captures the current state ('this.state') right before each emission\n // to provide the correct 'previousState' to _pushState.\n const emit = (newState: S): void => {\n const previousState = this.state; // State just before this specific emission\n // The 'action' passed to _pushState is the original action that triggered the handler,\n // providing context for the state change (e.g., for logging or plugins).\n this._pushState(newState, previousState, action);\n };\n\n try {\n // Await the handler in case it's an async function (e.g., performs API calls).\n // The 'action' is passed to the handler, and due to the way 'on' is typed,\n // the 'event' parameter within the handler function will be correctly\n // typed to its specific class (e.g., LoadMyFeatureData).\n await handler(action, emit);\n } catch (error) {\n // It's good practice to handle errors occurring within event handlers.\n Blac.error(\n `[Bloc ${this._name}:${String(this._id)}] Error in event handler for '${eventConstructor.name}':`,\n error,\n \"Action:\", action\n );\n // Depending on the desired error handling strategy, you might:\n // 1. Emit a specific error state: this.emit(new MyErrorState(error));\n // 2. Re-throw the error: throw error;\n // 3. Log and ignore (as done here by default).\n // This should be decided based on application requirements.\n }\n } else {\n // action.constructor.name should be safe due to 'A extends object' and common JS practice for constructors.\n // If linting still complains, it might be overly strict for this common pattern.\n const constructorName = (action.constructor as { name?: string }).name || 'UnnamedConstructor';\n Blac.warn(\n `[Bloc ${this._name}:${String(this._id)}] No handler registered for action type: '${constructorName}'. Action was:`,\n action\n );\n // If no handler is found, the action is effectively ignored.\n // Consider if this is the desired behavior or if an error should be thrown\n // or a default handler should be invoked.\n }\n };\n}\n","import { Blac } from './Blac';\nimport { BlocBase } from './BlocBase';\n\n/**\n * A Cubit is a simpler version of a Bloc that doesn't handle events.\n * It manages state and provides methods to update it.\n * @template S - The type of state this Cubit manages\n * @template P - The type of parameters (optional, defaults to null)\n */\nexport abstract class Cubit<S, P = null> extends BlocBase<S, P> {\n /**\n * Updates the current state and notifies all observers of the change.\n * If the new state is identical to the current state (using Object.is),\n * no update will occur.\n * @param state - The new state to set\n */\n emit(state: S): void {\n if (Object.is(state, this.state)) {\n return;\n }\n\n const oldState = this.state;\n const newState = state;\n this._pushState(newState, oldState);\n }\n\n /**\n * Partially updates the current state by merging it with the provided state patch.\n * This method is only applicable when the state is an object type.\n * \n * @param statePatch - A partial state object containing only the properties to update\n * @param ignoreChangeCheck - If true, skips checking if the state has actually changed\n * @throws {TypeError} If the state is not an object type\n */\n patch(\n statePatch: S extends object ? Partial<S> : S,\n ignoreChangeCheck = false,\n ): void {\n if (typeof this.state !== 'object' || this.state === null) {\n Blac.warn(\n 'Cubit.patch: was called on a cubit where the state is not an object. This is a no-op.',\n );\n return;\n }\n\n let changes = false;\n if (!ignoreChangeCheck) {\n for (const key in statePatch) {\n if (Object.prototype.hasOwnProperty.call(statePatch, key)) {\n const s = this.state;\n const current = s[key as keyof S];\n if (!Object.is(statePatch[key as keyof S], current)) {\n changes = true;\n break;\n }\n }\n }\n } else {\n changes = true;\n }\n\n if (changes) {\n this.emit({\n ...this.state,\n ...(statePatch as Partial<S>),\n } as S);\n }\n }\n}\n"],"names":["_SingletonBlacManager","Blac","instance","oldInstance","bloc","__publicField","SingletonBlacManager","instanceManager","setBlacInstanceManager","manager","_Blac","options","args","message","oldBlocInstanceMap","oldIsolatedBlocMap","blocArray","base","key","blocClass","id","blocId","isolatedBloc","registeredBloc","isIsolated","registered","results","blocInstance","isolatedBlocs","toDispose","predicate","blocs","sum","arr","__unsafe_ignore_singleton","blocClassName","index","b","uid","props","instanceRef","newBloc","BlacObservable","observer","newState","oldState","action","shouldUpdate","lastDependencyCheck","newDependencyCheck","o","partNew","partOld","i","BlocBase","initialState","originalId","consumerId","consumerRef","actionType","batchFn","wasBatching","result","lastUpdate","Constructor","_a","handler","Bloc","eventConstructor","emit","previousState","error","constructorName","Cubit","state","statePatch","ignoreChangeCheck","changes","current"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -13,13 +13,13 @@ export declare class Blac {
|
|
|
13
13
|
static get instance(): Blac;
|
|
14
14
|
/** Timestamp when the instance was created */
|
|
15
15
|
createdAt: number;
|
|
16
|
-
static get getAllBlocs(): <B extends BlocConstructor<
|
|
16
|
+
static get getAllBlocs(): <B extends BlocConstructor<any>>(blocClass: B, options?: {
|
|
17
17
|
searchIsolated?: boolean;
|
|
18
18
|
}) => InstanceType<B>[];
|
|
19
19
|
/** Map storing all registered bloc instances by their class name and ID */
|
|
20
20
|
blocInstanceMap: Map<string, BlocBase<unknown>>;
|
|
21
21
|
/** Map storing isolated bloc instances grouped by their constructor */
|
|
22
|
-
isolatedBlocMap: Map<BlocConstructor<
|
|
22
|
+
isolatedBlocMap: Map<BlocConstructor<any>, BlocBase<unknown>[]>;
|
|
23
23
|
/** Map for O(1) lookup of isolated blocs by UID */
|
|
24
24
|
private isolatedBlocIndex;
|
|
25
25
|
/** Map tracking UIDs to prevent memory leaks */
|
|
@@ -96,7 +96,7 @@ export declare class Blac {
|
|
|
96
96
|
* @param id - The instance ID
|
|
97
97
|
* @returns The found bloc instance or undefined if not found
|
|
98
98
|
*/
|
|
99
|
-
findRegisteredBlocInstance<B extends BlocConstructor<
|
|
99
|
+
findRegisteredBlocInstance<B extends BlocConstructor<any>>(blocClass: B, id: BlocInstanceId): InstanceType<B> | undefined;
|
|
100
100
|
/**
|
|
101
101
|
* Registers an isolated bloc instance in the isolated registry
|
|
102
102
|
* @param bloc - The isolated bloc instance to register
|
|
@@ -110,7 +110,7 @@ export declare class Blac {
|
|
|
110
110
|
/**
|
|
111
111
|
* Finds an isolated bloc instance by its class and ID (O(n) lookup)
|
|
112
112
|
*/
|
|
113
|
-
findIsolatedBlocInstance<B extends BlocConstructor<
|
|
113
|
+
findIsolatedBlocInstance<B extends BlocConstructor<any>>(blocClass: B, id: BlocInstanceId): InstanceType<B> | undefined;
|
|
114
114
|
/**
|
|
115
115
|
* Finds an isolated bloc instance by UID (O(1) lookup)
|
|
116
116
|
*/
|
|
@@ -123,7 +123,7 @@ export declare class Blac {
|
|
|
123
123
|
* @param instanceRef - Optional reference string for the instance
|
|
124
124
|
* @returns The newly created bloc instance
|
|
125
125
|
*/
|
|
126
|
-
createNewBlocInstance<B extends BlocConstructor<BlocBase<
|
|
126
|
+
createNewBlocInstance<B extends BlocConstructor<BlocBase<any>>>(blocClass: B, id: BlocInstanceId, options?: GetBlocOptions<InstanceType<B>>): InstanceType<B>;
|
|
127
127
|
activateBloc: (bloc: BlocBase<unknown>) => void;
|
|
128
128
|
static get activateBloc(): (bloc: BlocBase<unknown>) => void;
|
|
129
129
|
/**
|
|
@@ -137,8 +137,8 @@ export declare class Blac {
|
|
|
137
137
|
* - instanceRef: Optional reference string for the instance
|
|
138
138
|
* @returns The bloc instance
|
|
139
139
|
*/
|
|
140
|
-
getBloc: <B extends BlocConstructor<BlocBase<
|
|
141
|
-
static get getBloc(): <B extends BlocConstructor<BlocBase<
|
|
140
|
+
getBloc: <B extends BlocConstructor<BlocBase<any>>>(blocClass: B, options?: GetBlocOptions<InstanceType<B>>) => InstanceType<B>;
|
|
141
|
+
static get getBloc(): <B extends BlocConstructor<BlocBase<any>>>(blocClass: B, options?: GetBlocOptions<InstanceType<B>>) => InstanceType<B>;
|
|
142
142
|
/**
|
|
143
143
|
* Gets a bloc instance or throws an error if it doesn't exist
|
|
144
144
|
* @param blocClass - The bloc class to get
|
|
@@ -147,12 +147,12 @@ export declare class Blac {
|
|
|
147
147
|
* - props: Properties to pass to the bloc constructor
|
|
148
148
|
* - instanceRef: Optional reference string for the instance
|
|
149
149
|
*/
|
|
150
|
-
getBlocOrThrow: <B extends BlocConstructor<
|
|
150
|
+
getBlocOrThrow: <B extends BlocConstructor<any>>(blocClass: B, options?: {
|
|
151
151
|
id?: BlocInstanceId;
|
|
152
152
|
props?: InferPropsFromGeneric<B>;
|
|
153
153
|
instanceRef?: string;
|
|
154
154
|
}) => InstanceType<B>;
|
|
155
|
-
static get getBlocOrThrow(): <B extends BlocConstructor<
|
|
155
|
+
static get getBlocOrThrow(): <B extends BlocConstructor<any>>(blocClass: B, options?: {
|
|
156
156
|
id?: BlocInstanceId;
|
|
157
157
|
props?: InferPropsFromGeneric<B> | undefined;
|
|
158
158
|
instanceRef?: string;
|
|
@@ -164,15 +164,15 @@ export declare class Blac {
|
|
|
164
164
|
* - searchIsolated: Whether to search in isolated blocs (defaults to bloc's isolated property)
|
|
165
165
|
* @returns Array of matching bloc instances
|
|
166
166
|
*/
|
|
167
|
-
getAllBlocs: <B extends BlocConstructor<
|
|
167
|
+
getAllBlocs: <B extends BlocConstructor<any>>(blocClass: B, options?: {
|
|
168
168
|
searchIsolated?: boolean;
|
|
169
169
|
}) => InstanceType<B>[];
|
|
170
170
|
/**
|
|
171
171
|
* Disposes all keep-alive blocs of a specific type
|
|
172
172
|
* @param blocClass - The bloc class to dispose
|
|
173
173
|
*/
|
|
174
|
-
disposeKeepAliveBlocs: <B extends BlocConstructor<
|
|
175
|
-
static get disposeKeepAliveBlocs(): <B extends BlocConstructor<
|
|
174
|
+
disposeKeepAliveBlocs: <B extends BlocConstructor<any>>(blocClass?: B) => void;
|
|
175
|
+
static get disposeKeepAliveBlocs(): <B extends BlocConstructor<any>>(blocClass?: B | undefined) => void;
|
|
176
176
|
/**
|
|
177
177
|
* Disposes all blocs matching a pattern
|
|
178
178
|
* @param predicate - Function to test each bloc for disposal
|
package/dist/index.es.js
CHANGED
|
@@ -10,9 +10,9 @@ const d = class d {
|
|
|
10
10
|
}
|
|
11
11
|
resetInstance() {
|
|
12
12
|
const e = d._instance;
|
|
13
|
-
d._instance = new h({ __unsafe_ignore_singleton: !0 })
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
if (d._instance = new h({ __unsafe_ignore_singleton: !0 }), e)
|
|
14
|
+
for (const t of e.keepAliveBlocs)
|
|
15
|
+
d._instance.keepAliveBlocs.add(t), d._instance.uidRegistry.set(t.uid, t);
|
|
16
16
|
}
|
|
17
17
|
};
|
|
18
18
|
n(d, "_instance");
|
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/Blac.ts","../src/BlacObserver.ts","../src/BlocBase.ts","../src/Bloc.ts","../src/Cubit.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n// TODO: Remove this eslint disable once any types are properly replaced\nimport { BlocBase, BlocInstanceId } from \"./BlocBase\";\nimport {\n BlocBaseAbstract,\n BlocConstructor,\n BlocHookDependencyArrayFn,\n BlocState,\n InferPropsFromGeneric\n} from \"./types\";\n\n/**\n * Configuration options for the Blac instance\n */\nexport interface BlacConfig {\n /** Whether to expose the Blac instance globally */\n exposeBlacInstance?: boolean;\n}\n\nexport interface GetBlocOptions<B extends BlocBase<unknown>> {\n id?: string;\n selector?: BlocHookDependencyArrayFn<BlocState<B>>;\n props?: InferPropsFromGeneric<B>;\n onMount?: (bloc: B) => void;\n instanceRef?: string;\n throwIfNotFound?: boolean;\n}\n\n/**\n * Interface for Blac instance management\n */\nexport interface BlacInstanceManager {\n getInstance(): Blac;\n setInstance(instance: Blac): void;\n resetInstance(): void;\n}\n\n/**\n * Default singleton implementation of BlacInstanceManager\n */\nclass SingletonBlacManager implements BlacInstanceManager {\n private static _instance: Blac;\n\n getInstance(): Blac {\n if (!SingletonBlacManager._instance) {\n SingletonBlacManager._instance = new Blac({ __unsafe_ignore_singleton: true });\n }\n return SingletonBlacManager._instance;\n }\n\n setInstance(instance: Blac): void {\n SingletonBlacManager._instance = instance;\n }\n\n resetInstance(): void {\n const oldInstance = SingletonBlacManager._instance;\n SingletonBlacManager._instance = new Blac({ __unsafe_ignore_singleton: true });\n \n // Transfer any keep-alive blocs to the new instance\n for (const bloc of oldInstance.keepAliveBlocs) {\n SingletonBlacManager._instance.keepAliveBlocs.add(bloc);\n SingletonBlacManager._instance.uidRegistry.set(bloc.uid, bloc);\n }\n }\n}\n\n/**\n * Global instance manager (can be replaced for testing or different patterns)\n */\nlet instanceManager: BlacInstanceManager = new SingletonBlacManager();\n\n/**\n * Sets a custom instance manager (useful for testing or advanced patterns)\n */\nexport function setBlacInstanceManager(manager: BlacInstanceManager): void {\n instanceManager = manager;\n}\n\n/**\n * Main Blac class that manages the state management system.\n * Can work with singleton pattern or dependency injection.\n * Handles bloc lifecycle, and instance tracking.\n * \n * Key responsibilities:\n * - Managing bloc instances (creation, disposal, lookup)\n * - Handling isolated and non-isolated blocs\n * - Providing logging and debugging capabilities\n */\nexport class Blac {\n /** @deprecated Use getInstance() instead */\n static get instance(): Blac {\n return instanceManager.getInstance();\n }\n /** Timestamp when the instance was created */\n createdAt = Date.now();\n static get getAllBlocs() {\n return Blac.instance.getAllBlocs;\n }\n /** Map storing all registered bloc instances by their class name and ID */\n blocInstanceMap: Map<string, BlocBase<unknown>> = new Map();\n /** Map storing isolated bloc instances grouped by their constructor */\n isolatedBlocMap: Map<BlocConstructor<unknown>, BlocBase<unknown>[]> = new Map();\n /** Map for O(1) lookup of isolated blocs by UID */\n private isolatedBlocIndex: Map<string, BlocBase<unknown>> = new Map();\n /** Map tracking UIDs to prevent memory leaks */\n uidRegistry: Map<string, BlocBase<unknown>> = new Map();\n /** Set of keep-alive blocs for controlled cleanup */\n keepAliveBlocs: Set<BlocBase<unknown>> = new Set();\n /** Flag to control whether changes should be posted to document */\n postChangesToDocument = false;\n\n /**\n * Creates a new Blac instance.\n * @param options - Configuration options including singleton control\n */\n constructor(options: { __unsafe_ignore_singleton?: boolean } = {}) {\n const { __unsafe_ignore_singleton = false } = options;\n if (!__unsafe_ignore_singleton) {\n return Blac.instance;\n }\n instanceManager.setInstance(this);\n }\n\n /** Flag to enable/disable logging */\n static enableLog = false;\n\n /**\n * Logs messages to console when logging is enabled\n * @param args - Arguments to log\n */\n log = (...args: unknown[]) => {\n if (Blac.enableLog) console.warn(`☢️ [Blac ${this.createdAt.toString()}]`, ...args);\n };\n static get log() { return Blac.instance.log; }\n\n /**\n * Gets the current Blac instance\n * @returns The Blac instance\n */\n static getInstance(): Blac {\n return instanceManager.getInstance();\n }\n\n\n /**\n * Logs a warning message\n * @param message - Warning message\n * @param args - Additional arguments\n */\n warn = (message: string, ...args: unknown[]) => {\n if (Blac.enableLog) {\n console.warn(`🚨 [Blac ${String(Blac.instance.createdAt)}]`, message, ...args);\n }\n };\n static get warn() { return Blac.instance.warn; }\n /**\n * Logs an error message\n * @param message - Error message\n * @param args - Additional arguments\n */\n error = (message: string, ...args: unknown[]) => {\n if (Blac.enableLog) {\n console.error(`🚨 [Blac ${String(Blac.instance.createdAt)}]`, message, ...args);\n }\n };\n static get error() { return Blac.instance.error; }\n\n /**\n * Resets the Blac instance to a new one, disposing non-keepAlive blocs\n * from the old instance.\n */\n resetInstance = (): void => {\n this.log(\"Reset Blac instance\");\n\n // Dispose non-keepAlive blocs from the current instance\n const oldBlocInstanceMap = new Map(this.blocInstanceMap);\n const oldIsolatedBlocMap = new Map(this.isolatedBlocMap);\n\n oldBlocInstanceMap.forEach((bloc) => {\n if (!bloc._keepAlive) {\n bloc._dispose();\n }\n });\n\n oldIsolatedBlocMap.forEach((blocArray) => {\n blocArray.forEach((bloc) => {\n if (!bloc._keepAlive) {\n bloc._dispose();\n }\n });\n });\n\n this.blocInstanceMap.clear();\n this.isolatedBlocMap.clear();\n this.isolatedBlocIndex.clear();\n\n // Use instance manager to reset\n instanceManager.resetInstance();\n }\n static resetInstance = (): void => {\n instanceManager.resetInstance();\n };\n\n /**\n * Disposes of a bloc instance by removing it from the appropriate registry\n * @param bloc - The bloc instance to dispose\n */\n disposeBloc = (bloc: BlocBase<unknown>): void => {\n const base = bloc.constructor as unknown as BlocBaseAbstract;\n const key = this.createBlocInstanceMapKey(bloc._name, bloc._id);\n this.log(`[${bloc._name}:${String(bloc._id)}] disposeBloc called. Isolated: ${String(base.isolated)}`);\n\n if (base.isolated) {\n this.unregisterIsolatedBlocInstance(bloc);\n this.blocInstanceMap.delete(key);\n } else {\n this.unregisterBlocInstance(bloc);\n }\n this.log('dispatched bloc', bloc)\n };\n\n /**\n * Creates a unique key for a bloc instance in the map based on the bloc class name and instance ID\n * @param blocClassName - The name of the bloc class\n * @param id - The instance ID\n * @returns A unique key string in the format \"className:id\"\n */\n createBlocInstanceMapKey(blocClassName: string, id: BlocInstanceId): string {\n return `${blocClassName}:${String(id)}`;\n }\n\n /**\n * Unregister a bloc instance from the main registry\n * @param bloc - The bloc instance to unregister\n */\n unregisterBlocInstance(bloc: BlocBase<unknown>): void {\n const key = this.createBlocInstanceMapKey(bloc._name, bloc._id);\n this.blocInstanceMap.delete(key);\n \n // Clean up UID tracking\n this.uidRegistry.delete(bloc.uid);\n \n // Remove from keep-alive set\n this.keepAliveBlocs.delete(bloc);\n }\n\n /**\n * Registers a bloc instance in the main registry\n * @param bloc - The bloc instance to register\n */\n registerBlocInstance(bloc: BlocBase<unknown>): void {\n const key = this.createBlocInstanceMapKey(bloc._name, bloc._id);\n this.blocInstanceMap.set(key, bloc);\n \n // Track UID for cleanup\n this.uidRegistry.set(bloc.uid, bloc);\n \n // Track keep-alive blocs\n if (bloc._keepAlive) {\n this.keepAliveBlocs.add(bloc);\n }\n }\n\n /**\n * Finds a registered bloc instance by its class and ID\n * @param blocClass - The bloc class to search for\n * @param id - The instance ID\n * @returns The found bloc instance or undefined if not found\n */\n findRegisteredBlocInstance<B extends BlocConstructor<unknown>>(\n blocClass: B,\n id: BlocInstanceId,\n ): InstanceType<B> | undefined {\n const base = blocClass as unknown as BlocBaseAbstract;\n if (base.isolated) return undefined;\n\n const key = this.createBlocInstanceMapKey(blocClass.name, id);\n const found = this.blocInstanceMap.get(key) as InstanceType<B> | undefined;\n return found\n }\n\n /**\n * Registers an isolated bloc instance in the isolated registry\n * @param bloc - The isolated bloc instance to register\n */\n registerIsolatedBlocInstance(bloc: BlocBase<unknown>): void {\n const blocClass = bloc.constructor as BlocConstructor<unknown>;\n const blocs = this.isolatedBlocMap.get(blocClass);\n if (blocs) {\n blocs.push(bloc);\n } else {\n this.isolatedBlocMap.set(blocClass, [bloc]);\n }\n \n // Add to isolated index for O(1) lookups\n this.isolatedBlocIndex.set(bloc.uid, bloc);\n \n // Track UID for cleanup\n this.uidRegistry.set(bloc.uid, bloc);\n \n // Track keep-alive blocs\n if (bloc._keepAlive) {\n this.keepAliveBlocs.add(bloc);\n }\n }\n\n /**\n * Unregister an isolated bloc instance from the isolated registry\n * @param bloc - The isolated bloc instance to unregister\n */\n unregisterIsolatedBlocInstance(bloc: BlocBase<unknown>): void {\n const blocClass = bloc.constructor;\n const blocs = this.isolatedBlocMap.get(blocClass as BlocConstructor<unknown>);\n if (blocs) {\n const index = blocs.findIndex((b) => b.uid === bloc.uid);\n if (index !== -1) {\n blocs.splice(index, 1);\n }\n\n if (blocs.length === 0) {\n this.isolatedBlocMap.delete(blocClass as BlocConstructor<unknown>);\n }\n }\n \n // Remove from isolated index\n this.isolatedBlocIndex.delete(bloc.uid);\n \n // Clean up UID tracking\n this.uidRegistry.delete(bloc.uid);\n \n // Remove from keep-alive set\n this.keepAliveBlocs.delete(bloc);\n }\n\n /**\n * Finds an isolated bloc instance by its class and ID (O(n) lookup)\n */\n findIsolatedBlocInstance<B extends BlocConstructor<unknown>>(\n blocClass: B,\n id: BlocInstanceId,\n ): InstanceType<B> | undefined {\n const base = blocClass as unknown as BlocBaseAbstract;\n if (!base.isolated) return undefined;\n\n const blocs = this.isolatedBlocMap.get(blocClass);\n if (!blocs) {\n return undefined;\n }\n // Find the specific bloc by ID within the isolated array\n const found = blocs.find((b) => b._id === id) as InstanceType<B> | undefined;\n return found;\n }\n\n /**\n * Finds an isolated bloc instance by UID (O(1) lookup)\n */\n findIsolatedBlocInstanceByUid<B extends BlocBase<unknown>>(\n uid: string\n ): B | undefined {\n return this.isolatedBlocIndex.get(uid) as B | undefined;\n }\n\n /**\n * Creates a new bloc instance and registers it in the appropriate registry\n * @param blocClass - The bloc class to instantiate\n * @param id - The instance ID\n * @param props - Properties to pass to the bloc constructor\n * @param instanceRef - Optional reference string for the instance\n * @returns The newly created bloc instance\n */\n createNewBlocInstance<B extends BlocConstructor<BlocBase<unknown>>>(\n blocClass: B,\n id: BlocInstanceId,\n options: GetBlocOptions<InstanceType<B>> = {},\n ): InstanceType<B> {\n const { props, instanceRef } = options;\n const newBloc = new blocClass(props as never) as InstanceType<BlocConstructor<BlocBase<unknown>>>;\n newBloc._instanceRef = instanceRef;\n newBloc.props = props || null;\n newBloc._updateId(id);\n\n // Set up disposal handler to break circular dependency\n newBloc._setDisposalHandler((bloc) => this.disposeBloc(bloc));\n\n if (newBloc.isIsolated) {\n this.registerIsolatedBlocInstance(newBloc);\n return newBloc as InstanceType<B>;\n }\n\n this.registerBlocInstance(newBloc);\n return newBloc as InstanceType<B>;\n }\n\n\n activateBloc = (bloc: BlocBase<unknown>): void => {\n const base = bloc.constructor as unknown as BlocConstructor<BlocBase<unknown>>;\n const isIsolated = bloc.isIsolated;\n\n let found = isIsolated ? this.findIsolatedBlocInstance(base, bloc._id) : this.findRegisteredBlocInstance(base, bloc._id);\n if (found) {\n return;\n }\n\n this.log(`[${bloc._name}:${String(bloc._id)}] activateBloc called. Isolated: ${String(bloc.isIsolated)}`);\n if (bloc.isIsolated) {\n this.registerIsolatedBlocInstance(bloc);\n } else {\n this.registerBlocInstance(bloc);\n }\n };\n static get activateBloc() { return Blac.instance.activateBloc; }\n\n /**\n * Gets or creates a bloc instance based on the provided class and options.\n * If a bloc with the given ID exists, it will be returned. Otherwise, a new instance will be created.\n * \n * @param blocClass - The bloc class to get or create\n * @param options - Options including:\n * - id: The instance ID (defaults to class name if not provided)\n * - props: Properties to pass to the bloc constructor\n * - instanceRef: Optional reference string for the instance\n * @returns The bloc instance\n */\n getBloc = <B extends BlocConstructor<BlocBase<unknown>>>(\n blocClass: B,\n options: GetBlocOptions<InstanceType<B>> = {},\n ): InstanceType<B> => {\n const { id } = options;\n const base = blocClass as unknown as BlocBaseAbstract;\n const blocId = id ?? blocClass.name;\n\n\n if (base.isolated) {\n const isolatedBloc = this.findIsolatedBlocInstance<B>(blocClass, blocId)\n if (isolatedBloc) {\n this.log(`[${blocClass.name}:${String(blocId)}] (getBloc) Found existing isolated instance.`, options);\n return isolatedBloc;\n } else {\n if (options.throwIfNotFound) {\n throw new Error(`Isolated bloc ${blocClass.name} not found`);\n }\n }\n } else {\n const registeredBloc = this.findRegisteredBlocInstance(blocClass, blocId)\n if (registeredBloc) {\n this.log(`[${blocClass.name}:${String(blocId)}] (getBloc) Found existing registered instance.`, options);\n return registeredBloc\n } else {\n if (options.throwIfNotFound) {\n throw new Error(`Registered bloc ${blocClass.name} not found`);\n }\n }\n }\n\n const bloc = this.createNewBlocInstance(\n blocClass,\n blocId,\n options,\n );\n this.log(`[${blocClass.name}:${String(blocId)}] (getBloc) No existing instance found. Creating new one.`, options, bloc);\n return bloc;\n };\n static get getBloc() { return Blac.instance.getBloc; }\n\n /**\n * Gets a bloc instance or throws an error if it doesn't exist\n * @param blocClass - The bloc class to get\n * @param options - Options including:\n * - id: The instance ID (defaults to class name if not provided)\n * - props: Properties to pass to the bloc constructor\n * - instanceRef: Optional reference string for the instance\n */\n getBlocOrThrow = <B extends BlocConstructor<unknown>>(\n blocClass: B,\n options: {\n id?: BlocInstanceId;\n props?: InferPropsFromGeneric<B>;\n instanceRef?: string;\n } = {},\n ): InstanceType<B> => {\n const isIsolated = (blocClass as unknown as BlocBaseAbstract).isolated;\n const id = options.id || blocClass.name;\n\n const registered = isIsolated\n ? this.findIsolatedBlocInstance(blocClass, id)\n : this.findRegisteredBlocInstance(blocClass, id);\n\n if (registered) {\n return registered;\n }\n throw new Error(`Bloc ${blocClass.name} not found`);\n };\n static get getBlocOrThrow() { return Blac.instance.getBlocOrThrow; }\n\n /**\n * Gets all instances of a specific bloc class\n * @param blocClass - The bloc class to search for\n * @param options - Options including:\n * - searchIsolated: Whether to search in isolated blocs (defaults to bloc's isolated property)\n * @returns Array of matching bloc instances\n */\n getAllBlocs = <B extends BlocConstructor<unknown>>(\n blocClass: B,\n options: {\n searchIsolated?: boolean;\n } = {},\n ): InstanceType<B>[] => {\n const results: InstanceType<B>[] = [];\n // const blocClassName = (blocClass as any).name; // Temporarily removed for debugging\n\n // Search non-isolated blocs\n this.blocInstanceMap.forEach((blocInstance) => {\n if (blocInstance.constructor === blocClass) { // Strict constructor check\n results.push(blocInstance as InstanceType<B>);\n }\n });\n\n // Optionally search isolated blocs\n if (options.searchIsolated !== false) {\n const isolatedBlocs = this.isolatedBlocMap.get(blocClass);\n if (isolatedBlocs) {\n results.push(...isolatedBlocs.map(bloc => bloc as InstanceType<B>));\n }\n }\n\n return results;\n };\n\n /**\n * Disposes all keep-alive blocs of a specific type\n * @param blocClass - The bloc class to dispose\n */\n disposeKeepAliveBlocs = <B extends BlocConstructor<unknown>>(\n blocClass?: B\n ): void => {\n const toDispose: BlocBase<unknown>[] = [];\n \n for (const bloc of this.keepAliveBlocs) {\n if (!blocClass || bloc.constructor === blocClass) {\n toDispose.push(bloc);\n }\n }\n \n toDispose.forEach(bloc => bloc._dispose());\n };\n static get disposeKeepAliveBlocs() { return Blac.instance.disposeKeepAliveBlocs; }\n\n /**\n * Disposes all blocs matching a pattern\n * @param predicate - Function to test each bloc for disposal\n */\n disposeBlocs = (predicate: (bloc: BlocBase<unknown>) => boolean): void => {\n const toDispose: BlocBase<unknown>[] = [];\n \n // Check registered blocs\n for (const bloc of this.blocInstanceMap.values()) {\n if (predicate(bloc)) {\n toDispose.push(bloc);\n }\n }\n \n // Check isolated blocs\n for (const blocs of this.isolatedBlocMap.values()) {\n for (const bloc of blocs) {\n if (predicate(bloc)) {\n toDispose.push(bloc);\n }\n }\n }\n \n toDispose.forEach(bloc => bloc._dispose());\n };\n static get disposeBlocs() { return Blac.instance.disposeBlocs; }\n\n /**\n * Gets memory usage statistics for debugging\n */\n getMemoryStats = () => {\n return {\n totalBlocs: this.uidRegistry.size,\n registeredBlocs: this.blocInstanceMap.size,\n isolatedBlocs: Array.from(this.isolatedBlocMap.values()).reduce((sum, arr) => sum + arr.length, 0),\n keepAliveBlocs: this.keepAliveBlocs.size,\n isolatedBlocTypes: this.isolatedBlocMap.size,\n };\n };\n static get getMemoryStats() { return Blac.instance.getMemoryStats; }\n\n /**\n * Validates consumer references and cleans up orphaned consumers\n */\n validateConsumers = (): void => {\n for (const bloc of this.uidRegistry.values()) {\n // This would need to be called periodically to clean up orphaned consumers\n // Implementation depends on how we want to handle consumer validation\n if (bloc._consumers.size === 0 && !bloc._keepAlive) {\n // Schedule disposal for blocs with no consumers\n setTimeout(() => {\n if (bloc._consumers.size === 0 && !bloc._keepAlive) {\n bloc._dispose();\n }\n }, 1000); // Give a grace period\n }\n }\n };\n static get validateConsumers() { return Blac.instance.validateConsumers; }\n}\n","import { Blac } from './Blac';\nimport { BlocBase } from './BlocBase';\nimport { BlocHookDependencyArrayFn } from './types';\n\n/**\n * Represents an observer that can subscribe to state changes in a Bloc\n * @template S - The type of state being observed\n */\nexport type BlacObserver<S> = {\n /** Function to be called when state changes */\n fn: (newState: S, oldState: S, action?: unknown) => void | Promise<void>;\n /** Optional function to determine if the observer should be notified of state changes */\n dependencyArray?: BlocHookDependencyArrayFn<S>;\n /** Dispose function for the observer */\n dispose?: () => void;\n /** Cached state values used for dependency comparison */\n lastState?: unknown[][];\n /** Unique identifier for the observer */\n id: string;\n};\n\n/**\n * A class that manages observers for a Bloc's state changes\n * @template S - The type of state being observed\n */\nexport class BlacObservable<S = unknown> {\n /** The Bloc instance this observable is associated with */\n bloc: BlocBase<S>;\n\n /**\n * Creates a new BlacObservable instance\n * @param bloc - The Bloc instance to observe\n */\n constructor(bloc: BlocBase<S>) {\n this.bloc = bloc;\n }\n\n private _observers = new Set<BlacObserver<S>>();\n\n /**\n * Gets the number of active observers\n * @returns The number of observers currently subscribed\n */\n get size(): number {\n return this._observers.size;\n }\n\n /**\n * Gets the set of all observers\n * @returns The Set of all BlacObserver instances\n */\n get observers() {\n return this._observers;\n }\n\n /**\n * Subscribes an observer to state changes\n * @param observer - The observer to subscribe\n * @returns A function that can be called to unsubscribe the observer\n */\n subscribe(observer: BlacObserver<S>): () => void {\n Blac.log('BlacObservable.subscribe: Subscribing observer.', this.bloc, observer);\n this._observers.add(observer);\n // Blac.instance.dispatchEvent(BlacLifecycleEvent.LISTENER_ADDED, this.bloc, { listenerId: observer.id });\n if (!observer.lastState) {\n observer.lastState = observer.dependencyArray\n ? observer.dependencyArray(this.bloc.state)\n : [];\n }\n return () => {\n Blac.log('BlacObservable.subscribe: Unsubscribing observer.', this.bloc, observer);\n this.unsubscribe(observer);\n }\n }\n\n /**\n * Unsubscribes an observer from state changes\n * @param observer - The observer to unsubscribe\n */\n unsubscribe(observer: BlacObserver<S>) {\n this._observers.delete(observer);\n // Blac.instance.dispatchEvent(BlacLifecycleEvent.LISTENER_REMOVED, this.bloc, { listenerId: observer.id });\n\n if (this.size === 0) {\n Blac.log('BlacObservable.unsubscribe: No observers left. Disposing bloc.', this.bloc);\n this.bloc._dispose();\n }\n }\n\n /**\n * Notifies all observers of a state change\n * @param newState - The new state value\n * @param oldState - The previous state value\n * @param action - Optional action that triggered the state change\n */\n notify(newState: S, oldState: S, action?: unknown) {\n this._observers.forEach((observer) => {\n let shouldUpdate = false;\n\n if (observer.dependencyArray) {\n const lastDependencyCheck = observer.lastState || [];\n const newDependencyCheck = observer.dependencyArray(newState);\n\n for (let o = 0; o < newDependencyCheck.length; o++) {\n const partNew = newDependencyCheck[o];\n const partOld = lastDependencyCheck[o] || [];\n for (let i = 0; i < partNew.length; i++) {\n if (!Object.is(partNew[i], partOld[i])) {\n shouldUpdate = true;\n break;\n }\n }\n }\n\n observer.lastState = newDependencyCheck;\n } else {\n shouldUpdate = true;\n }\n\n if (shouldUpdate) {\n void observer.fn(newState, oldState, action);\n }\n });\n }\n\n /**\n * Clears the observer set\n */\n clear() {\n this._observers.forEach((observer) => {\n this.unsubscribe(observer);\n });\n this._observers.clear();\n }\n}\n","import { BlacObservable } from './BlacObserver';\nimport { BlocConstructor } from './types';\n\nexport type BlocInstanceId = string | number | undefined;\ntype DependencySelector<S> = (newState: S) => unknown[][];\n\n// Define an interface for the static properties expected on a Bloc/Cubit constructor\ninterface BlocStaticProperties {\n isolated: boolean;\n keepAlive: boolean;\n}\n\n/**\n * Base class for both Blocs and Cubits that provides core state management functionality.\n * Handles state transitions, observer notifications, lifecycle management, and addon integration.\n * \n * @abstract This class should be extended, not instantiated directly\n * @template S The type of state managed by this Bloc\n * @template P The type of props that can be passed during instance creation (optional)\n */\nexport abstract class BlocBase<\n S,\n P = unknown\n> {\n public uid = crypto.randomUUID();\n /**\n * When true, every consumer will receive its own unique instance of this Bloc.\n * Use this when state should not be shared between components.\n * @default false\n */\n static isolated = false;\n get isIsolated() {\n return this._isolated;\n }\n \n /**\n * When true, the Bloc instance persists even when there are no active consumers.\n * Useful for maintaining state between component unmount/remount cycles.\n * @default false\n */\n static keepAlive = false;\n get isKeepAlive() {\n return this._keepAlive;\n }\n \n /**\n * Defines how dependencies are selected from the state for efficient updates.\n * When provided, observers will only be notified when selected dependencies change.\n */\n defaultDependencySelector: DependencySelector<S> | undefined;\n \n /**\n * @internal\n * Indicates if this specific Bloc instance is isolated from others of the same type.\n */\n public _isolated = false;\n \n /**\n * @internal\n * Observable responsible for managing state listeners and notifying consumers.\n */\n public _observer: BlacObservable<S>;\n \n /**\n * The unique identifier for this Bloc instance.\n * Defaults to the class name, but can be customized.\n */\n public _id: BlocInstanceId;\n \n /**\n * @internal\n * Reference string used internally for tracking and debugging.\n */\n public _instanceRef?: string;\n \n /**\n * @internal\n * Indicates if this specific Bloc instance should be kept alive when no consumers are present.\n */\n public _keepAlive = false;\n \n /**\n * @readonly\n * Timestamp when this Bloc instance was created, useful for debugging and performance tracking.\n */\n public readonly _createdAt = Date.now();\n\n /**\n * @internal\n * The current state of the Bloc.\n */\n public _state: S;\n \n /**\n * @internal\n * The previous state of the Bloc, maintained for comparison and history.\n */\n public _oldState: S | undefined;\n \n /**\n * Props passed during Bloc instance creation.\n * Can be used to configure or parameterize the Bloc's behavior.\n */\n public props: P | null = null;\n\n /**\n * Creates a new BlocBase instance with the given initial state.\n * Sets up the observer, registers with the Blac manager, and initializes addons.\n * \n * @param initialState The initial state value for this Bloc\n */\n constructor(initialState: S) {\n this._state = initialState;\n this._observer = new BlacObservable(this);\n this._id = this.constructor.name;\n\n // Access static properties safely with proper type checking\n const Constructor = this.constructor as typeof BlocBase & BlocStaticProperties;\n \n // Validate that the static properties exist and are boolean\n this._keepAlive = typeof Constructor.keepAlive === 'boolean' ? Constructor.keepAlive : false;\n this._isolated = typeof Constructor.isolated === 'boolean' ? Constructor.isolated : false;\n }\n\n /**\n * Returns the current state of the Bloc.\n * Use this getter to access the state in a read-only manner.\n */\n get state(): S {\n return this._state;\n }\n\n /**\n * @internal\n * Returns the name of the Bloc class for identification and debugging.\n */\n get _name() {\n return this.constructor.name;\n }\n\n /**\n * @internal\n * Updates the Bloc instance's ID to a new value.\n * Only updates if the new ID is defined and different from the current one.\n * \n * @param id The new ID to assign to this Bloc instance\n */\n _updateId = (id?: BlocInstanceId) => {\n const originalId = this._id;\n if (!id || id === originalId) return;\n this._id = id;\n };\n\n /**\n * @internal\n * Cleans up resources and removes this Bloc from the system.\n * Notifies the Blac manager and clears all observers.\n */\n _dispose() {\n // Clear all consumers\n this._consumers.clear();\n \n // Clear observer subscriptions\n this._observer.clear();\n \n // Call user-defined disposal hook\n this.onDispose?.();\n \n // The Blac manager will handle removal from registry\n // This method is called by Blac.disposeBloc, so we don't need to call it again\n }\n\n /**\n * @internal\n * Optional function to be called when the Bloc is disposed.\n */\n onDispose?: () => void;\n\n /**\n * @internal\n * Set of consumer IDs currently listening to this Bloc's state changes.\n */\n _consumers = new Set<string>();\n\n /**\n * @internal\n * WeakSet to track consumer references for cleanup validation\n */\n private _consumerRefs = new WeakSet<object>();\n\n /**\n * @internal\n * Registers a new consumer to this Bloc instance.\n * Notifies the Blac manager that a consumer has been added.\n * \n * @param consumerId The unique ID of the consumer being added\n * @param consumerRef Optional reference to the consumer object for cleanup validation\n */\n _addConsumer = (consumerId: string, consumerRef?: object) => {\n if (this._consumers.has(consumerId)) return;\n this._consumers.add(consumerId);\n \n if (consumerRef) {\n this._consumerRefs.add(consumerRef);\n }\n \n // this._blac.dispatchEvent(BlacLifecycleEvent.BLOC_CONSUMER_ADDED, this, { consumerId });\n };\n\n /**\n * @internal\n * Unregisters a consumer from this Bloc instance.\n * Notifies the Blac manager that a consumer has been removed.\n * \n * @param consumerId The unique ID of the consumer being removed\n */\n _removeConsumer = (consumerId: string) => {\n if (!this._consumers.has(consumerId)) return;\n this._consumers.delete(consumerId);\n // this._blac.dispatchEvent(BlacLifecycleEvent.BLOC_CONSUMER_REMOVED, this, { consumerId });\n \n // If no consumers remain and not keep-alive, schedule disposal\n if (this._consumers.size === 0 && !this._keepAlive) {\n this._scheduleDisposal();\n }\n };\n\n /**\n * @internal\n * Handler function for disposal (can be set by Blac manager)\n */\n private _disposalHandler?: (bloc: BlocBase<unknown>) => void;\n\n /**\n * @internal\n * Sets the disposal handler for this bloc\n */\n _setDisposalHandler(handler: (bloc: BlocBase<unknown>) => void) {\n this._disposalHandler = handler;\n }\n\n /**\n * @internal\n * Schedules disposal of this bloc instance if it has no consumers\n */\n private _scheduleDisposal() {\n // Use setTimeout to avoid disposal during render cycles\n setTimeout(() => {\n if (this._consumers.size === 0 && !this._keepAlive) {\n if (this._disposalHandler) {\n this._disposalHandler(this as any);\n } else {\n this._dispose();\n }\n }\n }, 0);\n }\n\n lastUpdate = Date.now();\n\n /**\n * @internal\n * Flag to indicate if batching is enabled for this bloc\n */\n private _batchingEnabled = false;\n\n /**\n * @internal\n * Pending state updates when batching is enabled\n */\n private _pendingUpdates: Array<{newState: S, oldState: S, action?: unknown}> = [];\n\n /**\n * @internal\n * Updates the state and notifies all observers of the change.\n * \n * @param newState The new state to be set\n * @param oldState The previous state for comparison\n * @param action Optional metadata about what caused the state change\n */\n _pushState = (newState: S, oldState: S, action?: unknown): void => {\n // Runtime validation for state changes\n if (newState === undefined) {\n console.warn('BlocBase._pushState: newState is undefined', this);\n return;\n }\n \n // Validate action type if provided\n if (action !== undefined && action !== null) {\n const actionType = typeof action;\n if (!(['string', 'object', 'number'].includes(actionType))) {\n console.warn('BlocBase._pushState: Invalid action type', this, action);\n }\n }\n\n // If batching is enabled, queue the update\n if (this._batchingEnabled) {\n this._pendingUpdates.push({ newState, oldState, action });\n return;\n }\n \n this._oldState = oldState;\n this._state = newState;\n this._observer.notify(newState, oldState, action);\n this.lastUpdate = Date.now();\n };\n\n /**\n * Enables batching for multiple state updates\n * @param batchFn Function to execute with batching enabled\n */\n batch = <T>(batchFn: () => T): T => {\n const wasBatching = this._batchingEnabled;\n this._batchingEnabled = true;\n \n try {\n const result = batchFn();\n \n // Process all pending updates\n if (this._pendingUpdates.length > 0) {\n const lastUpdate = this._pendingUpdates[this._pendingUpdates.length - 1];\n this._oldState = this._pendingUpdates[0].oldState;\n this._state = lastUpdate.newState;\n \n // Notify with the final state\n this._observer.notify(lastUpdate.newState, this._oldState, lastUpdate.action);\n this.lastUpdate = Date.now();\n \n this._pendingUpdates = [];\n }\n \n return result;\n } finally {\n this._batchingEnabled = wasBatching;\n }\n };\n}\n","import { Blac } from './Blac';\nimport { BlocBase } from './BlocBase';\n\n// A should be the base type for all events this Bloc handles and must be an object type\n// to access action.constructor. Events are typically class instances.\n// P is for props, changed from any to unknown.\nexport abstract class Bloc<\n S, // State type\n A extends object, // Base Action/Event type, constrained to object\n P = unknown // Props type\n> extends BlocBase<S, P> {\n // Stores handlers: Map<EventConstructor (subtype of A), HandlerFunction>\n // The handler's event parameter will be correctly typed to the specific EventConstructor\n // by the 'on' method's signature.\n readonly eventHandlers: Map<\n // Key: Constructor of a specific event E (where E extends A)\n // Using 'any[]' for constructor arguments for broader compatibility.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]) => A,\n // Value: Handler function. 'event: A' is used here for the stored function type.\n // The 'on' method ensures the specific handler (event: E) is correctly typed.\n (event: A, emit: (newState: S) => void) => void | Promise<void>\n > = new Map();\n\n /**\n * Registers an event handler for a specific event type.\n * This method is typically called in the constructor of a derived Bloc class.\n * @param eventConstructor The constructor of the event to handle (e.g., LoadDataEvent).\n * @param handler A function that processes the event and can emit new states.\n * The 'event' parameter in the handler will be typed to the specific eventConstructor.\n */\n protected on<E extends A>(\n // Using 'any[]' for constructor arguments for broader compatibility.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n eventConstructor: new (...args: any[]) => E, \n handler: (event: E, emit: (newState: S) => void) => void | Promise<void>\n ): void {\n if (this.eventHandlers.has(eventConstructor)) {\n // Using Blac.warn or a similar logging mechanism from BlocBase if available,\n // otherwise console.warn. Assuming this._name and this._id are available from BlocBase.\n Blac.warn(\n `[Bloc ${this._name}:${String(this._id)}] Handler for event '${eventConstructor.name}' already registered. It will be overwritten.`\n );\n }\n // Cast the specific handler (event: E) to a more general (event: A) for storage.\n // This is safe because E extends A. When the handler is called with an 'action' of type A,\n // if it was originally registered for type E, 'action' must be an instance of E.\n this.eventHandlers.set(\n eventConstructor,\n handler as (event: A, emit: (newState: S) => void) => void | Promise<void>\n );\n }\n\n /**\n * Dispatches an action/event to the Bloc.\n * If a handler is registered for this specific event type (via 'on'), it will be invoked.\n * Asynchronous handlers are awaited.\n * @param action The action/event instance to be processed.\n */\n public add = async (action: A): Promise<void> => {\n // Using 'any[]' for constructor arguments for broader compatibility.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const eventConstructor = action.constructor as new (...args: any[]) => A;\n const handler = this.eventHandlers.get(eventConstructor);\n\n if (handler) {\n // Define the 'emit' function that handlers will use to update state.\n // It captures the current state ('this.state') right before each emission\n // to provide the correct 'previousState' to _pushState.\n const emit = (newState: S): void => {\n const previousState = this.state; // State just before this specific emission\n // The 'action' passed to _pushState is the original action that triggered the handler,\n // providing context for the state change (e.g., for logging or plugins).\n this._pushState(newState, previousState, action);\n };\n\n try {\n // Await the handler in case it's an async function (e.g., performs API calls).\n // The 'action' is passed to the handler, and due to the way 'on' is typed,\n // the 'event' parameter within the handler function will be correctly\n // typed to its specific class (e.g., LoadMyFeatureData).\n await handler(action, emit);\n } catch (error) {\n // It's good practice to handle errors occurring within event handlers.\n Blac.error(\n `[Bloc ${this._name}:${String(this._id)}] Error in event handler for '${eventConstructor.name}':`,\n error,\n \"Action:\", action\n );\n // Depending on the desired error handling strategy, you might:\n // 1. Emit a specific error state: this.emit(new MyErrorState(error));\n // 2. Re-throw the error: throw error;\n // 3. Log and ignore (as done here by default).\n // This should be decided based on application requirements.\n }\n } else {\n // action.constructor.name should be safe due to 'A extends object' and common JS practice for constructors.\n // If linting still complains, it might be overly strict for this common pattern.\n const constructorName = (action.constructor as { name?: string }).name || 'UnnamedConstructor';\n Blac.warn(\n `[Bloc ${this._name}:${String(this._id)}] No handler registered for action type: '${constructorName}'. Action was:`,\n action\n );\n // If no handler is found, the action is effectively ignored.\n // Consider if this is the desired behavior or if an error should be thrown\n // or a default handler should be invoked.\n }\n };\n}\n","import { Blac } from './Blac';\nimport { BlocBase } from './BlocBase';\n\n/**\n * A Cubit is a simpler version of a Bloc that doesn't handle events.\n * It manages state and provides methods to update it.\n * @template S - The type of state this Cubit manages\n * @template P - The type of parameters (optional, defaults to null)\n */\nexport abstract class Cubit<S, P = null> extends BlocBase<S, P> {\n /**\n * Updates the current state and notifies all observers of the change.\n * If the new state is identical to the current state (using Object.is),\n * no update will occur.\n * @param state - The new state to set\n */\n emit(state: S): void {\n if (Object.is(state, this.state)) {\n return;\n }\n\n const oldState = this.state;\n const newState = state;\n this._pushState(newState, oldState);\n }\n\n /**\n * Partially updates the current state by merging it with the provided state patch.\n * This method is only applicable when the state is an object type.\n * \n * @param statePatch - A partial state object containing only the properties to update\n * @param ignoreChangeCheck - If true, skips checking if the state has actually changed\n * @throws {TypeError} If the state is not an object type\n */\n patch(\n statePatch: S extends object ? Partial<S> : S,\n ignoreChangeCheck = false,\n ): void {\n if (typeof this.state !== 'object' || this.state === null) {\n Blac.warn(\n 'Cubit.patch: was called on a cubit where the state is not an object. This is a no-op.',\n );\n return;\n }\n\n let changes = false;\n if (!ignoreChangeCheck) {\n for (const key in statePatch) {\n if (Object.prototype.hasOwnProperty.call(statePatch, key)) {\n const s = this.state;\n const current = s[key as keyof S];\n if (!Object.is(statePatch[key as keyof S], current)) {\n changes = true;\n break;\n }\n }\n }\n } else {\n changes = true;\n }\n\n if (changes) {\n this.emit({\n ...this.state,\n ...(statePatch as Partial<S>),\n } as S);\n }\n }\n}\n"],"names":["_SingletonBlacManager","Blac","instance","oldInstance","bloc","__publicField","SingletonBlacManager","instanceManager","setBlacInstanceManager","manager","_Blac","options","args","message","oldBlocInstanceMap","oldIsolatedBlocMap","blocArray","base","key","blocClass","id","blocId","isolatedBloc","registeredBloc","isIsolated","registered","results","blocInstance","isolatedBlocs","toDispose","predicate","blocs","sum","arr","__unsafe_ignore_singleton","blocClassName","index","b","uid","props","instanceRef","newBloc","BlacObservable","observer","newState","oldState","action","shouldUpdate","lastDependencyCheck","newDependencyCheck","o","partNew","partOld","i","BlocBase","initialState","originalId","consumerId","consumerRef","actionType","batchFn","wasBatching","result","lastUpdate","Constructor","_a","handler","Bloc","eventConstructor","emit","previousState","error","constructorName","Cubit","state","statePatch","ignoreChangeCheck","changes","current"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/Blac.ts","../src/BlacObserver.ts","../src/BlocBase.ts","../src/Bloc.ts","../src/Cubit.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n// TODO: Remove this eslint disable once any types are properly replaced\nimport { BlocBase, BlocInstanceId } from \"./BlocBase\";\nimport {\n BlocBaseAbstract,\n BlocConstructor,\n BlocHookDependencyArrayFn,\n BlocState,\n InferPropsFromGeneric\n} from \"./types\";\n\n/**\n * Configuration options for the Blac instance\n */\nexport interface BlacConfig {\n /** Whether to expose the Blac instance globally */\n exposeBlacInstance?: boolean;\n}\n\nexport interface GetBlocOptions<B extends BlocBase<unknown>> {\n id?: string;\n selector?: BlocHookDependencyArrayFn<BlocState<B>>;\n props?: InferPropsFromGeneric<B>;\n onMount?: (bloc: B) => void;\n instanceRef?: string;\n throwIfNotFound?: boolean;\n}\n\n/**\n * Interface for Blac instance management\n */\nexport interface BlacInstanceManager {\n getInstance(): Blac;\n setInstance(instance: Blac): void;\n resetInstance(): void;\n}\n\n/**\n * Default singleton implementation of BlacInstanceManager\n */\nclass SingletonBlacManager implements BlacInstanceManager {\n private static _instance: Blac;\n\n getInstance(): Blac {\n if (!SingletonBlacManager._instance) {\n SingletonBlacManager._instance = new Blac({ __unsafe_ignore_singleton: true });\n }\n return SingletonBlacManager._instance;\n }\n\n setInstance(instance: Blac): void {\n SingletonBlacManager._instance = instance;\n }\n\n resetInstance(): void {\n const oldInstance = SingletonBlacManager._instance;\n SingletonBlacManager._instance = new Blac({ __unsafe_ignore_singleton: true });\n \n // Transfer any keep-alive blocs to the new instance\n if (oldInstance) {\n for (const bloc of oldInstance.keepAliveBlocs) {\n SingletonBlacManager._instance.keepAliveBlocs.add(bloc);\n SingletonBlacManager._instance.uidRegistry.set(bloc.uid, bloc);\n }\n }\n }\n}\n\n/**\n * Global instance manager (can be replaced for testing or different patterns)\n */\nlet instanceManager: BlacInstanceManager = new SingletonBlacManager();\n\n/**\n * Sets a custom instance manager (useful for testing or advanced patterns)\n */\nexport function setBlacInstanceManager(manager: BlacInstanceManager): void {\n instanceManager = manager;\n}\n\n/**\n * Main Blac class that manages the state management system.\n * Can work with singleton pattern or dependency injection.\n * Handles bloc lifecycle, and instance tracking.\n * \n * Key responsibilities:\n * - Managing bloc instances (creation, disposal, lookup)\n * - Handling isolated and non-isolated blocs\n * - Providing logging and debugging capabilities\n */\nexport class Blac {\n /** @deprecated Use getInstance() instead */\n static get instance(): Blac {\n return instanceManager.getInstance();\n }\n /** Timestamp when the instance was created */\n createdAt = Date.now();\n static get getAllBlocs() {\n return Blac.instance.getAllBlocs;\n }\n /** Map storing all registered bloc instances by their class name and ID */\n blocInstanceMap: Map<string, BlocBase<unknown>> = new Map();\n /** Map storing isolated bloc instances grouped by their constructor */\n isolatedBlocMap: Map<BlocConstructor<any>, BlocBase<unknown>[]> = new Map();\n /** Map for O(1) lookup of isolated blocs by UID */\n private isolatedBlocIndex: Map<string, BlocBase<unknown>> = new Map();\n /** Map tracking UIDs to prevent memory leaks */\n uidRegistry: Map<string, BlocBase<unknown>> = new Map();\n /** Set of keep-alive blocs for controlled cleanup */\n keepAliveBlocs: Set<BlocBase<unknown>> = new Set();\n /** Flag to control whether changes should be posted to document */\n postChangesToDocument = false;\n\n /**\n * Creates a new Blac instance.\n * @param options - Configuration options including singleton control\n */\n constructor(options: { __unsafe_ignore_singleton?: boolean } = {}) {\n const { __unsafe_ignore_singleton = false } = options;\n if (!__unsafe_ignore_singleton) {\n return Blac.instance;\n }\n instanceManager.setInstance(this);\n }\n\n /** Flag to enable/disable logging */\n static enableLog = false;\n\n /**\n * Logs messages to console when logging is enabled\n * @param args - Arguments to log\n */\n log = (...args: unknown[]) => {\n if (Blac.enableLog) console.warn(`☢️ [Blac ${this.createdAt.toString()}]`, ...args);\n };\n static get log() { return Blac.instance.log; }\n\n /**\n * Gets the current Blac instance\n * @returns The Blac instance\n */\n static getInstance(): Blac {\n return instanceManager.getInstance();\n }\n\n\n /**\n * Logs a warning message\n * @param message - Warning message\n * @param args - Additional arguments\n */\n warn = (message: string, ...args: unknown[]) => {\n if (Blac.enableLog) {\n console.warn(`🚨 [Blac ${String(Blac.instance.createdAt)}]`, message, ...args);\n }\n };\n static get warn() { return Blac.instance.warn; }\n /**\n * Logs an error message\n * @param message - Error message\n * @param args - Additional arguments\n */\n error = (message: string, ...args: unknown[]) => {\n if (Blac.enableLog) {\n console.error(`🚨 [Blac ${String(Blac.instance.createdAt)}]`, message, ...args);\n }\n };\n static get error() { return Blac.instance.error; }\n\n /**\n * Resets the Blac instance to a new one, disposing non-keepAlive blocs\n * from the old instance.\n */\n resetInstance = (): void => {\n this.log(\"Reset Blac instance\");\n\n // Dispose non-keepAlive blocs from the current instance\n const oldBlocInstanceMap = new Map(this.blocInstanceMap);\n const oldIsolatedBlocMap = new Map(this.isolatedBlocMap);\n\n oldBlocInstanceMap.forEach((bloc) => {\n if (!bloc._keepAlive) {\n bloc._dispose();\n }\n });\n\n oldIsolatedBlocMap.forEach((blocArray) => {\n blocArray.forEach((bloc) => {\n if (!bloc._keepAlive) {\n bloc._dispose();\n }\n });\n });\n\n this.blocInstanceMap.clear();\n this.isolatedBlocMap.clear();\n this.isolatedBlocIndex.clear();\n\n // Use instance manager to reset\n instanceManager.resetInstance();\n }\n static resetInstance = (): void => {\n instanceManager.resetInstance();\n };\n\n /**\n * Disposes of a bloc instance by removing it from the appropriate registry\n * @param bloc - The bloc instance to dispose\n */\n disposeBloc = (bloc: BlocBase<unknown>): void => {\n const base = bloc.constructor as unknown as BlocBaseAbstract;\n const key = this.createBlocInstanceMapKey(bloc._name, bloc._id);\n this.log(`[${bloc._name}:${String(bloc._id)}] disposeBloc called. Isolated: ${String(base.isolated)}`);\n\n if (base.isolated) {\n this.unregisterIsolatedBlocInstance(bloc);\n this.blocInstanceMap.delete(key);\n } else {\n this.unregisterBlocInstance(bloc);\n }\n this.log('dispatched bloc', bloc)\n };\n\n /**\n * Creates a unique key for a bloc instance in the map based on the bloc class name and instance ID\n * @param blocClassName - The name of the bloc class\n * @param id - The instance ID\n * @returns A unique key string in the format \"className:id\"\n */\n createBlocInstanceMapKey(blocClassName: string, id: BlocInstanceId): string {\n return `${blocClassName}:${String(id)}`;\n }\n\n /**\n * Unregister a bloc instance from the main registry\n * @param bloc - The bloc instance to unregister\n */\n unregisterBlocInstance(bloc: BlocBase<unknown>): void {\n const key = this.createBlocInstanceMapKey(bloc._name, bloc._id);\n this.blocInstanceMap.delete(key);\n \n // Clean up UID tracking\n this.uidRegistry.delete(bloc.uid);\n \n // Remove from keep-alive set\n this.keepAliveBlocs.delete(bloc);\n }\n\n /**\n * Registers a bloc instance in the main registry\n * @param bloc - The bloc instance to register\n */\n registerBlocInstance(bloc: BlocBase<unknown>): void {\n const key = this.createBlocInstanceMapKey(bloc._name, bloc._id);\n this.blocInstanceMap.set(key, bloc);\n \n // Track UID for cleanup\n this.uidRegistry.set(bloc.uid, bloc);\n \n // Track keep-alive blocs\n if (bloc._keepAlive) {\n this.keepAliveBlocs.add(bloc);\n }\n }\n\n /**\n * Finds a registered bloc instance by its class and ID\n * @param blocClass - The bloc class to search for\n * @param id - The instance ID\n * @returns The found bloc instance or undefined if not found\n */\n findRegisteredBlocInstance<B extends BlocConstructor<any>>(\n blocClass: B,\n id: BlocInstanceId,\n ): InstanceType<B> | undefined {\n const base = blocClass as unknown as BlocBaseAbstract;\n if (base.isolated) return undefined;\n\n const key = this.createBlocInstanceMapKey(blocClass.name, id);\n const found = this.blocInstanceMap.get(key) as InstanceType<B> | undefined;\n return found\n }\n\n /**\n * Registers an isolated bloc instance in the isolated registry\n * @param bloc - The isolated bloc instance to register\n */\n registerIsolatedBlocInstance(bloc: BlocBase<unknown>): void {\n const blocClass = bloc.constructor as BlocConstructor<any>;\n const blocs = this.isolatedBlocMap.get(blocClass);\n if (blocs) {\n blocs.push(bloc);\n } else {\n this.isolatedBlocMap.set(blocClass, [bloc]);\n }\n \n // Add to isolated index for O(1) lookups\n this.isolatedBlocIndex.set(bloc.uid, bloc);\n \n // Track UID for cleanup\n this.uidRegistry.set(bloc.uid, bloc);\n \n // Track keep-alive blocs\n if (bloc._keepAlive) {\n this.keepAliveBlocs.add(bloc);\n }\n }\n\n /**\n * Unregister an isolated bloc instance from the isolated registry\n * @param bloc - The isolated bloc instance to unregister\n */\n unregisterIsolatedBlocInstance(bloc: BlocBase<unknown>): void {\n const blocClass = bloc.constructor;\n const blocs = this.isolatedBlocMap.get(blocClass as BlocConstructor<any>);\n if (blocs) {\n const index = blocs.findIndex((b) => b.uid === bloc.uid);\n if (index !== -1) {\n blocs.splice(index, 1);\n }\n\n if (blocs.length === 0) {\n this.isolatedBlocMap.delete(blocClass as BlocConstructor<any>);\n }\n }\n \n // Remove from isolated index\n this.isolatedBlocIndex.delete(bloc.uid);\n \n // Clean up UID tracking\n this.uidRegistry.delete(bloc.uid);\n \n // Remove from keep-alive set\n this.keepAliveBlocs.delete(bloc);\n }\n\n /**\n * Finds an isolated bloc instance by its class and ID (O(n) lookup)\n */\n findIsolatedBlocInstance<B extends BlocConstructor<any>>(\n blocClass: B,\n id: BlocInstanceId,\n ): InstanceType<B> | undefined {\n const base = blocClass as unknown as BlocBaseAbstract;\n if (!base.isolated) return undefined;\n\n const blocs = this.isolatedBlocMap.get(blocClass);\n if (!blocs) {\n return undefined;\n }\n // Find the specific bloc by ID within the isolated array\n const found = blocs.find((b) => b._id === id) as InstanceType<B> | undefined;\n return found;\n }\n\n /**\n * Finds an isolated bloc instance by UID (O(1) lookup)\n */\n findIsolatedBlocInstanceByUid<B extends BlocBase<unknown>>(\n uid: string\n ): B | undefined {\n return this.isolatedBlocIndex.get(uid) as B | undefined;\n }\n\n /**\n * Creates a new bloc instance and registers it in the appropriate registry\n * @param blocClass - The bloc class to instantiate\n * @param id - The instance ID\n * @param props - Properties to pass to the bloc constructor\n * @param instanceRef - Optional reference string for the instance\n * @returns The newly created bloc instance\n */\n createNewBlocInstance<B extends BlocConstructor<BlocBase<any>>>(\n blocClass: B,\n id: BlocInstanceId,\n options: GetBlocOptions<InstanceType<B>> = {},\n ): InstanceType<B> {\n const { props, instanceRef } = options;\n const newBloc = new blocClass(props as never) as InstanceType<B>;\n newBloc._instanceRef = instanceRef;\n newBloc.props = props || null;\n newBloc._updateId(id);\n\n // Set up disposal handler to break circular dependency\n newBloc._setDisposalHandler((bloc) => this.disposeBloc(bloc));\n\n if (newBloc.isIsolated) {\n this.registerIsolatedBlocInstance(newBloc);\n return newBloc;\n }\n\n this.registerBlocInstance(newBloc);\n return newBloc;\n }\n\n\n activateBloc = (bloc: BlocBase<unknown>): void => {\n const base = bloc.constructor as unknown as BlocConstructor<BlocBase<any>>;\n const isIsolated = bloc.isIsolated;\n\n let found = isIsolated ? this.findIsolatedBlocInstance(base, bloc._id) : this.findRegisteredBlocInstance(base, bloc._id);\n if (found) {\n return;\n }\n\n this.log(`[${bloc._name}:${String(bloc._id)}] activateBloc called. Isolated: ${String(bloc.isIsolated)}`);\n if (bloc.isIsolated) {\n this.registerIsolatedBlocInstance(bloc);\n } else {\n this.registerBlocInstance(bloc);\n }\n };\n static get activateBloc() { return Blac.instance.activateBloc; }\n\n /**\n * Gets or creates a bloc instance based on the provided class and options.\n * If a bloc with the given ID exists, it will be returned. Otherwise, a new instance will be created.\n * \n * @param blocClass - The bloc class to get or create\n * @param options - Options including:\n * - id: The instance ID (defaults to class name if not provided)\n * - props: Properties to pass to the bloc constructor\n * - instanceRef: Optional reference string for the instance\n * @returns The bloc instance\n */\n getBloc = <B extends BlocConstructor<BlocBase<any>>>(\n blocClass: B,\n options: GetBlocOptions<InstanceType<B>> = {},\n ): InstanceType<B> => {\n const { id } = options;\n const base = blocClass as unknown as BlocBaseAbstract;\n const blocId = id ?? blocClass.name;\n\n\n if (base.isolated) {\n const isolatedBloc = this.findIsolatedBlocInstance<B>(blocClass, blocId)\n if (isolatedBloc) {\n this.log(`[${blocClass.name}:${String(blocId)}] (getBloc) Found existing isolated instance.`, options);\n return isolatedBloc;\n } else {\n if (options.throwIfNotFound) {\n throw new Error(`Isolated bloc ${blocClass.name} not found`);\n }\n }\n } else {\n const registeredBloc = this.findRegisteredBlocInstance(blocClass, blocId)\n if (registeredBloc) {\n this.log(`[${blocClass.name}:${String(blocId)}] (getBloc) Found existing registered instance.`, options);\n return registeredBloc\n } else {\n if (options.throwIfNotFound) {\n throw new Error(`Registered bloc ${blocClass.name} not found`);\n }\n }\n }\n\n const bloc = this.createNewBlocInstance(\n blocClass,\n blocId,\n options,\n );\n this.log(`[${blocClass.name}:${String(blocId)}] (getBloc) No existing instance found. Creating new one.`, options, bloc);\n return bloc;\n };\n static get getBloc() { return Blac.instance.getBloc; }\n\n /**\n * Gets a bloc instance or throws an error if it doesn't exist\n * @param blocClass - The bloc class to get\n * @param options - Options including:\n * - id: The instance ID (defaults to class name if not provided)\n * - props: Properties to pass to the bloc constructor\n * - instanceRef: Optional reference string for the instance\n */\n getBlocOrThrow = <B extends BlocConstructor<any>>(\n blocClass: B,\n options: {\n id?: BlocInstanceId;\n props?: InferPropsFromGeneric<B>;\n instanceRef?: string;\n } = {},\n ): InstanceType<B> => {\n const isIsolated = (blocClass as unknown as BlocBaseAbstract).isolated;\n const id = options.id || blocClass.name;\n\n const registered = isIsolated\n ? this.findIsolatedBlocInstance(blocClass, id)\n : this.findRegisteredBlocInstance(blocClass, id);\n\n if (registered) {\n return registered;\n }\n throw new Error(`Bloc ${blocClass.name} not found`);\n };\n static get getBlocOrThrow() { return Blac.instance.getBlocOrThrow; }\n\n /**\n * Gets all instances of a specific bloc class\n * @param blocClass - The bloc class to search for\n * @param options - Options including:\n * - searchIsolated: Whether to search in isolated blocs (defaults to bloc's isolated property)\n * @returns Array of matching bloc instances\n */\n getAllBlocs = <B extends BlocConstructor<any>>(\n blocClass: B,\n options: {\n searchIsolated?: boolean;\n } = {},\n ): InstanceType<B>[] => {\n const results: InstanceType<B>[] = [];\n // const blocClassName = (blocClass as any).name; // Temporarily removed for debugging\n\n // Search non-isolated blocs\n this.blocInstanceMap.forEach((blocInstance) => {\n if (blocInstance.constructor === blocClass) { // Strict constructor check\n results.push(blocInstance as InstanceType<B>);\n }\n });\n\n // Optionally search isolated blocs\n if (options.searchIsolated !== false) {\n const isolatedBlocs = this.isolatedBlocMap.get(blocClass);\n if (isolatedBlocs) {\n results.push(...isolatedBlocs.map(bloc => bloc as InstanceType<B>));\n }\n }\n\n return results;\n };\n\n /**\n * Disposes all keep-alive blocs of a specific type\n * @param blocClass - The bloc class to dispose\n */\n disposeKeepAliveBlocs = <B extends BlocConstructor<any>>(\n blocClass?: B\n ): void => {\n const toDispose: BlocBase<unknown>[] = [];\n \n for (const bloc of this.keepAliveBlocs) {\n if (!blocClass || bloc.constructor === blocClass) {\n toDispose.push(bloc);\n }\n }\n \n toDispose.forEach(bloc => bloc._dispose());\n };\n static get disposeKeepAliveBlocs() { return Blac.instance.disposeKeepAliveBlocs; }\n\n /**\n * Disposes all blocs matching a pattern\n * @param predicate - Function to test each bloc for disposal\n */\n disposeBlocs = (predicate: (bloc: BlocBase<unknown>) => boolean): void => {\n const toDispose: BlocBase<unknown>[] = [];\n \n // Check registered blocs\n for (const bloc of this.blocInstanceMap.values()) {\n if (predicate(bloc)) {\n toDispose.push(bloc);\n }\n }\n \n // Check isolated blocs\n for (const blocs of this.isolatedBlocMap.values()) {\n for (const bloc of blocs) {\n if (predicate(bloc)) {\n toDispose.push(bloc);\n }\n }\n }\n \n toDispose.forEach(bloc => bloc._dispose());\n };\n static get disposeBlocs() { return Blac.instance.disposeBlocs; }\n\n /**\n * Gets memory usage statistics for debugging\n */\n getMemoryStats = () => {\n return {\n totalBlocs: this.uidRegistry.size,\n registeredBlocs: this.blocInstanceMap.size,\n isolatedBlocs: Array.from(this.isolatedBlocMap.values()).reduce((sum, arr) => sum + arr.length, 0),\n keepAliveBlocs: this.keepAliveBlocs.size,\n isolatedBlocTypes: this.isolatedBlocMap.size,\n };\n };\n static get getMemoryStats() { return Blac.instance.getMemoryStats; }\n\n /**\n * Validates consumer references and cleans up orphaned consumers\n */\n validateConsumers = (): void => {\n for (const bloc of this.uidRegistry.values()) {\n // This would need to be called periodically to clean up orphaned consumers\n // Implementation depends on how we want to handle consumer validation\n if (bloc._consumers.size === 0 && !bloc._keepAlive) {\n // Schedule disposal for blocs with no consumers\n setTimeout(() => {\n if (bloc._consumers.size === 0 && !bloc._keepAlive) {\n bloc._dispose();\n }\n }, 1000); // Give a grace period\n }\n }\n };\n static get validateConsumers() { return Blac.instance.validateConsumers; }\n}\n","import { Blac } from './Blac';\nimport { BlocBase } from './BlocBase';\nimport { BlocHookDependencyArrayFn } from './types';\n\n/**\n * Represents an observer that can subscribe to state changes in a Bloc\n * @template S - The type of state being observed\n */\nexport type BlacObserver<S> = {\n /** Function to be called when state changes */\n fn: (newState: S, oldState: S, action?: unknown) => void | Promise<void>;\n /** Optional function to determine if the observer should be notified of state changes */\n dependencyArray?: BlocHookDependencyArrayFn<S>;\n /** Dispose function for the observer */\n dispose?: () => void;\n /** Cached state values used for dependency comparison */\n lastState?: unknown[][];\n /** Unique identifier for the observer */\n id: string;\n};\n\n/**\n * A class that manages observers for a Bloc's state changes\n * @template S - The type of state being observed\n */\nexport class BlacObservable<S = unknown> {\n /** The Bloc instance this observable is associated with */\n bloc: BlocBase<S>;\n\n /**\n * Creates a new BlacObservable instance\n * @param bloc - The Bloc instance to observe\n */\n constructor(bloc: BlocBase<S>) {\n this.bloc = bloc;\n }\n\n private _observers = new Set<BlacObserver<S>>();\n\n /**\n * Gets the number of active observers\n * @returns The number of observers currently subscribed\n */\n get size(): number {\n return this._observers.size;\n }\n\n /**\n * Gets the set of all observers\n * @returns The Set of all BlacObserver instances\n */\n get observers() {\n return this._observers;\n }\n\n /**\n * Subscribes an observer to state changes\n * @param observer - The observer to subscribe\n * @returns A function that can be called to unsubscribe the observer\n */\n subscribe(observer: BlacObserver<S>): () => void {\n Blac.log('BlacObservable.subscribe: Subscribing observer.', this.bloc, observer);\n this._observers.add(observer);\n // Blac.instance.dispatchEvent(BlacLifecycleEvent.LISTENER_ADDED, this.bloc, { listenerId: observer.id });\n if (!observer.lastState) {\n observer.lastState = observer.dependencyArray\n ? observer.dependencyArray(this.bloc.state)\n : [];\n }\n return () => {\n Blac.log('BlacObservable.subscribe: Unsubscribing observer.', this.bloc, observer);\n this.unsubscribe(observer);\n }\n }\n\n /**\n * Unsubscribes an observer from state changes\n * @param observer - The observer to unsubscribe\n */\n unsubscribe(observer: BlacObserver<S>) {\n this._observers.delete(observer);\n // Blac.instance.dispatchEvent(BlacLifecycleEvent.LISTENER_REMOVED, this.bloc, { listenerId: observer.id });\n\n if (this.size === 0) {\n Blac.log('BlacObservable.unsubscribe: No observers left. Disposing bloc.', this.bloc);\n this.bloc._dispose();\n }\n }\n\n /**\n * Notifies all observers of a state change\n * @param newState - The new state value\n * @param oldState - The previous state value\n * @param action - Optional action that triggered the state change\n */\n notify(newState: S, oldState: S, action?: unknown) {\n this._observers.forEach((observer) => {\n let shouldUpdate = false;\n\n if (observer.dependencyArray) {\n const lastDependencyCheck = observer.lastState || [];\n const newDependencyCheck = observer.dependencyArray(newState);\n\n for (let o = 0; o < newDependencyCheck.length; o++) {\n const partNew = newDependencyCheck[o];\n const partOld = lastDependencyCheck[o] || [];\n for (let i = 0; i < partNew.length; i++) {\n if (!Object.is(partNew[i], partOld[i])) {\n shouldUpdate = true;\n break;\n }\n }\n }\n\n observer.lastState = newDependencyCheck;\n } else {\n shouldUpdate = true;\n }\n\n if (shouldUpdate) {\n void observer.fn(newState, oldState, action);\n }\n });\n }\n\n /**\n * Clears the observer set\n */\n clear() {\n this._observers.forEach((observer) => {\n this.unsubscribe(observer);\n });\n this._observers.clear();\n }\n}\n","import { BlacObservable } from './BlacObserver';\nimport { BlocConstructor } from './types';\n\nexport type BlocInstanceId = string | number | undefined;\ntype DependencySelector<S> = (newState: S) => unknown[][];\n\n// Define an interface for the static properties expected on a Bloc/Cubit constructor\ninterface BlocStaticProperties {\n isolated: boolean;\n keepAlive: boolean;\n}\n\n/**\n * Base class for both Blocs and Cubits that provides core state management functionality.\n * Handles state transitions, observer notifications, lifecycle management, and addon integration.\n * \n * @abstract This class should be extended, not instantiated directly\n * @template S The type of state managed by this Bloc\n * @template P The type of props that can be passed during instance creation (optional)\n */\nexport abstract class BlocBase<\n S,\n P = unknown\n> {\n public uid = crypto.randomUUID();\n /**\n * When true, every consumer will receive its own unique instance of this Bloc.\n * Use this when state should not be shared between components.\n * @default false\n */\n static isolated = false;\n get isIsolated() {\n return this._isolated;\n }\n \n /**\n * When true, the Bloc instance persists even when there are no active consumers.\n * Useful for maintaining state between component unmount/remount cycles.\n * @default false\n */\n static keepAlive = false;\n get isKeepAlive() {\n return this._keepAlive;\n }\n \n /**\n * Defines how dependencies are selected from the state for efficient updates.\n * When provided, observers will only be notified when selected dependencies change.\n */\n defaultDependencySelector: DependencySelector<S> | undefined;\n \n /**\n * @internal\n * Indicates if this specific Bloc instance is isolated from others of the same type.\n */\n public _isolated = false;\n \n /**\n * @internal\n * Observable responsible for managing state listeners and notifying consumers.\n */\n public _observer: BlacObservable<S>;\n \n /**\n * The unique identifier for this Bloc instance.\n * Defaults to the class name, but can be customized.\n */\n public _id: BlocInstanceId;\n \n /**\n * @internal\n * Reference string used internally for tracking and debugging.\n */\n public _instanceRef?: string;\n \n /**\n * @internal\n * Indicates if this specific Bloc instance should be kept alive when no consumers are present.\n */\n public _keepAlive = false;\n \n /**\n * @readonly\n * Timestamp when this Bloc instance was created, useful for debugging and performance tracking.\n */\n public readonly _createdAt = Date.now();\n\n /**\n * @internal\n * The current state of the Bloc.\n */\n public _state: S;\n \n /**\n * @internal\n * The previous state of the Bloc, maintained for comparison and history.\n */\n public _oldState: S | undefined;\n \n /**\n * Props passed during Bloc instance creation.\n * Can be used to configure or parameterize the Bloc's behavior.\n */\n public props: P | null = null;\n\n /**\n * Creates a new BlocBase instance with the given initial state.\n * Sets up the observer, registers with the Blac manager, and initializes addons.\n * \n * @param initialState The initial state value for this Bloc\n */\n constructor(initialState: S) {\n this._state = initialState;\n this._observer = new BlacObservable(this);\n this._id = this.constructor.name;\n\n // Access static properties safely with proper type checking\n const Constructor = this.constructor as typeof BlocBase & BlocStaticProperties;\n \n // Validate that the static properties exist and are boolean\n this._keepAlive = typeof Constructor.keepAlive === 'boolean' ? Constructor.keepAlive : false;\n this._isolated = typeof Constructor.isolated === 'boolean' ? Constructor.isolated : false;\n }\n\n /**\n * Returns the current state of the Bloc.\n * Use this getter to access the state in a read-only manner.\n */\n get state(): S {\n return this._state;\n }\n\n /**\n * @internal\n * Returns the name of the Bloc class for identification and debugging.\n */\n get _name() {\n return this.constructor.name;\n }\n\n /**\n * @internal\n * Updates the Bloc instance's ID to a new value.\n * Only updates if the new ID is defined and different from the current one.\n * \n * @param id The new ID to assign to this Bloc instance\n */\n _updateId = (id?: BlocInstanceId) => {\n const originalId = this._id;\n if (!id || id === originalId) return;\n this._id = id;\n };\n\n /**\n * @internal\n * Cleans up resources and removes this Bloc from the system.\n * Notifies the Blac manager and clears all observers.\n */\n _dispose() {\n // Clear all consumers\n this._consumers.clear();\n \n // Clear observer subscriptions\n this._observer.clear();\n \n // Call user-defined disposal hook\n this.onDispose?.();\n \n // The Blac manager will handle removal from registry\n // This method is called by Blac.disposeBloc, so we don't need to call it again\n }\n\n /**\n * @internal\n * Optional function to be called when the Bloc is disposed.\n */\n onDispose?: () => void;\n\n /**\n * @internal\n * Set of consumer IDs currently listening to this Bloc's state changes.\n */\n _consumers = new Set<string>();\n\n /**\n * @internal\n * WeakSet to track consumer references for cleanup validation\n */\n private _consumerRefs = new WeakSet<object>();\n\n /**\n * @internal\n * Registers a new consumer to this Bloc instance.\n * Notifies the Blac manager that a consumer has been added.\n * \n * @param consumerId The unique ID of the consumer being added\n * @param consumerRef Optional reference to the consumer object for cleanup validation\n */\n _addConsumer = (consumerId: string, consumerRef?: object) => {\n if (this._consumers.has(consumerId)) return;\n this._consumers.add(consumerId);\n \n if (consumerRef) {\n this._consumerRefs.add(consumerRef);\n }\n \n // this._blac.dispatchEvent(BlacLifecycleEvent.BLOC_CONSUMER_ADDED, this, { consumerId });\n };\n\n /**\n * @internal\n * Unregisters a consumer from this Bloc instance.\n * Notifies the Blac manager that a consumer has been removed.\n * \n * @param consumerId The unique ID of the consumer being removed\n */\n _removeConsumer = (consumerId: string) => {\n if (!this._consumers.has(consumerId)) return;\n this._consumers.delete(consumerId);\n // this._blac.dispatchEvent(BlacLifecycleEvent.BLOC_CONSUMER_REMOVED, this, { consumerId });\n \n // If no consumers remain and not keep-alive, schedule disposal\n if (this._consumers.size === 0 && !this._keepAlive) {\n this._scheduleDisposal();\n }\n };\n\n /**\n * @internal\n * Handler function for disposal (can be set by Blac manager)\n */\n private _disposalHandler?: (bloc: BlocBase<unknown>) => void;\n\n /**\n * @internal\n * Sets the disposal handler for this bloc\n */\n _setDisposalHandler(handler: (bloc: BlocBase<unknown>) => void) {\n this._disposalHandler = handler;\n }\n\n /**\n * @internal\n * Schedules disposal of this bloc instance if it has no consumers\n */\n private _scheduleDisposal() {\n // Use setTimeout to avoid disposal during render cycles\n setTimeout(() => {\n if (this._consumers.size === 0 && !this._keepAlive) {\n if (this._disposalHandler) {\n this._disposalHandler(this as any);\n } else {\n this._dispose();\n }\n }\n }, 0);\n }\n\n lastUpdate = Date.now();\n\n /**\n * @internal\n * Flag to indicate if batching is enabled for this bloc\n */\n private _batchingEnabled = false;\n\n /**\n * @internal\n * Pending state updates when batching is enabled\n */\n private _pendingUpdates: Array<{newState: S, oldState: S, action?: unknown}> = [];\n\n /**\n * @internal\n * Updates the state and notifies all observers of the change.\n * \n * @param newState The new state to be set\n * @param oldState The previous state for comparison\n * @param action Optional metadata about what caused the state change\n */\n _pushState = (newState: S, oldState: S, action?: unknown): void => {\n // Runtime validation for state changes\n if (newState === undefined) {\n console.warn('BlocBase._pushState: newState is undefined', this);\n return;\n }\n \n // Validate action type if provided\n if (action !== undefined && action !== null) {\n const actionType = typeof action;\n if (!(['string', 'object', 'number'].includes(actionType))) {\n console.warn('BlocBase._pushState: Invalid action type', this, action);\n }\n }\n\n // If batching is enabled, queue the update\n if (this._batchingEnabled) {\n this._pendingUpdates.push({ newState, oldState, action });\n return;\n }\n \n this._oldState = oldState;\n this._state = newState;\n this._observer.notify(newState, oldState, action);\n this.lastUpdate = Date.now();\n };\n\n /**\n * Enables batching for multiple state updates\n * @param batchFn Function to execute with batching enabled\n */\n batch = <T>(batchFn: () => T): T => {\n const wasBatching = this._batchingEnabled;\n this._batchingEnabled = true;\n \n try {\n const result = batchFn();\n \n // Process all pending updates\n if (this._pendingUpdates.length > 0) {\n const lastUpdate = this._pendingUpdates[this._pendingUpdates.length - 1];\n this._oldState = this._pendingUpdates[0].oldState;\n this._state = lastUpdate.newState;\n \n // Notify with the final state\n this._observer.notify(lastUpdate.newState, this._oldState, lastUpdate.action);\n this.lastUpdate = Date.now();\n \n this._pendingUpdates = [];\n }\n \n return result;\n } finally {\n this._batchingEnabled = wasBatching;\n }\n };\n}\n","import { Blac } from './Blac';\nimport { BlocBase } from './BlocBase';\n\n// A should be the base type for all events this Bloc handles and must be an object type\n// to access action.constructor. Events are typically class instances.\n// P is for props, changed from any to unknown.\nexport abstract class Bloc<\n S, // State type\n A extends object, // Base Action/Event type, constrained to object\n P = unknown // Props type\n> extends BlocBase<S, P> {\n // Stores handlers: Map<EventConstructor (subtype of A), HandlerFunction>\n // The handler's event parameter will be correctly typed to the specific EventConstructor\n // by the 'on' method's signature.\n readonly eventHandlers: Map<\n // Key: Constructor of a specific event E (where E extends A)\n // Using 'any[]' for constructor arguments for broader compatibility.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]) => A,\n // Value: Handler function. 'event: A' is used here for the stored function type.\n // The 'on' method ensures the specific handler (event: E) is correctly typed.\n (event: A, emit: (newState: S) => void) => void | Promise<void>\n > = new Map();\n\n /**\n * Registers an event handler for a specific event type.\n * This method is typically called in the constructor of a derived Bloc class.\n * @param eventConstructor The constructor of the event to handle (e.g., LoadDataEvent).\n * @param handler A function that processes the event and can emit new states.\n * The 'event' parameter in the handler will be typed to the specific eventConstructor.\n */\n protected on<E extends A>(\n // Using 'any[]' for constructor arguments for broader compatibility.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n eventConstructor: new (...args: any[]) => E, \n handler: (event: E, emit: (newState: S) => void) => void | Promise<void>\n ): void {\n if (this.eventHandlers.has(eventConstructor)) {\n // Using Blac.warn or a similar logging mechanism from BlocBase if available,\n // otherwise console.warn. Assuming this._name and this._id are available from BlocBase.\n Blac.warn(\n `[Bloc ${this._name}:${String(this._id)}] Handler for event '${eventConstructor.name}' already registered. It will be overwritten.`\n );\n }\n // Cast the specific handler (event: E) to a more general (event: A) for storage.\n // This is safe because E extends A. When the handler is called with an 'action' of type A,\n // if it was originally registered for type E, 'action' must be an instance of E.\n this.eventHandlers.set(\n eventConstructor,\n handler as (event: A, emit: (newState: S) => void) => void | Promise<void>\n );\n }\n\n /**\n * Dispatches an action/event to the Bloc.\n * If a handler is registered for this specific event type (via 'on'), it will be invoked.\n * Asynchronous handlers are awaited.\n * @param action The action/event instance to be processed.\n */\n public add = async (action: A): Promise<void> => {\n // Using 'any[]' for constructor arguments for broader compatibility.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const eventConstructor = action.constructor as new (...args: any[]) => A;\n const handler = this.eventHandlers.get(eventConstructor);\n\n if (handler) {\n // Define the 'emit' function that handlers will use to update state.\n // It captures the current state ('this.state') right before each emission\n // to provide the correct 'previousState' to _pushState.\n const emit = (newState: S): void => {\n const previousState = this.state; // State just before this specific emission\n // The 'action' passed to _pushState is the original action that triggered the handler,\n // providing context for the state change (e.g., for logging or plugins).\n this._pushState(newState, previousState, action);\n };\n\n try {\n // Await the handler in case it's an async function (e.g., performs API calls).\n // The 'action' is passed to the handler, and due to the way 'on' is typed,\n // the 'event' parameter within the handler function will be correctly\n // typed to its specific class (e.g., LoadMyFeatureData).\n await handler(action, emit);\n } catch (error) {\n // It's good practice to handle errors occurring within event handlers.\n Blac.error(\n `[Bloc ${this._name}:${String(this._id)}] Error in event handler for '${eventConstructor.name}':`,\n error,\n \"Action:\", action\n );\n // Depending on the desired error handling strategy, you might:\n // 1. Emit a specific error state: this.emit(new MyErrorState(error));\n // 2. Re-throw the error: throw error;\n // 3. Log and ignore (as done here by default).\n // This should be decided based on application requirements.\n }\n } else {\n // action.constructor.name should be safe due to 'A extends object' and common JS practice for constructors.\n // If linting still complains, it might be overly strict for this common pattern.\n const constructorName = (action.constructor as { name?: string }).name || 'UnnamedConstructor';\n Blac.warn(\n `[Bloc ${this._name}:${String(this._id)}] No handler registered for action type: '${constructorName}'. Action was:`,\n action\n );\n // If no handler is found, the action is effectively ignored.\n // Consider if this is the desired behavior or if an error should be thrown\n // or a default handler should be invoked.\n }\n };\n}\n","import { Blac } from './Blac';\nimport { BlocBase } from './BlocBase';\n\n/**\n * A Cubit is a simpler version of a Bloc that doesn't handle events.\n * It manages state and provides methods to update it.\n * @template S - The type of state this Cubit manages\n * @template P - The type of parameters (optional, defaults to null)\n */\nexport abstract class Cubit<S, P = null> extends BlocBase<S, P> {\n /**\n * Updates the current state and notifies all observers of the change.\n * If the new state is identical to the current state (using Object.is),\n * no update will occur.\n * @param state - The new state to set\n */\n emit(state: S): void {\n if (Object.is(state, this.state)) {\n return;\n }\n\n const oldState = this.state;\n const newState = state;\n this._pushState(newState, oldState);\n }\n\n /**\n * Partially updates the current state by merging it with the provided state patch.\n * This method is only applicable when the state is an object type.\n * \n * @param statePatch - A partial state object containing only the properties to update\n * @param ignoreChangeCheck - If true, skips checking if the state has actually changed\n * @throws {TypeError} If the state is not an object type\n */\n patch(\n statePatch: S extends object ? Partial<S> : S,\n ignoreChangeCheck = false,\n ): void {\n if (typeof this.state !== 'object' || this.state === null) {\n Blac.warn(\n 'Cubit.patch: was called on a cubit where the state is not an object. This is a no-op.',\n );\n return;\n }\n\n let changes = false;\n if (!ignoreChangeCheck) {\n for (const key in statePatch) {\n if (Object.prototype.hasOwnProperty.call(statePatch, key)) {\n const s = this.state;\n const current = s[key as keyof S];\n if (!Object.is(statePatch[key as keyof S], current)) {\n changes = true;\n break;\n }\n }\n }\n } else {\n changes = true;\n }\n\n if (changes) {\n this.emit({\n ...this.state,\n ...(statePatch as Partial<S>),\n } as S);\n }\n }\n}\n"],"names":["_SingletonBlacManager","Blac","instance","oldInstance","bloc","__publicField","SingletonBlacManager","instanceManager","setBlacInstanceManager","manager","_Blac","options","args","message","oldBlocInstanceMap","oldIsolatedBlocMap","blocArray","base","key","blocClass","id","blocId","isolatedBloc","registeredBloc","isIsolated","registered","results","blocInstance","isolatedBlocs","toDispose","predicate","blocs","sum","arr","__unsafe_ignore_singleton","blocClassName","index","b","uid","props","instanceRef","newBloc","BlacObservable","observer","newState","oldState","action","shouldUpdate","lastDependencyCheck","newDependencyCheck","o","partNew","partOld","i","BlocBase","initialState","originalId","consumerId","consumerRef","actionType","batchFn","wasBatching","result","lastUpdate","Constructor","_a","handler","Bloc","eventConstructor","emit","previousState","error","constructorName","Cubit","state","statePatch","ignoreChangeCheck","changes","current"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/Blac.ts
CHANGED
|
@@ -57,9 +57,11 @@ class SingletonBlacManager implements BlacInstanceManager {
|
|
|
57
57
|
SingletonBlacManager._instance = new Blac({ __unsafe_ignore_singleton: true });
|
|
58
58
|
|
|
59
59
|
// Transfer any keep-alive blocs to the new instance
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
if (oldInstance) {
|
|
61
|
+
for (const bloc of oldInstance.keepAliveBlocs) {
|
|
62
|
+
SingletonBlacManager._instance.keepAliveBlocs.add(bloc);
|
|
63
|
+
SingletonBlacManager._instance.uidRegistry.set(bloc.uid, bloc);
|
|
64
|
+
}
|
|
63
65
|
}
|
|
64
66
|
}
|
|
65
67
|
}
|
|
@@ -99,7 +101,7 @@ export class Blac {
|
|
|
99
101
|
/** Map storing all registered bloc instances by their class name and ID */
|
|
100
102
|
blocInstanceMap: Map<string, BlocBase<unknown>> = new Map();
|
|
101
103
|
/** Map storing isolated bloc instances grouped by their constructor */
|
|
102
|
-
isolatedBlocMap: Map<BlocConstructor<
|
|
104
|
+
isolatedBlocMap: Map<BlocConstructor<any>, BlocBase<unknown>[]> = new Map();
|
|
103
105
|
/** Map for O(1) lookup of isolated blocs by UID */
|
|
104
106
|
private isolatedBlocIndex: Map<string, BlocBase<unknown>> = new Map();
|
|
105
107
|
/** Map tracking UIDs to prevent memory leaks */
|
|
@@ -267,7 +269,7 @@ export class Blac {
|
|
|
267
269
|
* @param id - The instance ID
|
|
268
270
|
* @returns The found bloc instance or undefined if not found
|
|
269
271
|
*/
|
|
270
|
-
findRegisteredBlocInstance<B extends BlocConstructor<
|
|
272
|
+
findRegisteredBlocInstance<B extends BlocConstructor<any>>(
|
|
271
273
|
blocClass: B,
|
|
272
274
|
id: BlocInstanceId,
|
|
273
275
|
): InstanceType<B> | undefined {
|
|
@@ -284,7 +286,7 @@ export class Blac {
|
|
|
284
286
|
* @param bloc - The isolated bloc instance to register
|
|
285
287
|
*/
|
|
286
288
|
registerIsolatedBlocInstance(bloc: BlocBase<unknown>): void {
|
|
287
|
-
const blocClass = bloc.constructor as BlocConstructor<
|
|
289
|
+
const blocClass = bloc.constructor as BlocConstructor<any>;
|
|
288
290
|
const blocs = this.isolatedBlocMap.get(blocClass);
|
|
289
291
|
if (blocs) {
|
|
290
292
|
blocs.push(bloc);
|
|
@@ -310,7 +312,7 @@ export class Blac {
|
|
|
310
312
|
*/
|
|
311
313
|
unregisterIsolatedBlocInstance(bloc: BlocBase<unknown>): void {
|
|
312
314
|
const blocClass = bloc.constructor;
|
|
313
|
-
const blocs = this.isolatedBlocMap.get(blocClass as BlocConstructor<
|
|
315
|
+
const blocs = this.isolatedBlocMap.get(blocClass as BlocConstructor<any>);
|
|
314
316
|
if (blocs) {
|
|
315
317
|
const index = blocs.findIndex((b) => b.uid === bloc.uid);
|
|
316
318
|
if (index !== -1) {
|
|
@@ -318,7 +320,7 @@ export class Blac {
|
|
|
318
320
|
}
|
|
319
321
|
|
|
320
322
|
if (blocs.length === 0) {
|
|
321
|
-
this.isolatedBlocMap.delete(blocClass as BlocConstructor<
|
|
323
|
+
this.isolatedBlocMap.delete(blocClass as BlocConstructor<any>);
|
|
322
324
|
}
|
|
323
325
|
}
|
|
324
326
|
|
|
@@ -335,7 +337,7 @@ export class Blac {
|
|
|
335
337
|
/**
|
|
336
338
|
* Finds an isolated bloc instance by its class and ID (O(n) lookup)
|
|
337
339
|
*/
|
|
338
|
-
findIsolatedBlocInstance<B extends BlocConstructor<
|
|
340
|
+
findIsolatedBlocInstance<B extends BlocConstructor<any>>(
|
|
339
341
|
blocClass: B,
|
|
340
342
|
id: BlocInstanceId,
|
|
341
343
|
): InstanceType<B> | undefined {
|
|
@@ -368,13 +370,13 @@ export class Blac {
|
|
|
368
370
|
* @param instanceRef - Optional reference string for the instance
|
|
369
371
|
* @returns The newly created bloc instance
|
|
370
372
|
*/
|
|
371
|
-
createNewBlocInstance<B extends BlocConstructor<BlocBase<
|
|
373
|
+
createNewBlocInstance<B extends BlocConstructor<BlocBase<any>>>(
|
|
372
374
|
blocClass: B,
|
|
373
375
|
id: BlocInstanceId,
|
|
374
376
|
options: GetBlocOptions<InstanceType<B>> = {},
|
|
375
377
|
): InstanceType<B> {
|
|
376
378
|
const { props, instanceRef } = options;
|
|
377
|
-
const newBloc = new blocClass(props as never) as InstanceType<
|
|
379
|
+
const newBloc = new blocClass(props as never) as InstanceType<B>;
|
|
378
380
|
newBloc._instanceRef = instanceRef;
|
|
379
381
|
newBloc.props = props || null;
|
|
380
382
|
newBloc._updateId(id);
|
|
@@ -384,16 +386,16 @@ export class Blac {
|
|
|
384
386
|
|
|
385
387
|
if (newBloc.isIsolated) {
|
|
386
388
|
this.registerIsolatedBlocInstance(newBloc);
|
|
387
|
-
return newBloc
|
|
389
|
+
return newBloc;
|
|
388
390
|
}
|
|
389
391
|
|
|
390
392
|
this.registerBlocInstance(newBloc);
|
|
391
|
-
return newBloc
|
|
393
|
+
return newBloc;
|
|
392
394
|
}
|
|
393
395
|
|
|
394
396
|
|
|
395
397
|
activateBloc = (bloc: BlocBase<unknown>): void => {
|
|
396
|
-
const base = bloc.constructor as unknown as BlocConstructor<BlocBase<
|
|
398
|
+
const base = bloc.constructor as unknown as BlocConstructor<BlocBase<any>>;
|
|
397
399
|
const isIsolated = bloc.isIsolated;
|
|
398
400
|
|
|
399
401
|
let found = isIsolated ? this.findIsolatedBlocInstance(base, bloc._id) : this.findRegisteredBlocInstance(base, bloc._id);
|
|
@@ -421,7 +423,7 @@ export class Blac {
|
|
|
421
423
|
* - instanceRef: Optional reference string for the instance
|
|
422
424
|
* @returns The bloc instance
|
|
423
425
|
*/
|
|
424
|
-
getBloc = <B extends BlocConstructor<BlocBase<
|
|
426
|
+
getBloc = <B extends BlocConstructor<BlocBase<any>>>(
|
|
425
427
|
blocClass: B,
|
|
426
428
|
options: GetBlocOptions<InstanceType<B>> = {},
|
|
427
429
|
): InstanceType<B> => {
|
|
@@ -470,7 +472,7 @@ export class Blac {
|
|
|
470
472
|
* - props: Properties to pass to the bloc constructor
|
|
471
473
|
* - instanceRef: Optional reference string for the instance
|
|
472
474
|
*/
|
|
473
|
-
getBlocOrThrow = <B extends BlocConstructor<
|
|
475
|
+
getBlocOrThrow = <B extends BlocConstructor<any>>(
|
|
474
476
|
blocClass: B,
|
|
475
477
|
options: {
|
|
476
478
|
id?: BlocInstanceId;
|
|
@@ -499,7 +501,7 @@ export class Blac {
|
|
|
499
501
|
* - searchIsolated: Whether to search in isolated blocs (defaults to bloc's isolated property)
|
|
500
502
|
* @returns Array of matching bloc instances
|
|
501
503
|
*/
|
|
502
|
-
getAllBlocs = <B extends BlocConstructor<
|
|
504
|
+
getAllBlocs = <B extends BlocConstructor<any>>(
|
|
503
505
|
blocClass: B,
|
|
504
506
|
options: {
|
|
505
507
|
searchIsolated?: boolean;
|
|
@@ -530,7 +532,7 @@ export class Blac {
|
|
|
530
532
|
* Disposes all keep-alive blocs of a specific type
|
|
531
533
|
* @param blocClass - The bloc class to dispose
|
|
532
534
|
*/
|
|
533
|
-
disposeKeepAliveBlocs = <B extends BlocConstructor<
|
|
535
|
+
disposeKeepAliveBlocs = <B extends BlocConstructor<any>>(
|
|
534
536
|
blocClass?: B
|
|
535
537
|
): void => {
|
|
536
538
|
const toDispose: BlocBase<unknown>[] = [];
|