mvc-kit 2.5.2 → 2.5.4
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/README.md +4 -4
- package/agent-config/claude-code/skills/guide/api-reference.md +10 -10
- package/dist/Channel.cjs +291 -0
- package/dist/Channel.cjs.map +1 -0
- package/dist/Channel.d.ts +1 -1
- package/dist/Channel.d.ts.map +1 -1
- package/dist/Channel.js +291 -0
- package/dist/Channel.js.map +1 -0
- package/dist/Collection.cjs +452 -0
- package/dist/Collection.cjs.map +1 -0
- package/dist/Collection.d.ts +7 -7
- package/dist/Collection.d.ts.map +1 -1
- package/dist/Collection.js +452 -0
- package/dist/Collection.js.map +1 -0
- package/dist/Controller.cjs +57 -0
- package/dist/Controller.cjs.map +1 -0
- package/dist/Controller.js +57 -0
- package/dist/Controller.js.map +1 -0
- package/dist/EventBus.cjs +84 -0
- package/dist/EventBus.cjs.map +1 -0
- package/dist/EventBus.js +84 -0
- package/dist/EventBus.js.map +1 -0
- package/dist/Model.cjs +175 -0
- package/dist/Model.cjs.map +1 -0
- package/dist/Model.d.ts +4 -4
- package/dist/Model.d.ts.map +1 -1
- package/dist/Model.js +175 -0
- package/dist/Model.js.map +1 -0
- package/dist/PersistentCollection.cjs +285 -0
- package/dist/PersistentCollection.cjs.map +1 -0
- package/dist/PersistentCollection.d.ts +4 -4
- package/dist/PersistentCollection.d.ts.map +1 -1
- package/dist/PersistentCollection.js +285 -0
- package/dist/PersistentCollection.js.map +1 -0
- package/dist/Resource.cjs +308 -0
- package/dist/Resource.cjs.map +1 -0
- package/dist/Resource.d.ts +6 -6
- package/dist/Resource.d.ts.map +1 -1
- package/dist/Resource.js +308 -0
- package/dist/Resource.js.map +1 -0
- package/dist/Service.cjs +51 -0
- package/dist/Service.cjs.map +1 -0
- package/dist/Service.js +51 -0
- package/dist/Service.js.map +1 -0
- package/dist/ViewModel.cjs +582 -0
- package/dist/ViewModel.cjs.map +1 -0
- package/dist/ViewModel.d.ts +3 -9
- package/dist/ViewModel.d.ts.map +1 -1
- package/dist/ViewModel.js +582 -0
- package/dist/ViewModel.js.map +1 -0
- package/dist/errors.cjs +79 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.js +79 -0
- package/dist/errors.js.map +1 -0
- package/dist/mvc-kit.cjs +29 -1
- package/dist/mvc-kit.cjs.map +1 -1
- package/dist/mvc-kit.js +27 -1132
- package/dist/mvc-kit.js.map +1 -1
- package/dist/react/guards.cjs +7 -0
- package/dist/react/guards.cjs.map +1 -0
- package/dist/react/guards.js +7 -0
- package/dist/react/guards.js.map +1 -0
- package/dist/react/provider.cjs +26 -0
- package/dist/react/provider.cjs.map +1 -0
- package/dist/react/provider.js +26 -0
- package/dist/react/provider.js.map +1 -0
- package/dist/react/types.d.ts +1 -1
- package/dist/react/types.d.ts.map +1 -1
- package/dist/react/use-event-bus.cjs +26 -0
- package/dist/react/use-event-bus.cjs.map +1 -0
- package/dist/react/use-event-bus.js +26 -0
- package/dist/react/use-event-bus.js.map +1 -0
- package/dist/react/use-instance.cjs +31 -0
- package/dist/react/use-instance.cjs.map +1 -0
- package/dist/react/use-instance.d.ts +1 -1
- package/dist/react/use-instance.d.ts.map +1 -1
- package/dist/react/use-instance.js +31 -0
- package/dist/react/use-instance.js.map +1 -0
- package/dist/react/use-local.cjs +64 -0
- package/dist/react/use-local.cjs.map +1 -0
- package/dist/react/use-local.d.ts +4 -4
- package/dist/react/use-local.d.ts.map +1 -1
- package/dist/react/use-local.js +64 -0
- package/dist/react/use-local.js.map +1 -0
- package/dist/react/use-model.cjs +80 -0
- package/dist/react/use-model.cjs.map +1 -0
- package/dist/react/use-model.d.ts +1 -1
- package/dist/react/use-model.d.ts.map +1 -1
- package/dist/react/use-model.js +80 -0
- package/dist/react/use-model.js.map +1 -0
- package/dist/react/use-singleton.cjs +21 -0
- package/dist/react/use-singleton.cjs.map +1 -0
- package/dist/react/use-singleton.d.ts +1 -1
- package/dist/react/use-singleton.d.ts.map +1 -1
- package/dist/react/use-singleton.js +21 -0
- package/dist/react/use-singleton.js.map +1 -0
- package/dist/react/use-teardown.cjs +22 -0
- package/dist/react/use-teardown.cjs.map +1 -0
- package/dist/react/use-teardown.js +22 -0
- package/dist/react/use-teardown.js.map +1 -0
- package/dist/react-native/NativeCollection.cjs +76 -0
- package/dist/react-native/NativeCollection.cjs.map +1 -0
- package/dist/react-native/NativeCollection.js +76 -0
- package/dist/react-native/NativeCollection.js.map +1 -0
- package/dist/react-native.cjs +4 -1
- package/dist/react-native.cjs.map +1 -1
- package/dist/react-native.js +2 -60
- package/dist/react-native.js.map +1 -1
- package/dist/react.cjs +19 -1
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +17 -145
- package/dist/react.js.map +1 -1
- package/dist/singleton.cjs +34 -0
- package/dist/singleton.cjs.map +1 -0
- package/dist/singleton.js +34 -0
- package/dist/singleton.js.map +1 -0
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/walkPrototypeChain.cjs +15 -0
- package/dist/walkPrototypeChain.cjs.map +1 -0
- package/dist/walkPrototypeChain.d.ts +9 -0
- package/dist/walkPrototypeChain.d.ts.map +1 -0
- package/dist/walkPrototypeChain.js +15 -0
- package/dist/walkPrototypeChain.js.map +1 -0
- package/dist/web/IndexedDBCollection.cjs +37 -0
- package/dist/web/IndexedDBCollection.cjs.map +1 -0
- package/dist/web/IndexedDBCollection.js +37 -0
- package/dist/web/IndexedDBCollection.js.map +1 -0
- package/dist/web/WebStorageCollection.cjs +85 -0
- package/dist/web/WebStorageCollection.cjs.map +1 -0
- package/dist/web/WebStorageCollection.d.ts +2 -2
- package/dist/web/WebStorageCollection.d.ts.map +1 -1
- package/dist/web/WebStorageCollection.js +85 -0
- package/dist/web/WebStorageCollection.js.map +1 -0
- package/dist/web/idb.cjs +121 -0
- package/dist/web/idb.cjs.map +1 -0
- package/dist/web/idb.js +121 -0
- package/dist/web/idb.js.map +1 -0
- package/dist/web.cjs +6 -1
- package/dist/web.cjs.map +1 -1
- package/dist/web.js +4 -178
- package/dist/web.js.map +1 -1
- package/package.json +4 -2
- package/dist/PersistentCollection-B8kNECDj.cjs +0 -2
- package/dist/PersistentCollection-B8kNECDj.cjs.map +0 -1
- package/dist/PersistentCollection-BFrgskju.js +0 -542
- package/dist/PersistentCollection-BFrgskju.js.map +0 -1
- package/dist/singleton-CaEXSbYg.js +0 -89
- package/dist/singleton-CaEXSbYg.js.map +0 -1
- package/dist/singleton-L-u2W_lX.cjs +0 -2
- package/dist/singleton-L-u2W_lX.cjs.map +0 -1
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
class r {
|
|
2
|
-
_disposed = !1;
|
|
3
|
-
_handlers = /* @__PURE__ */ new Map();
|
|
4
|
-
_abortController = null;
|
|
5
|
-
_cleanups = null;
|
|
6
|
-
/** Whether this instance has been disposed. */
|
|
7
|
-
get disposed() {
|
|
8
|
-
return this._disposed;
|
|
9
|
-
}
|
|
10
|
-
/** AbortSignal that fires when this instance is disposed. Lazily created. */
|
|
11
|
-
get disposeSignal() {
|
|
12
|
-
return this._abortController || (this._abortController = new AbortController()), this._abortController.signal;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Emit an event with a payload.
|
|
16
|
-
*/
|
|
17
|
-
emit(s, n) {
|
|
18
|
-
if (this._disposed)
|
|
19
|
-
throw new Error("Cannot emit on disposed EventBus");
|
|
20
|
-
const e = this._handlers.get(s);
|
|
21
|
-
if (e)
|
|
22
|
-
for (const i of e)
|
|
23
|
-
i(n);
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Subscribe to an event. Returns unsubscribe function.
|
|
27
|
-
*/
|
|
28
|
-
on(s, n) {
|
|
29
|
-
if (this._disposed)
|
|
30
|
-
return () => {
|
|
31
|
-
};
|
|
32
|
-
let e = this._handlers.get(s);
|
|
33
|
-
return e || (e = /* @__PURE__ */ new Set(), this._handlers.set(s, e)), e.add(n), () => {
|
|
34
|
-
e.delete(n);
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Subscribe to an event once. Auto-unsubscribes after first invocation.
|
|
39
|
-
*/
|
|
40
|
-
once(s, n) {
|
|
41
|
-
const e = this.on(s, (i) => {
|
|
42
|
-
e(), n(i);
|
|
43
|
-
});
|
|
44
|
-
return e;
|
|
45
|
-
}
|
|
46
|
-
/** Tears down the instance, releasing all subscriptions and resources. */
|
|
47
|
-
dispose() {
|
|
48
|
-
if (!this._disposed) {
|
|
49
|
-
if (this._disposed = !0, this._abortController?.abort(), this._cleanups) {
|
|
50
|
-
for (const s of this._cleanups) s();
|
|
51
|
-
this._cleanups = null;
|
|
52
|
-
}
|
|
53
|
-
this.onDispose?.(), this._handlers.clear();
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/** Registers a cleanup function to be called on dispose. @protected */
|
|
57
|
-
addCleanup(s) {
|
|
58
|
-
this._cleanups || (this._cleanups = []), this._cleanups.push(s);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
const o = /* @__PURE__ */ new Map();
|
|
62
|
-
function l(t, ...s) {
|
|
63
|
-
const n = o.get(t);
|
|
64
|
-
if (n && !n.disposed)
|
|
65
|
-
return n;
|
|
66
|
-
const e = new t(...s);
|
|
67
|
-
return o.set(t, e), e;
|
|
68
|
-
}
|
|
69
|
-
function a(t) {
|
|
70
|
-
const s = o.get(t);
|
|
71
|
-
return s !== void 0 && !s.disposed;
|
|
72
|
-
}
|
|
73
|
-
function d(t) {
|
|
74
|
-
const s = o.get(t);
|
|
75
|
-
s && (s.dispose(), o.delete(t));
|
|
76
|
-
}
|
|
77
|
-
function h() {
|
|
78
|
-
for (const t of o.values())
|
|
79
|
-
t.dispose();
|
|
80
|
-
o.clear();
|
|
81
|
-
}
|
|
82
|
-
export {
|
|
83
|
-
r as E,
|
|
84
|
-
h as a,
|
|
85
|
-
a as h,
|
|
86
|
-
l as s,
|
|
87
|
-
d as t
|
|
88
|
-
};
|
|
89
|
-
//# sourceMappingURL=singleton-CaEXSbYg.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"singleton-CaEXSbYg.js","sources":["../src/EventBus.ts","../src/singleton.ts"],"sourcesContent":["import type { Disposable } from './types';\n\ntype Handler<T> = (payload: T) => void;\n\n/**\n * Typed pub/sub event bus.\n */\nexport class EventBus<E extends Record<string, any>> implements Disposable {\n /** Phantom type brand — enables correct inference of E in generic helpers like useEvent(). */\n declare readonly _types: E;\n\n private _disposed = false;\n private _handlers = new Map<keyof E, Set<Handler<unknown>>>();\n private _abortController: AbortController | null = null;\n private _cleanups: (() => void)[] | null = null;\n\n /** Whether this instance has been disposed. */\n get disposed(): boolean {\n return this._disposed;\n }\n\n /** AbortSignal that fires when this instance is disposed. Lazily created. */\n get disposeSignal(): AbortSignal {\n if (!this._abortController) {\n this._abortController = new AbortController();\n }\n return this._abortController.signal;\n }\n\n /**\n * Emit an event with a payload.\n */\n emit<K extends keyof E>(event: K, payload: E[K]): void {\n if (this._disposed) {\n throw new Error('Cannot emit on disposed EventBus');\n }\n\n const handlers = this._handlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n handler(payload);\n }\n }\n }\n\n /**\n * Subscribe to an event. Returns unsubscribe function.\n */\n on<K extends keyof E>(event: K, handler: Handler<E[K]>): () => void {\n if (this._disposed) {\n return () => {};\n }\n\n let handlers = this._handlers.get(event);\n if (!handlers) {\n handlers = new Set();\n this._handlers.set(event, handlers);\n }\n\n handlers.add(handler as Handler<unknown>);\n\n return () => {\n handlers!.delete(handler as Handler<unknown>);\n };\n }\n\n /**\n * Subscribe to an event once. Auto-unsubscribes after first invocation.\n */\n once<K extends keyof E>(event: K, handler: Handler<E[K]>): () => void {\n const unsubscribe = this.on(event, (payload) => {\n unsubscribe();\n handler(payload);\n });\n return unsubscribe;\n }\n\n /** Tears down the instance, releasing all subscriptions and resources. */\n dispose(): void {\n if (this._disposed) {\n return;\n }\n\n this._disposed = true;\n this._abortController?.abort();\n if (this._cleanups) {\n for (const fn of this._cleanups) fn();\n this._cleanups = null;\n }\n this.onDispose?.();\n this._handlers.clear();\n }\n\n /** Registers a cleanup function to be called on dispose. @protected */\n protected addCleanup(fn: () => void): void {\n if (!this._cleanups) {\n this._cleanups = [];\n }\n this._cleanups.push(fn);\n }\n\n /** Lifecycle hook called during dispose(). Override for custom teardown. @protected */\n protected onDispose?(): void;\n}\n","import type { Disposable } from './types';\n\n// Using 'any' for registry types to avoid variance issues with generics\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyDisposableClass = new (...args: any[]) => Disposable;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst registry = new Map<AnyDisposableClass, Disposable>();\n\n/**\n * Get-or-create a singleton instance for the given class.\n * Returns the existing instance if one exists and is not disposed; otherwise creates a new one.\n */\nexport function singleton<T extends Disposable, Args extends unknown[]>(\n Class: new (...args: Args) => T,\n ...args: Args\n): T {\n const existing = registry.get(Class as AnyDisposableClass);\n\n if (existing && !existing.disposed) {\n return existing as T;\n }\n\n const instance = new Class(...args);\n registry.set(Class as AnyDisposableClass, instance);\n return instance;\n}\n\n/**\n * Check if a singleton instance exists for a class.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function hasSingleton(Class: new (...args: any[]) => Disposable): boolean {\n const existing = registry.get(Class);\n return existing !== undefined && !existing.disposed;\n}\n\n/**\n * Disposes and removes the singleton instance for the given class.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function teardown(Class: new (...args: any[]) => Disposable): void {\n const instance = registry.get(Class);\n if (instance) {\n instance.dispose();\n registry.delete(Class);\n }\n}\n\n/**\n * Disposes all singletons and clears the registry. Typically used in test cleanup.\n */\nexport function teardownAll(): void {\n for (const instance of registry.values()) {\n instance.dispose();\n }\n registry.clear();\n}\n"],"names":["EventBus","event","payload","handlers","handler","unsubscribe","fn","registry","singleton","Class","args","existing","instance","hasSingleton","teardown","teardownAll"],"mappings":"AAOO,MAAMA,EAA8D;AAAA,EAIjE,YAAY;AAAA,EACZ,gCAAgB,IAAA;AAAA,EAChB,mBAA2C;AAAA,EAC3C,YAAmC;AAAA;AAAA,EAG3C,IAAI,WAAoB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,gBAA6B;AAC/B,WAAK,KAAK,qBACR,KAAK,mBAAmB,IAAI,gBAAA,IAEvB,KAAK,iBAAiB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAwBC,GAAUC,GAAqB;AACrD,QAAI,KAAK;AACP,YAAM,IAAI,MAAM,kCAAkC;AAGpD,UAAMC,IAAW,KAAK,UAAU,IAAIF,CAAK;AACzC,QAAIE;AACF,iBAAWC,KAAWD;AACpB,QAAAC,EAAQF,CAAO;AAAA,EAGrB;AAAA;AAAA;AAAA;AAAA,EAKA,GAAsBD,GAAUG,GAAoC;AAClE,QAAI,KAAK;AACP,aAAO,MAAM;AAAA,MAAC;AAGhB,QAAID,IAAW,KAAK,UAAU,IAAIF,CAAK;AACvC,WAAKE,MACHA,wBAAe,IAAA,GACf,KAAK,UAAU,IAAIF,GAAOE,CAAQ,IAGpCA,EAAS,IAAIC,CAA2B,GAEjC,MAAM;AACX,MAAAD,EAAU,OAAOC,CAA2B;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAwBH,GAAUG,GAAoC;AACpE,UAAMC,IAAc,KAAK,GAAGJ,GAAO,CAACC,MAAY;AAC9C,MAAAG,EAAA,GACAD,EAAQF,CAAO;AAAA,IACjB,CAAC;AACD,WAAOG;AAAA,EACT;AAAA;AAAA,EAGA,UAAgB;AACd,QAAI,MAAK,WAMT;AAAA,UAFA,KAAK,YAAY,IACjB,KAAK,kBAAkB,MAAA,GACnB,KAAK,WAAW;AAClB,mBAAWC,KAAM,KAAK,UAAW,CAAAA,EAAA;AACjC,aAAK,YAAY;AAAA,MACnB;AACA,WAAK,YAAA,GACL,KAAK,UAAU,MAAA;AAAA;AAAA,EACjB;AAAA;AAAA,EAGU,WAAWA,GAAsB;AACzC,IAAK,KAAK,cACR,KAAK,YAAY,CAAA,IAEnB,KAAK,UAAU,KAAKA,CAAE;AAAA,EACxB;AAIF;ACjGA,MAAMC,wBAAe,IAAA;AAMd,SAASC,EACdC,MACGC,GACA;AACH,QAAMC,IAAWJ,EAAS,IAAIE,CAA2B;AAEzD,MAAIE,KAAY,CAACA,EAAS;AACxB,WAAOA;AAGT,QAAMC,IAAW,IAAIH,EAAM,GAAGC,CAAI;AAClC,SAAAH,EAAS,IAAIE,GAA6BG,CAAQ,GAC3CA;AACT;AAMO,SAASC,EAAaJ,GAAoD;AAC/E,QAAME,IAAWJ,EAAS,IAAIE,CAAK;AACnC,SAAOE,MAAa,UAAa,CAACA,EAAS;AAC7C;AAMO,SAASG,EAASL,GAAiD;AACxE,QAAMG,IAAWL,EAAS,IAAIE,CAAK;AACnC,EAAIG,MACFA,EAAS,QAAA,GACTL,EAAS,OAAOE,CAAK;AAEzB;AAKO,SAASM,IAAoB;AAClC,aAAWH,KAAYL,EAAS;AAC9B,IAAAK,EAAS,QAAA;AAEX,EAAAL,EAAS,MAAA;AACX;"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";class r{_disposed=!1;_handlers=new Map;_abortController=null;_cleanups=null;get disposed(){return this._disposed}get disposeSignal(){return this._abortController||(this._abortController=new AbortController),this._abortController.signal}emit(s,n){if(this._disposed)throw new Error("Cannot emit on disposed EventBus");const e=this._handlers.get(s);if(e)for(const i of e)i(n)}on(s,n){if(this._disposed)return()=>{};let e=this._handlers.get(s);return e||(e=new Set,this._handlers.set(s,e)),e.add(n),()=>{e.delete(n)}}once(s,n){const e=this.on(s,i=>{e(),n(i)});return e}dispose(){if(!this._disposed){if(this._disposed=!0,this._abortController?.abort(),this._cleanups){for(const s of this._cleanups)s();this._cleanups=null}this.onDispose?.(),this._handlers.clear()}}addCleanup(s){this._cleanups||(this._cleanups=[]),this._cleanups.push(s)}}const o=new Map;function l(t,...s){const n=o.get(t);if(n&&!n.disposed)return n;const e=new t(...s);return o.set(t,e),e}function d(t){const s=o.get(t);return s!==void 0&&!s.disposed}function a(t){const s=o.get(t);s&&(s.dispose(),o.delete(t))}function u(){for(const t of o.values())t.dispose();o.clear()}exports.EventBus=r;exports.hasSingleton=d;exports.singleton=l;exports.teardown=a;exports.teardownAll=u;
|
|
2
|
-
//# sourceMappingURL=singleton-L-u2W_lX.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"singleton-L-u2W_lX.cjs","sources":["../src/EventBus.ts","../src/singleton.ts"],"sourcesContent":["import type { Disposable } from './types';\n\ntype Handler<T> = (payload: T) => void;\n\n/**\n * Typed pub/sub event bus.\n */\nexport class EventBus<E extends Record<string, any>> implements Disposable {\n /** Phantom type brand — enables correct inference of E in generic helpers like useEvent(). */\n declare readonly _types: E;\n\n private _disposed = false;\n private _handlers = new Map<keyof E, Set<Handler<unknown>>>();\n private _abortController: AbortController | null = null;\n private _cleanups: (() => void)[] | null = null;\n\n /** Whether this instance has been disposed. */\n get disposed(): boolean {\n return this._disposed;\n }\n\n /** AbortSignal that fires when this instance is disposed. Lazily created. */\n get disposeSignal(): AbortSignal {\n if (!this._abortController) {\n this._abortController = new AbortController();\n }\n return this._abortController.signal;\n }\n\n /**\n * Emit an event with a payload.\n */\n emit<K extends keyof E>(event: K, payload: E[K]): void {\n if (this._disposed) {\n throw new Error('Cannot emit on disposed EventBus');\n }\n\n const handlers = this._handlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n handler(payload);\n }\n }\n }\n\n /**\n * Subscribe to an event. Returns unsubscribe function.\n */\n on<K extends keyof E>(event: K, handler: Handler<E[K]>): () => void {\n if (this._disposed) {\n return () => {};\n }\n\n let handlers = this._handlers.get(event);\n if (!handlers) {\n handlers = new Set();\n this._handlers.set(event, handlers);\n }\n\n handlers.add(handler as Handler<unknown>);\n\n return () => {\n handlers!.delete(handler as Handler<unknown>);\n };\n }\n\n /**\n * Subscribe to an event once. Auto-unsubscribes after first invocation.\n */\n once<K extends keyof E>(event: K, handler: Handler<E[K]>): () => void {\n const unsubscribe = this.on(event, (payload) => {\n unsubscribe();\n handler(payload);\n });\n return unsubscribe;\n }\n\n /** Tears down the instance, releasing all subscriptions and resources. */\n dispose(): void {\n if (this._disposed) {\n return;\n }\n\n this._disposed = true;\n this._abortController?.abort();\n if (this._cleanups) {\n for (const fn of this._cleanups) fn();\n this._cleanups = null;\n }\n this.onDispose?.();\n this._handlers.clear();\n }\n\n /** Registers a cleanup function to be called on dispose. @protected */\n protected addCleanup(fn: () => void): void {\n if (!this._cleanups) {\n this._cleanups = [];\n }\n this._cleanups.push(fn);\n }\n\n /** Lifecycle hook called during dispose(). Override for custom teardown. @protected */\n protected onDispose?(): void;\n}\n","import type { Disposable } from './types';\n\n// Using 'any' for registry types to avoid variance issues with generics\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyDisposableClass = new (...args: any[]) => Disposable;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst registry = new Map<AnyDisposableClass, Disposable>();\n\n/**\n * Get-or-create a singleton instance for the given class.\n * Returns the existing instance if one exists and is not disposed; otherwise creates a new one.\n */\nexport function singleton<T extends Disposable, Args extends unknown[]>(\n Class: new (...args: Args) => T,\n ...args: Args\n): T {\n const existing = registry.get(Class as AnyDisposableClass);\n\n if (existing && !existing.disposed) {\n return existing as T;\n }\n\n const instance = new Class(...args);\n registry.set(Class as AnyDisposableClass, instance);\n return instance;\n}\n\n/**\n * Check if a singleton instance exists for a class.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function hasSingleton(Class: new (...args: any[]) => Disposable): boolean {\n const existing = registry.get(Class);\n return existing !== undefined && !existing.disposed;\n}\n\n/**\n * Disposes and removes the singleton instance for the given class.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function teardown(Class: new (...args: any[]) => Disposable): void {\n const instance = registry.get(Class);\n if (instance) {\n instance.dispose();\n registry.delete(Class);\n }\n}\n\n/**\n * Disposes all singletons and clears the registry. Typically used in test cleanup.\n */\nexport function teardownAll(): void {\n for (const instance of registry.values()) {\n instance.dispose();\n }\n registry.clear();\n}\n"],"names":["EventBus","event","payload","handlers","handler","unsubscribe","fn","registry","singleton","Class","args","existing","instance","hasSingleton","teardown","teardownAll"],"mappings":"aAOO,MAAMA,CAA8D,CAIjE,UAAY,GACZ,cAAgB,IAChB,iBAA2C,KAC3C,UAAmC,KAG3C,IAAI,UAAoB,CACtB,OAAO,KAAK,SACd,CAGA,IAAI,eAA6B,CAC/B,OAAK,KAAK,mBACR,KAAK,iBAAmB,IAAI,iBAEvB,KAAK,iBAAiB,MAC/B,CAKA,KAAwBC,EAAUC,EAAqB,CACrD,GAAI,KAAK,UACP,MAAM,IAAI,MAAM,kCAAkC,EAGpD,MAAMC,EAAW,KAAK,UAAU,IAAIF,CAAK,EACzC,GAAIE,EACF,UAAWC,KAAWD,EACpBC,EAAQF,CAAO,CAGrB,CAKA,GAAsBD,EAAUG,EAAoC,CAClE,GAAI,KAAK,UACP,MAAO,IAAM,CAAC,EAGhB,IAAID,EAAW,KAAK,UAAU,IAAIF,CAAK,EACvC,OAAKE,IACHA,MAAe,IACf,KAAK,UAAU,IAAIF,EAAOE,CAAQ,GAGpCA,EAAS,IAAIC,CAA2B,EAEjC,IAAM,CACXD,EAAU,OAAOC,CAA2B,CAC9C,CACF,CAKA,KAAwBH,EAAUG,EAAoC,CACpE,MAAMC,EAAc,KAAK,GAAGJ,EAAQC,GAAY,CAC9CG,EAAA,EACAD,EAAQF,CAAO,CACjB,CAAC,EACD,OAAOG,CACT,CAGA,SAAgB,CACd,GAAI,MAAK,UAMT,IAFA,KAAK,UAAY,GACjB,KAAK,kBAAkB,MAAA,EACnB,KAAK,UAAW,CAClB,UAAWC,KAAM,KAAK,UAAWA,EAAA,EACjC,KAAK,UAAY,IACnB,CACA,KAAK,YAAA,EACL,KAAK,UAAU,MAAA,EACjB,CAGU,WAAWA,EAAsB,CACpC,KAAK,YACR,KAAK,UAAY,CAAA,GAEnB,KAAK,UAAU,KAAKA,CAAE,CACxB,CAIF,CCjGA,MAAMC,MAAe,IAMd,SAASC,EACdC,KACGC,EACA,CACH,MAAMC,EAAWJ,EAAS,IAAIE,CAA2B,EAEzD,GAAIE,GAAY,CAACA,EAAS,SACxB,OAAOA,EAGT,MAAMC,EAAW,IAAIH,EAAM,GAAGC,CAAI,EAClC,OAAAH,EAAS,IAAIE,EAA6BG,CAAQ,EAC3CA,CACT,CAMO,SAASC,EAAaJ,EAAoD,CAC/E,MAAME,EAAWJ,EAAS,IAAIE,CAAK,EACnC,OAAOE,IAAa,QAAa,CAACA,EAAS,QAC7C,CAMO,SAASG,EAASL,EAAiD,CACxE,MAAMG,EAAWL,EAAS,IAAIE,CAAK,EAC/BG,IACFA,EAAS,QAAA,EACTL,EAAS,OAAOE,CAAK,EAEzB,CAKO,SAASM,GAAoB,CAClC,UAAWH,KAAYL,EAAS,SAC9BK,EAAS,QAAA,EAEXL,EAAS,MAAA,CACX"}
|