@blac/core 2.0.11 → 2.0.12

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.
Files changed (202) hide show
  1. package/dist/Cubit-9jal5zdZ.cjs +390 -0
  2. package/dist/Cubit-9jal5zdZ.cjs.map +1 -0
  3. package/dist/Cubit-BAUPiUF7.cjs +307 -0
  4. package/dist/Cubit-BAUPiUF7.cjs.map +1 -0
  5. package/dist/Cubit-BOgUZva7.js +284 -0
  6. package/dist/Cubit-BOgUZva7.js.map +1 -0
  7. package/dist/Cubit-BTznt8zg.js +370 -0
  8. package/dist/Cubit-BTznt8zg.js.map +1 -0
  9. package/dist/Cubit-CZaf_fp4.cjs +367 -292
  10. package/dist/Cubit-C_dUEUdd.cjs +307 -0
  11. package/dist/Cubit-C_dUEUdd.cjs.map +1 -0
  12. package/dist/Cubit-D2vQ6nMb.js +284 -0
  13. package/dist/Cubit-D2vQ6nMb.js.map +1 -0
  14. package/dist/Cubit-D7jOZCoZ.js +284 -0
  15. package/dist/Cubit-D7jOZCoZ.js.map +1 -0
  16. package/dist/Cubit-DP5DXPUK.js +284 -0
  17. package/dist/Cubit-DP5DXPUK.js.map +1 -0
  18. package/dist/Cubit-DbnhTUaZ.cjs +307 -0
  19. package/dist/Cubit-DbnhTUaZ.cjs.map +1 -0
  20. package/dist/Cubit-Dw_kFBgc.js +372 -0
  21. package/dist/Cubit-Dw_kFBgc.js.map +1 -0
  22. package/dist/Cubit-KiXZCubP.cjs +392 -0
  23. package/dist/Cubit-KiXZCubP.cjs.map +1 -0
  24. package/dist/Cubit-Ksj7G4uR.js +284 -0
  25. package/dist/Cubit-Ksj7G4uR.js.map +1 -0
  26. package/dist/Cubit-MkjbpcPf.cjs +307 -0
  27. package/dist/Cubit-MkjbpcPf.cjs.map +1 -0
  28. package/dist/Cubit-PMTXxI_u.js +350 -272
  29. package/dist/Cubit-kU5_4jgC.cjs +307 -0
  30. package/dist/Cubit-kU5_4jgC.cjs.map +1 -0
  31. package/dist/StateContainerRegistry-BhcnG0DF.js +602 -0
  32. package/dist/StateContainerRegistry-BhcnG0DF.js.map +1 -0
  33. package/dist/StateContainerRegistry-BsMIpllP.cjs +612 -560
  34. package/dist/StateContainerRegistry-Ck2-XmT_.js +567 -0
  35. package/dist/StateContainerRegistry-Ck2-XmT_.js.map +1 -0
  36. package/dist/StateContainerRegistry-DC4N73O6.js +609 -0
  37. package/dist/StateContainerRegistry-DC4N73O6.js.map +1 -0
  38. package/dist/StateContainerRegistry-DOkDGng-.js +586 -526
  39. package/dist/StateContainerRegistry-DOuGI-l5.js +622 -0
  40. package/dist/StateContainerRegistry-DOuGI-l5.js.map +1 -0
  41. package/dist/StateContainerRegistry-DT66lr3I.cjs +643 -0
  42. package/dist/StateContainerRegistry-DT66lr3I.cjs.map +1 -0
  43. package/dist/StateContainerRegistry-Yph6UCA_.js +610 -0
  44. package/dist/StateContainerRegistry-Yph6UCA_.js.map +1 -0
  45. package/dist/StateContainerRegistry-mseeTqSA.cjs +663 -0
  46. package/dist/StateContainerRegistry-mseeTqSA.cjs.map +1 -0
  47. package/dist/StateContainerRegistry-pRNxHNFD.cjs +650 -0
  48. package/dist/StateContainerRegistry-pRNxHNFD.cjs.map +1 -0
  49. package/dist/StateContainerRegistry-vXMWtG7J.cjs +608 -0
  50. package/dist/StateContainerRegistry-vXMWtG7J.cjs.map +1 -0
  51. package/dist/StateContainerRegistry-v_prqMcI.cjs +651 -0
  52. package/dist/StateContainerRegistry-v_prqMcI.cjs.map +1 -0
  53. package/dist/branded-BSeA_mZO.cjs +18 -0
  54. package/dist/branded-BSeA_mZO.cjs.map +1 -0
  55. package/dist/branded-DwtzSsg0.js +13 -0
  56. package/dist/branded-DwtzSsg0.js.map +1 -0
  57. package/dist/config-BKoaAlmb.js +16 -0
  58. package/dist/config-BKoaAlmb.js.map +1 -0
  59. package/dist/config-CCUhIYIF.js +16 -0
  60. package/dist/config-CCUhIYIF.js.map +1 -0
  61. package/dist/config-CR_Bz7RD.js +16 -0
  62. package/dist/config-CR_Bz7RD.js.map +1 -0
  63. package/dist/config-CTOa-yPN.cjs +32 -0
  64. package/dist/config-CTOa-yPN.cjs.map +1 -0
  65. package/dist/config-D3jisfdj.cjs +32 -0
  66. package/dist/config-D3jisfdj.cjs.map +1 -0
  67. package/dist/config-D4GifZQ4.js +16 -0
  68. package/dist/config-D4GifZQ4.js.map +1 -0
  69. package/dist/config-DDrSQGpQ.cjs +32 -0
  70. package/dist/config-DDrSQGpQ.cjs.map +1 -0
  71. package/dist/config-DLzmy2rZ.cjs +20 -20
  72. package/dist/config-DMNZ2YLV.cjs +32 -0
  73. package/dist/config-DMNZ2YLV.cjs.map +1 -0
  74. package/dist/config-DokTzpr8.cjs +32 -0
  75. package/dist/config-DokTzpr8.cjs.map +1 -0
  76. package/dist/config-DslYBm4Z.js +16 -0
  77. package/dist/config-DslYBm4Z.js.map +1 -0
  78. package/dist/config-XQua95Xz.js +5 -5
  79. package/dist/core/StateContainer.d.ts +1 -1
  80. package/dist/core/StateContainerRegistry.d.ts +29 -17
  81. package/dist/debug.cjs +4 -3
  82. package/dist/debug.d.cts +5 -6
  83. package/dist/debug.d.ts +5 -6
  84. package/dist/debug.js +4 -4
  85. package/dist/ensure-9VEq5H0L.js +9 -0
  86. package/dist/ensure-9VEq5H0L.js.map +1 -0
  87. package/dist/ensure-BNDfTzqg.cjs +14 -0
  88. package/dist/ensure-BNDfTzqg.cjs.map +1 -0
  89. package/dist/ensure-BVCnjU7r.js +289 -0
  90. package/dist/ensure-BVCnjU7r.js.map +1 -0
  91. package/dist/ensure-BbzGXjep.cjs +14 -0
  92. package/dist/ensure-BbzGXjep.cjs.map +1 -0
  93. package/dist/ensure-C5I1xp2C.js +3 -3
  94. package/dist/ensure-CJZL7bcA.cjs +318 -0
  95. package/dist/ensure-CJZL7bcA.cjs.map +1 -0
  96. package/dist/ensure-CSHYjIeH.cjs +8 -8
  97. package/dist/ensure-CU-B1ywv.js +9 -0
  98. package/dist/ensure-CU-B1ywv.js.map +1 -0
  99. package/dist/ensure-D63lEMUK.cjs +14 -0
  100. package/dist/ensure-D63lEMUK.cjs.map +1 -0
  101. package/dist/ensure-DamKOP6q.cjs +14 -0
  102. package/dist/ensure-DamKOP6q.cjs.map +1 -0
  103. package/dist/ensure-Def-EBWG.js +9 -0
  104. package/dist/ensure-Def-EBWG.js.map +1 -0
  105. package/dist/ensure-Sb92MCXu.js +9 -0
  106. package/dist/ensure-Sb92MCXu.js.map +1 -0
  107. package/dist/ensure-n80crSlX.js +9 -0
  108. package/dist/ensure-n80crSlX.js.map +1 -0
  109. package/dist/ensure-vS71MV4q.cjs +14 -0
  110. package/dist/ensure-vS71MV4q.cjs.map +1 -0
  111. package/dist/index.cjs +12 -10
  112. package/dist/index.cjs.map +1 -1
  113. package/dist/index.d.cts +1 -1
  114. package/dist/index.d.ts +1 -1
  115. package/dist/index.js +12 -11
  116. package/dist/index.js.map +1 -1
  117. package/dist/management-Bg652agq.js +32 -0
  118. package/dist/management-Bg652agq.js.map +1 -0
  119. package/dist/management-C-wBdpho.js +18 -10
  120. package/dist/management-CU_V3LIP.js +32 -0
  121. package/dist/management-CU_V3LIP.js.map +1 -0
  122. package/dist/management-CaqiyNzB.js +32 -0
  123. package/dist/management-CaqiyNzB.js.map +1 -0
  124. package/dist/management-Cin-JvYe.js +32 -0
  125. package/dist/management-Cin-JvYe.js.map +1 -0
  126. package/dist/management-ClaXym0F.cjs +79 -0
  127. package/dist/management-ClaXym0F.cjs.map +1 -0
  128. package/dist/management-Dag9u4t6.cjs +79 -0
  129. package/dist/management-Dag9u4t6.cjs.map +1 -0
  130. package/dist/management-DbMRdDBo.cjs +79 -0
  131. package/dist/management-DbMRdDBo.cjs.map +1 -0
  132. package/dist/management-ZU2YzOkr.js +29 -0
  133. package/dist/management-ZU2YzOkr.js.map +1 -0
  134. package/dist/management-baPDwA9n.cjs +79 -0
  135. package/dist/management-baPDwA9n.cjs.map +1 -0
  136. package/dist/management-jQGCvZNN.cjs +70 -0
  137. package/dist/management-jQGCvZNN.cjs.map +1 -0
  138. package/dist/management-xoZ7w3bI.cjs +44 -44
  139. package/dist/plugin/BlacPlugin.d.ts +15 -0
  140. package/dist/plugins.cjs +1 -1
  141. package/dist/plugins.js +1 -1
  142. package/dist/registry/acquire.d.ts +1 -1
  143. package/dist/registry/index.d.ts +1 -1
  144. package/dist/registry/queries.d.ts +1 -0
  145. package/dist/registry/release.d.ts +1 -1
  146. package/dist/resolve-dependencies-BA3u06uC.js +643 -561
  147. package/dist/resolve-dependencies-BFZQq60Y.cjs +774 -0
  148. package/dist/resolve-dependencies-BFZQq60Y.cjs.map +1 -0
  149. package/dist/resolve-dependencies-BGafS3Ww.js +649 -0
  150. package/dist/resolve-dependencies-BGafS3Ww.js.map +1 -0
  151. package/dist/resolve-dependencies-BHd34gS3.cjs +774 -0
  152. package/dist/resolve-dependencies-BHd34gS3.cjs.map +1 -0
  153. package/dist/resolve-dependencies-BT6TU2HF.cjs +724 -666
  154. package/dist/resolve-dependencies-BiWkW2eS.js +649 -0
  155. package/dist/resolve-dependencies-BiWkW2eS.js.map +1 -0
  156. package/dist/resolve-dependencies-CTzV1txG.js +649 -0
  157. package/dist/resolve-dependencies-CTzV1txG.js.map +1 -0
  158. package/dist/resolve-dependencies-D0vTzZgs.js +649 -0
  159. package/dist/resolve-dependencies-D0vTzZgs.js.map +1 -0
  160. package/dist/resolve-dependencies-D2WnZMF-.cjs +774 -0
  161. package/dist/resolve-dependencies-D2WnZMF-.cjs.map +1 -0
  162. package/dist/resolve-dependencies-DSQNXvnV.cjs +774 -0
  163. package/dist/resolve-dependencies-DSQNXvnV.cjs.map +1 -0
  164. package/dist/resolve-dependencies-DcUUva2P.cjs +774 -0
  165. package/dist/resolve-dependencies-DcUUva2P.cjs.map +1 -0
  166. package/dist/resolve-dependencies-f-QUqYiL.js +649 -0
  167. package/dist/resolve-dependencies-f-QUqYiL.js.map +1 -0
  168. package/dist/testing.cjs +5 -5
  169. package/dist/testing.cjs.map +1 -1
  170. package/dist/testing.js +5 -5
  171. package/dist/testing.js.map +1 -1
  172. package/dist/tracked-B77j2g9M.js +177 -0
  173. package/dist/tracked-B77j2g9M.js.map +1 -0
  174. package/dist/tracked-BDVi2LKM.cjs +206 -0
  175. package/dist/tracked-BDVi2LKM.cjs.map +1 -0
  176. package/dist/tracked-BH-gX4T1.cjs +206 -0
  177. package/dist/tracked-BH-gX4T1.cjs.map +1 -0
  178. package/dist/tracked-BTHok3Dl.cjs +206 -0
  179. package/dist/tracked-BTHok3Dl.cjs.map +1 -0
  180. package/dist/tracked-CoAlC8fs.js +177 -0
  181. package/dist/tracked-CoAlC8fs.js.map +1 -0
  182. package/dist/tracked-DBn-bs_G.js +177 -0
  183. package/dist/tracked-DBn-bs_G.js.map +1 -0
  184. package/dist/tracked-DCfBaYjL.cjs +196 -175
  185. package/dist/tracked-DKduNLgI.js +171 -151
  186. package/dist/tracked-DMBTDF0P.js +177 -0
  187. package/dist/tracked-DMBTDF0P.js.map +1 -0
  188. package/dist/tracked-Dcu6EATB.js +177 -0
  189. package/dist/tracked-Dcu6EATB.js.map +1 -0
  190. package/dist/tracked-GvAJQVAI.cjs +240 -0
  191. package/dist/tracked-GvAJQVAI.cjs.map +1 -0
  192. package/dist/tracked-WF6aXuAo.js +199 -0
  193. package/dist/tracked-WF6aXuAo.js.map +1 -0
  194. package/dist/tracked-d_sQWU3c.cjs +206 -0
  195. package/dist/tracked-d_sQWU3c.cjs.map +1 -0
  196. package/dist/tracked-n9TMK-30.cjs +206 -0
  197. package/dist/tracked-n9TMK-30.cjs.map +1 -0
  198. package/dist/tracking.cjs +1 -1
  199. package/dist/tracking.js +1 -1
  200. package/dist/watch-entry.cjs +1 -1
  201. package/dist/watch-entry.js +1 -1
  202. package/package.json +1 -1
@@ -1,27 +1,27 @@
1
1
  import type { StateContainer } from './StateContainer';
2
2
  import { InstanceReadonlyState, StateContainerConstructor } from '../types/utilities';
3
3
  /**
4
- * Entry in the instance registry, tracking the instance and its reference count
4
+ * Entry in the instance registry, tracking the instance and its named references
5
5
  * @template T - Instance type
6
6
  */
7
7
  export interface InstanceEntry<T = any> {
8
8
  /** The state container instance */
9
9
  instance: T;
10
- /** Number of active references to this instance */
11
- refCount: number;
10
+ /** Map of active reference IDs to their acquire count (supports paired acquire/release) */
11
+ refs: Map<string, number>;
12
12
  }
13
13
  /**
14
14
  * Lifecycle events emitted by the registry
15
15
  */
16
- export type LifecycleEvent = 'created' | 'stateChanged' | 'disposed';
16
+ export type LifecycleEvent = 'created' | 'stateChanged' | 'disposed' | 'refAcquired' | 'refReleased';
17
17
  /**
18
18
  * Listener function type for each lifecycle event
19
19
  * @template E - The lifecycle event type
20
20
  */
21
- export type LifecycleListener<E extends LifecycleEvent> = E extends 'created' ? (container: StateContainer<any>) => void : E extends 'stateChanged' ? (container: StateContainer<any>, previousState: any, currentState: any, callstack?: string) => void : E extends 'disposed' ? (container: StateContainer<any>) => void : never;
21
+ export type LifecycleListener<E extends LifecycleEvent> = E extends 'created' ? (container: StateContainer<any>) => void : E extends 'stateChanged' ? (container: StateContainer<any>, previousState: any, currentState: any, callstack?: string) => void : E extends 'disposed' ? (container: StateContainer<any>) => void : E extends 'refAcquired' ? (container: StateContainer<any>, refId: string) => void : E extends 'refReleased' ? (container: StateContainer<any>, refId: string) => void : never;
22
22
  /**
23
23
  * Central registry for managing StateContainer instances.
24
- * Handles instance lifecycle, ref counting, and lifecycle event emission.
24
+ * Handles instance lifecycle, named ref tracking, and lifecycle event emission.
25
25
  *
26
26
  * @example
27
27
  * ```ts
@@ -38,6 +38,7 @@ export declare class StateContainerRegistry {
38
38
  private readonly types;
39
39
  private readonly registeredTypeNames;
40
40
  private readonly listeners;
41
+ private _autoRefIdCounter;
41
42
  /**
42
43
  * Register a type for lifecycle event tracking
43
44
  * @param constructor - The StateContainer class constructor
@@ -55,22 +56,24 @@ export declare class StateContainerRegistry {
55
56
  */
56
57
  getInstancesMap<T extends StateContainerConstructor>(Type: T): Map<string, InstanceEntry>;
57
58
  /**
58
- * Acquire an instance with ref counting (ownership semantics).
59
- * Creates a new instance if one doesn't exist, or returns existing and increments ref count.
60
- * You must call `release()` when done to decrement the ref count.
59
+ * Acquire an instance with ref tracking (ownership semantics).
60
+ * Creates a new instance if one doesn't exist, or returns existing and adds a ref.
61
+ * You must call `release()` with the same refId when done.
61
62
  * @param Type - The StateContainer class constructor
62
63
  * @param instanceKey - Instance key (defaults to 'default')
63
64
  * @param options - Acquisition options
64
65
  * @param options.canCreate - Whether to create new instance if not found (default: true)
65
- * @param options.countRef - Whether to increment ref count (default: true)
66
+ * @param options.countRef - Whether to add a reference (default: true)
67
+ * @param options.refId - Named reference ID for debugging; auto-generated if omitted
66
68
  * @returns The state container instance
67
69
  */
68
70
  acquire<T extends StateContainerConstructor = StateContainerConstructor>(Type: T, instanceKey?: string, options?: {
69
71
  canCreate?: boolean;
70
72
  countRef?: boolean;
73
+ refId?: string;
71
74
  }): InstanceType<T>;
72
75
  /**
73
- * Borrow an existing instance without incrementing ref count (borrowing semantics).
76
+ * Borrow an existing instance without adding a ref (borrowing semantics).
74
77
  * Tracks cross-bloc dependency for reactive updates.
75
78
  * @param Type - The StateContainer class constructor
76
79
  * @param instanceKey - Instance key (defaults to 'default')
@@ -94,11 +97,11 @@ export declare class StateContainerRegistry {
94
97
  };
95
98
  /**
96
99
  * Ensure an instance exists without taking ownership (for bloc-to-bloc communication).
97
- * Gets existing instance OR creates it if it doesn't exist, without incrementing ref count.
100
+ * Gets existing instance OR creates it if it doesn't exist, without adding a ref.
98
101
  * Tracks cross-bloc dependency for reactive updates.
99
102
  *
100
103
  * Use this in bloc-to-bloc communication when you need to ensure an instance exists
101
- * but don't want to claim ownership (no ref count increment).
104
+ * but don't want to claim ownership (no ref added).
102
105
  * @param Type - The StateContainer class constructor
103
106
  * @param instanceKey - Instance key (defaults to 'default')
104
107
  * @returns The state container instance
@@ -106,12 +109,14 @@ export declare class StateContainerRegistry {
106
109
  ensure<T extends StateContainerConstructor = StateContainerConstructor>(Type: T, instanceKey?: string): InstanceType<T>;
107
110
  /**
108
111
  * Release a reference to an instance.
109
- * Decrements ref count and disposes when it reaches 0 (unless keepAlive).
112
+ * Removes the ref and disposes when refs is empty (unless keepAlive).
113
+ * Releasing an already-removed refId is a no-op (idempotent).
110
114
  * @param Type - The StateContainer class constructor
111
115
  * @param instanceKey - Instance key (defaults to 'default')
112
- * @param forceDispose - Force immediate disposal regardless of ref count
116
+ * @param forceDispose - Force immediate disposal regardless of refs
117
+ * @param refId - The specific ref to remove; removes one arbitrary ref if omitted
113
118
  */
114
- release<T extends StateContainerConstructor>(Type: T, instanceKey?: string, forceDispose?: boolean): void;
119
+ release<T extends StateContainerConstructor>(Type: T, instanceKey?: string, forceDispose?: boolean, refId?: string): void;
115
120
  /**
116
121
  * Get all instances of a specific type.
117
122
  * @param Type - The StateContainer class constructor
@@ -131,12 +136,19 @@ export declare class StateContainerRegistry {
131
136
  */
132
137
  clear<T extends StateContainerConstructor>(Type: T): void;
133
138
  /**
134
- * Get reference count for an instance.
139
+ * Get reference count for an instance (number of active refs).
135
140
  * @param Type - The StateContainer class constructor
136
141
  * @param instanceKey - Instance key (defaults to 'default')
137
142
  * @returns Current ref count (0 if instance doesn't exist)
138
143
  */
139
144
  getRefCount<T extends StateContainerConstructor>(Type: T, instanceKey?: string): number;
145
+ /**
146
+ * Get all active reference IDs for an instance.
147
+ * @param Type - The StateContainer class constructor
148
+ * @param instanceKey - Instance key (defaults to 'default')
149
+ * @returns Array of ref ID strings (empty if instance doesn't exist)
150
+ */
151
+ getRefIds<T extends StateContainerConstructor>(Type: T, instanceKey?: string): string[];
140
152
  /**
141
153
  * Check if an instance exists.
142
154
  * @param Type - The StateContainer class constructor
package/dist/debug.cjs CHANGED
@@ -1,10 +1,11 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_StateContainerRegistry = require("./StateContainerRegistry-BsMIpllP.cjs");
3
- const require_config = require("./config-DLzmy2rZ.cjs");
4
- const require_management = require("./management-xoZ7w3bI.cjs");
2
+ const require_StateContainerRegistry = require("./StateContainerRegistry-mseeTqSA.cjs");
3
+ const require_config = require("./config-DMNZ2YLV.cjs");
4
+ const require_management = require("./management-Dag9u4t6.cjs");
5
5
  exports.forEach = require_management.forEach;
6
6
  exports.getAll = require_management.getAll;
7
7
  exports.getRefCount = require_management.getRefCount;
8
+ exports.getRefIds = require_management.getRefIds;
8
9
  exports.getRegistry = require_config.getRegistry;
9
10
  exports.getStats = require_config.getStats;
10
11
  exports.globalRegistry = require_StateContainerRegistry.globalRegistry;
package/dist/debug.d.cts CHANGED
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * @example
11
11
  * ```typescript
12
- * import { getStats, globalRegistry, hasInstance } from '@blac/core/debug';
12
+ * import { getStats, globalRegistry, hasInstance, getRefIds } from '@blac/core/debug';
13
13
  *
14
14
  * // Get registry statistics
15
15
  * const stats = getStats();
@@ -20,15 +20,14 @@
20
20
  * console.log('UserBloc is registered');
21
21
  * }
22
22
  *
23
- * // Iterate over all instances of a type
24
- * forEach(UserBloc, (instance) => {
25
- * console.log(instance.state);
26
- * });
23
+ * // See who holds a reference
24
+ * const refs = getRefIds(UserBloc);
25
+ * console.log('Ref holders:', refs);
27
26
  * ```
28
27
  *
29
28
  * @packageDocumentation
30
29
  */
31
- export { hasInstance, getRefCount, getAll, forEach } from './registry/queries';
30
+ export { hasInstance, getRefCount, getRefIds, getAll, forEach, } from './registry/queries';
32
31
  export { register } from './registry/management';
33
32
  export { getRegistry, setRegistry, getStats } from './registry/config';
34
33
  export { globalRegistry } from './core/StateContainerRegistry';
package/dist/debug.d.ts CHANGED
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * @example
11
11
  * ```typescript
12
- * import { getStats, globalRegistry, hasInstance } from '@blac/core/debug';
12
+ * import { getStats, globalRegistry, hasInstance, getRefIds } from '@blac/core/debug';
13
13
  *
14
14
  * // Get registry statistics
15
15
  * const stats = getStats();
@@ -20,15 +20,14 @@
20
20
  * console.log('UserBloc is registered');
21
21
  * }
22
22
  *
23
- * // Iterate over all instances of a type
24
- * forEach(UserBloc, (instance) => {
25
- * console.log(instance.state);
26
- * });
23
+ * // See who holds a reference
24
+ * const refs = getRefIds(UserBloc);
25
+ * console.log('Ref holders:', refs);
27
26
  * ```
28
27
  *
29
28
  * @packageDocumentation
30
29
  */
31
- export { hasInstance, getRefCount, getAll, forEach } from './registry/queries';
30
+ export { hasInstance, getRefCount, getRefIds, getAll, forEach, } from './registry/queries';
32
31
  export { register } from './registry/management';
33
32
  export { getRegistry, setRegistry, getStats } from './registry/config';
34
33
  export { globalRegistry } from './core/StateContainerRegistry';
package/dist/debug.js CHANGED
@@ -1,4 +1,4 @@
1
- import { r as globalRegistry } from "./StateContainerRegistry-DOkDGng-.js";
2
- import { n as getStats, r as setRegistry, t as getRegistry } from "./config-XQua95Xz.js";
3
- import { a as getAll, i as forEach, o as getRefCount, r as register, s as hasInstance } from "./management-C-wBdpho.js";
4
- export { forEach, getAll, getRefCount, getRegistry, getStats, globalRegistry, hasInstance, register, setRegistry };
1
+ import { r as globalRegistry } from "./StateContainerRegistry-DOuGI-l5.js";
2
+ import { n as getStats, r as setRegistry, t as getRegistry } from "./config-CCUhIYIF.js";
3
+ import { a as getAll, c as hasInstance, i as forEach, o as getRefCount, r as register, s as getRefIds } from "./management-Cin-JvYe.js";
4
+ export { forEach, getAll, getRefCount, getRefIds, getRegistry, getStats, globalRegistry, hasInstance, register, setRegistry };
@@ -0,0 +1,9 @@
1
+ import { t as getRegistry } from "./config-CR_Bz7RD.js";
2
+ //#region src/registry/ensure.ts
3
+ function ensure(BlocClass, instanceKey) {
4
+ return getRegistry().ensure(BlocClass, instanceKey);
5
+ }
6
+ //#endregion
7
+ export { ensure as t };
8
+
9
+ //# sourceMappingURL=ensure-9VEq5H0L.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-9VEq5H0L.js","names":[],"sources":["../src/registry/ensure.ts"],"sourcesContent":["import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function ensure<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n): InstanceType<T> {\n return getRegistry().ensure(BlocClass, instanceKey);\n}\n"],"mappings":";;AAGA,SAAgB,OACd,WACA,aACiB;AACjB,QAAO,aAAa,CAAC,OAAO,WAAW,YAAY"}
@@ -0,0 +1,14 @@
1
+ const require_config = require("./config-CTOa-yPN.cjs");
2
+ //#region src/registry/ensure.ts
3
+ function ensure(BlocClass, instanceKey) {
4
+ return require_config.getRegistry().ensure(BlocClass, instanceKey);
5
+ }
6
+ //#endregion
7
+ Object.defineProperty(exports, "ensure", {
8
+ enumerable: true,
9
+ get: function() {
10
+ return ensure;
11
+ }
12
+ });
13
+
14
+ //# sourceMappingURL=ensure-BNDfTzqg.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-BNDfTzqg.cjs","names":["getRegistry"],"sources":["../src/registry/ensure.ts"],"sourcesContent":["import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function ensure<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n): InstanceType<T> {\n return getRegistry().ensure(BlocClass, instanceKey);\n}\n"],"mappings":";;AAGA,SAAgB,OACd,WACA,aACiB;AACjB,QAAOA,eAAAA,aAAa,CAAC,OAAO,WAAW,YAAY"}
@@ -0,0 +1,289 @@
1
+ import { a as BLAC_DEFAULTS } from "./StateContainerRegistry-Yph6UCA_.js";
2
+ import { t as getRegistry } from "./config-BKoaAlmb.js";
3
+ //#region src/utils/idGenerator.ts
4
+ /**
5
+ * Generate simple ID with timestamp and random (no counter tracking)
6
+ *
7
+ * Format: `${prefix}:${timestamp}_${random}`
8
+ *
9
+ * @param prefix - Prefix for the ID
10
+ * @returns Branded ID string
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const id = generateSimpleId('CounterBloc');
15
+ * // Returns: "CounterBloc:1698765432100_a3k9d7f2q"
16
+ * ```
17
+ */
18
+ function generateSimpleId(prefix, affix) {
19
+ if (affix) return `${prefix}:${affix}`;
20
+ return `${prefix}:${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
21
+ }
22
+ //#endregion
23
+ //#region src/core/symbols.ts
24
+ const EMIT = Symbol("blac.emit");
25
+ const UPDATE = Symbol("blac.update");
26
+ //#endregion
27
+ //#region src/core/StateContainer.ts
28
+ const EMPTY_DEPS = /* @__PURE__ */ new Map();
29
+ var StateContainer = class StateContainer {
30
+ static {
31
+ this.__excludeFromDevTools = false;
32
+ }
33
+ static {
34
+ this.enableStackTrace = true;
35
+ }
36
+ get dependencies() {
37
+ return this._dependencies ?? EMPTY_DEPS;
38
+ }
39
+ depend(Type, instanceKey) {
40
+ if (!this._dependencies) this._dependencies = /* @__PURE__ */ new Map();
41
+ this._dependencies.set(Type, instanceKey ?? BLAC_DEFAULTS.DEFAULT_INSTANCE_KEY);
42
+ return () => getRegistry().ensure(Type, instanceKey);
43
+ }
44
+ constructor(initialState) {
45
+ this._listeners = /* @__PURE__ */ new Set();
46
+ this._disposed = false;
47
+ this._hydrationStatus = "idle";
48
+ this._changedWhileHydrating = false;
49
+ this._hydrationPromise = null;
50
+ this._hydrationPromiseSettled = false;
51
+ this._config = {};
52
+ this._systemEventHandlers = /* @__PURE__ */ new Map();
53
+ this._dependencies = null;
54
+ this.name = this.constructor.name;
55
+ this.debug = false;
56
+ this.instanceId = generateSimpleId(this.constructor.name, "main");
57
+ this.createdAt = Date.now();
58
+ this.lastUpdateTimestamp = Date.now();
59
+ this.createdFrom = "";
60
+ this.onSystemEvent = (event, handler) => {
61
+ let handlers = this._systemEventHandlers.get(event);
62
+ if (!handlers) {
63
+ handlers = /* @__PURE__ */ new Set();
64
+ this._systemEventHandlers.set(event, handlers);
65
+ }
66
+ handlers.add(handler);
67
+ return () => {
68
+ handlers?.delete(handler);
69
+ };
70
+ };
71
+ this._state = initialState;
72
+ }
73
+ initConfig(config) {
74
+ this._config = { ...config };
75
+ this.name = this._config.name || this.constructor.name;
76
+ this.debug = this._config.debug ?? false;
77
+ this.instanceId = generateSimpleId(this.constructor.name, this._config.instanceId);
78
+ this.createdFrom = this.captureStackTrace();
79
+ getRegistry().emit("created", this);
80
+ }
81
+ get state() {
82
+ return this._state;
83
+ }
84
+ get isDisposed() {
85
+ return this._disposed;
86
+ }
87
+ get hydrationStatus() {
88
+ return this._hydrationStatus;
89
+ }
90
+ get hydrationError() {
91
+ return this._hydrationError;
92
+ }
93
+ get isHydrated() {
94
+ return this._hydrationStatus === "hydrated";
95
+ }
96
+ get changedWhileHydrating() {
97
+ return this._changedWhileHydrating;
98
+ }
99
+ subscribe(listener) {
100
+ if (this._disposed) throw new Error(`Cannot subscribe to disposed container ${this.name}`);
101
+ this._listeners.add(listener);
102
+ return () => this._listeners.delete(listener);
103
+ }
104
+ dispose() {
105
+ if (this._disposed) return;
106
+ if (this.debug) console.log(`[${this.name}] Disposing...`);
107
+ this._disposed = true;
108
+ if (this._hydrationStatus === "hydrating") this.failHydration(/* @__PURE__ */ new Error(`Hydration cancelled because ${this.name} was disposed`));
109
+ this.emitSystemEvent("dispose", void 0);
110
+ this._listeners.clear();
111
+ this._systemEventHandlers.clear();
112
+ getRegistry().emit("disposed", this);
113
+ if (this.debug) console.log(`[${this.name}] Disposed successfully`);
114
+ }
115
+ [EMIT](newState) {
116
+ this.applyState(newState, "default");
117
+ }
118
+ [UPDATE](updater) {
119
+ if (this._disposed) throw new Error(`Cannot update state from disposed container ${this.name}`);
120
+ this[EMIT](updater(this._state));
121
+ }
122
+ beginHydration() {
123
+ if (this._disposed) throw new Error(`Cannot begin hydration for disposed container ${this.name}`);
124
+ this._changedWhileHydrating = false;
125
+ this._hydrationError = void 0;
126
+ this._hydrationPromise = null;
127
+ this._resolveHydrationPromise = void 0;
128
+ this._rejectHydrationPromise = void 0;
129
+ this._hydrationPromiseSettled = false;
130
+ this.ensureHydrationPromise();
131
+ this.setHydrationStatus("hydrating");
132
+ }
133
+ applyHydratedState(newState) {
134
+ if (this._disposed) return false;
135
+ if (this._hydrationStatus !== "hydrating" || this._changedWhileHydrating) return false;
136
+ this.applyState(newState, "hydration");
137
+ return true;
138
+ }
139
+ finishHydration() {
140
+ if (this._hydrationStatus !== "hydrating") {
141
+ if (this._hydrationStatus === "hydrated") return;
142
+ if (this._hydrationStatus === "error") this.ensureHydrationPromise();
143
+ }
144
+ this.setHydrationStatus("hydrated");
145
+ this.resolveHydration();
146
+ }
147
+ failHydration(error) {
148
+ const err = error instanceof Error ? error : /* @__PURE__ */ new Error(`Hydration failed: ${String(error)}`);
149
+ this._hydrationError = err;
150
+ this.setHydrationStatus("error", err);
151
+ this.rejectHydration(err);
152
+ }
153
+ waitForHydration() {
154
+ if (this._hydrationStatus === "idle" || this._hydrationStatus === "hydrated") return Promise.resolve();
155
+ if (this._hydrationStatus === "error") return Promise.reject(this._hydrationError ?? /* @__PURE__ */ new Error(`Hydration failed for container ${this.name}`));
156
+ return this.ensureHydrationPromise();
157
+ }
158
+ captureStackTrace() {
159
+ if (!StateContainer.enableStackTrace || typeof process !== "undefined" && process.env?.NODE_ENV === "production") return "";
160
+ try {
161
+ const relevantLines = ((/* @__PURE__ */ new Error()).stack || "").split("\n").slice(1);
162
+ const formattedLines = [];
163
+ for (const line of relevantLines) {
164
+ if (!line.trim()) continue;
165
+ if (line.includes("StateContainer.emit") || line.includes("StateContainer.update") || line.includes("StateContainer.captureStackTrace") || line.includes("[blac.emit]") || line.includes("[blac.update]") || line.includes("Cubit.patch") || line.includes("/blac-core/dist/") || line.includes("@blac/core/") || line.includes("/blac-react/dist/") || line.includes("@blac/react/")) continue;
166
+ if (line.includes("node_modules") || line.includes("react-dom") || line.includes("react_jsx") || line.includes(".vite/deps") || line.includes("executeDispatch") || line.includes("runWithFiber") || line.includes("invokeGuarded") || line.includes("callCallback") || line.includes("processDispatchQueue") || line.includes("dispatchEvent") || line.includes("batchedUpdates")) continue;
167
+ const formatted = this.formatStackLine(line);
168
+ if (formatted) formattedLines.push(formatted);
169
+ }
170
+ return formattedLines.join("\n");
171
+ } catch {
172
+ return "";
173
+ }
174
+ }
175
+ formatStackLine(line) {
176
+ const match = line.match(/at\s+(.+?)\s+\((.+?):(\d+):(\d+)\)/);
177
+ if (!match) {
178
+ const simpleMatch = line.match(/at\s+(.+?):(\d+):(\d+)/);
179
+ if (simpleMatch) {
180
+ const [, url, lineNum, col] = simpleMatch;
181
+ return ` at ${url}:${lineNum}:${col}`;
182
+ }
183
+ return null;
184
+ }
185
+ const [, functionName, url, lineNum, col] = match;
186
+ return ` at ${functionName} (${url}:${lineNum}:${col})`;
187
+ }
188
+ applyState(newState, source) {
189
+ if (this._disposed) throw new Error(`Cannot emit state from disposed container ${this.name}`);
190
+ if (this._state === newState) return;
191
+ if (this._hydrationStatus === "hydrating" && source !== "hydration") this._changedWhileHydrating = true;
192
+ const previousState = this._state;
193
+ this._state = newState;
194
+ this.emitSystemEvent("stateChanged", {
195
+ state: newState,
196
+ previousState
197
+ });
198
+ const listeners = Array.from(this._listeners);
199
+ for (const listener of listeners) try {
200
+ listener(newState);
201
+ } catch (error) {
202
+ console.error(`[${this.name}] Error in listener:`, error);
203
+ }
204
+ const stackTrace = this.captureStackTrace();
205
+ getRegistry().emit("stateChanged", this, previousState, newState, stackTrace);
206
+ this.lastUpdateTimestamp = Date.now();
207
+ }
208
+ setHydrationStatus(status, error) {
209
+ const previousStatus = this._hydrationStatus;
210
+ this._hydrationStatus = status;
211
+ this._hydrationError = error;
212
+ this.emitSystemEvent("hydrationChanged", {
213
+ status,
214
+ previousStatus,
215
+ error,
216
+ changedWhileHydrating: this._changedWhileHydrating
217
+ });
218
+ }
219
+ ensureHydrationPromise() {
220
+ if (!this._hydrationPromise || this._hydrationPromiseSettled) {
221
+ this._hydrationPromiseSettled = false;
222
+ this._hydrationPromise = new Promise((resolve, reject) => {
223
+ this._resolveHydrationPromise = () => {
224
+ if (this._hydrationPromiseSettled) return;
225
+ this._hydrationPromiseSettled = true;
226
+ resolve();
227
+ };
228
+ this._rejectHydrationPromise = (error) => {
229
+ if (this._hydrationPromiseSettled) return;
230
+ this._hydrationPromiseSettled = true;
231
+ reject(error);
232
+ };
233
+ });
234
+ this._hydrationPromise.catch(() => {});
235
+ }
236
+ return this._hydrationPromise;
237
+ }
238
+ resolveHydration() {
239
+ this._resolveHydrationPromise?.();
240
+ }
241
+ rejectHydration(error) {
242
+ this.ensureHydrationPromise();
243
+ this._rejectHydrationPromise?.(error);
244
+ }
245
+ emitSystemEvent(event, payload) {
246
+ const handlers = this._systemEventHandlers.get(event);
247
+ if (!handlers) return;
248
+ for (const handler of handlers) try {
249
+ handler(payload);
250
+ } catch (error) {
251
+ console.error(`[${this.name}] Error in system event handler:`, error);
252
+ }
253
+ }
254
+ };
255
+ //#endregion
256
+ //#region src/core/Cubit.ts
257
+ var Cubit = class extends StateContainer {
258
+ constructor(initialState) {
259
+ super(initialState);
260
+ this.patch = ((partial) => {
261
+ if (typeof this.state !== "object" || this.state === null) throw new Error("patch() is only available for object state types");
262
+ const current = this.state;
263
+ let hasChanges = false;
264
+ for (const key in partial) if (!Object.is(current[key], partial[key])) {
265
+ hasChanges = true;
266
+ break;
267
+ }
268
+ if (hasChanges) this.update((c) => ({
269
+ ...c,
270
+ ...partial
271
+ }));
272
+ });
273
+ }
274
+ emit(newState) {
275
+ this[EMIT](newState);
276
+ }
277
+ update(updater) {
278
+ this[UPDATE](updater);
279
+ }
280
+ };
281
+ //#endregion
282
+ //#region src/registry/ensure.ts
283
+ function ensure(BlocClass, instanceKey) {
284
+ return getRegistry().ensure(BlocClass, instanceKey);
285
+ }
286
+ //#endregion
287
+ export { UPDATE as a, EMIT as i, Cubit as n, StateContainer as r, ensure as t };
288
+
289
+ //# sourceMappingURL=ensure-BVCnjU7r.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-BVCnjU7r.js","names":[],"sources":["../src/utils/idGenerator.ts","../src/core/symbols.ts","../src/core/StateContainer.ts","../src/core/Cubit.ts","../src/registry/ensure.ts"],"sourcesContent":["/**\n * Centralized ID Generation\n *\n * Provides consistent, collision-resistant ID generation for all BlaC subsystems.\n * Uses timestamp + counter + random suffix for uniqueness.\n */\n\n// Global counter map for ID generation\nconst globalCounters = new Map<string, number>();\n\n/**\n * Creates an ID generator with isolated counter state\n *\n * @param prefix - Prefix for generated IDs\n * @returns Object with next(), nextSimple(), and reset() methods\n *\n * @example\n * ```ts\n * const generator = createIdGenerator('sub');\n * const id1 = generator.next(); // \"sub:1698765432100_1_a3k9d7f2q\"\n * const id2 = generator.next(); // \"sub:1698765432101_2_b4n8e9g3r\"\n * ```\n */\nexport function createIdGenerator(prefix: string) {\n let counter = 0;\n return {\n next: () =>\n `${prefix}:${Date.now()}_${++counter}_${Math.random().toString(36).substring(2, 11)}`,\n nextSimple: () => `${prefix}:${++counter}`,\n reset: () => {\n counter = 0;\n },\n };\n}\n\n/**\n * Generate ID with timestamp, counter, and random suffix (tree-shakeable)\n *\n * Format: `${prefix}:${timestamp}_${counter}_${random}`\n *\n * @param prefix - Prefix for the ID (e.g., 'sub', 'consumer', 'stage')\n * @returns Branded ID string\n *\n * @example\n * const id = generateId('sub');\n * // Returns: \"sub:1698765432100_1_a3k9d7f2q\"\n */\nexport function generateId(prefix: string): string {\n const counter = (globalCounters.get(prefix) ?? 0) + 1;\n globalCounters.set(prefix, counter);\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 11);\n return `${prefix}:${timestamp}_${counter}_${random}`;\n}\n\n/**\n * Generate simple ID with timestamp and random (no counter tracking)\n *\n * Format: `${prefix}:${timestamp}_${random}`\n *\n * @param prefix - Prefix for the ID\n * @returns Branded ID string\n *\n * @example\n * ```ts\n * const id = generateSimpleId('CounterBloc');\n * // Returns: \"CounterBloc:1698765432100_a3k9d7f2q\"\n * ```\n */\nexport function generateSimpleId(prefix: string, affix?: string): string {\n if (affix) {\n return `${prefix}:${affix}`;\n }\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 11);\n return `${prefix}:${timestamp}_${random}`;\n}\n\n/**\n * Reset all counters for testing purposes\n * @internal\n */\nexport function __resetIdCounters(): void {\n globalCounters.clear();\n}\n","export const EMIT = Symbol('blac.emit');\nexport const UPDATE = Symbol('blac.update');\n","import { generateSimpleId } from '../utils/idGenerator';\nimport { BLAC_DEFAULTS } from '../constants';\nimport { getRegistry } from '../registry/config';\nimport type { StateContainerConstructor } from '../types/utilities';\nimport { EMIT, UPDATE } from './symbols';\n\nexport interface StateContainerConfig {\n name?: string;\n debug?: boolean;\n instanceId?: string;\n}\n\nexport type HydrationStatus = 'idle' | 'hydrating' | 'hydrated' | 'error';\n\ntype StateListener<S> = (state: S) => void;\n\nexport type SystemEvent = 'stateChanged' | 'dispose' | 'hydrationChanged';\n\nexport interface SystemEventPayloads<S> {\n stateChanged: { state: S; previousState: S };\n dispose: void;\n hydrationChanged: {\n status: HydrationStatus;\n previousStatus: HydrationStatus;\n error?: Error;\n changedWhileHydrating: boolean;\n };\n}\n\ntype SystemEventHandler<S, E extends SystemEvent> = (\n payload: SystemEventPayloads<S>[E],\n) => void;\n\nconst EMPTY_DEPS: ReadonlyMap<any, any> = new Map();\n\nexport abstract class StateContainer<S extends object = any> {\n static __excludeFromDevTools = false;\n static enableStackTrace = true;\n\n private _state: S;\n private readonly _listeners = new Set<StateListener<S>>();\n private _disposed = false;\n private _hydrationStatus: HydrationStatus = 'idle';\n private _hydrationError?: Error;\n private _changedWhileHydrating = false;\n private _hydrationPromise: Promise<void> | null = null;\n private _resolveHydrationPromise?: () => void;\n private _rejectHydrationPromise?: (error: Error) => void;\n private _hydrationPromiseSettled = false;\n private _config: StateContainerConfig = {};\n private readonly _systemEventHandlers = new Map<\n SystemEvent,\n Set<SystemEventHandler<S, any>>\n >();\n private _dependencies: Map<StateContainerConstructor, string> | null = null;\n\n name: string = this.constructor.name;\n debug: boolean = false;\n instanceId: string = generateSimpleId(this.constructor.name, 'main');\n createdAt: number = Date.now();\n lastUpdateTimestamp: number = Date.now();\n createdFrom: string = '';\n\n get dependencies(): ReadonlyMap<StateContainerConstructor, string> {\n return this._dependencies ?? EMPTY_DEPS;\n }\n\n protected depend<T extends StateContainerConstructor>(\n Type: T,\n instanceKey?: string,\n ): () => InstanceType<T> {\n if (!this._dependencies) {\n this._dependencies = new Map();\n }\n this._dependencies.set(\n Type,\n instanceKey ?? BLAC_DEFAULTS.DEFAULT_INSTANCE_KEY,\n );\n return () => getRegistry().ensure(Type, instanceKey);\n }\n\n constructor(initialState: S) {\n this._state = initialState;\n }\n\n initConfig(config: StateContainerConfig): void {\n this._config = { ...config };\n this.name = this._config.name || this.constructor.name;\n this.debug = this._config.debug ?? false;\n this.instanceId = generateSimpleId(\n this.constructor.name,\n this._config.instanceId,\n );\n this.createdFrom = this.captureStackTrace();\n getRegistry().emit('created', this);\n }\n\n get state(): Readonly<S> {\n return this._state;\n }\n\n get isDisposed(): boolean {\n return this._disposed;\n }\n\n get hydrationStatus(): HydrationStatus {\n return this._hydrationStatus;\n }\n\n get hydrationError(): Error | undefined {\n return this._hydrationError;\n }\n\n get isHydrated(): boolean {\n return this._hydrationStatus === 'hydrated';\n }\n\n get changedWhileHydrating(): boolean {\n return this._changedWhileHydrating;\n }\n\n subscribe(listener: StateListener<S>): () => void {\n if (this._disposed) {\n throw new Error(`Cannot subscribe to disposed container ${this.name}`);\n }\n this._listeners.add(listener);\n return () => this._listeners.delete(listener);\n }\n\n dispose(): void {\n if (this._disposed) return;\n\n if (this.debug) {\n console.log(`[${this.name}] Disposing...`);\n }\n\n this._disposed = true;\n\n if (this._hydrationStatus === 'hydrating') {\n this.failHydration(\n new Error(`Hydration cancelled because ${this.name} was disposed`),\n );\n }\n\n this.emitSystemEvent('dispose', undefined as void);\n\n this._listeners.clear();\n this._systemEventHandlers.clear();\n\n getRegistry().emit('disposed', this);\n\n if (this.debug) {\n console.log(`[${this.name}] Disposed successfully`);\n }\n }\n\n protected [EMIT](newState: S): void {\n this.applyState(newState, 'default');\n }\n\n protected [UPDATE](updater: (current: S) => S): void {\n if (this._disposed) {\n throw new Error(\n `Cannot update state from disposed container ${this.name}`,\n );\n }\n this[EMIT](updater(this._state));\n }\n\n beginHydration(): void {\n if (this._disposed) {\n throw new Error(\n `Cannot begin hydration for disposed container ${this.name}`,\n );\n }\n\n this._changedWhileHydrating = false;\n this._hydrationError = undefined;\n this._hydrationPromise = null;\n this._resolveHydrationPromise = undefined;\n this._rejectHydrationPromise = undefined;\n this._hydrationPromiseSettled = false;\n void this.ensureHydrationPromise();\n this.setHydrationStatus('hydrating');\n }\n\n applyHydratedState(newState: S): boolean {\n if (this._disposed) {\n return false;\n }\n\n if (this._hydrationStatus !== 'hydrating' || this._changedWhileHydrating) {\n return false;\n }\n\n this.applyState(newState, 'hydration');\n return true;\n }\n\n finishHydration(): void {\n if (this._hydrationStatus !== 'hydrating') {\n if (this._hydrationStatus === 'hydrated') {\n return;\n }\n if (this._hydrationStatus === 'error') {\n void this.ensureHydrationPromise();\n }\n }\n\n this.setHydrationStatus('hydrated');\n this.resolveHydration();\n }\n\n failHydration(error: Error): void {\n const err =\n error instanceof Error\n ? error\n : new Error(`Hydration failed: ${String(error)}`);\n\n this._hydrationError = err;\n this.setHydrationStatus('error', err);\n this.rejectHydration(err);\n }\n\n waitForHydration(): Promise<void> {\n if (\n this._hydrationStatus === 'idle' ||\n this._hydrationStatus === 'hydrated'\n ) {\n return Promise.resolve();\n }\n\n if (this._hydrationStatus === 'error') {\n return Promise.reject(\n this._hydrationError ??\n new Error(`Hydration failed for container ${this.name}`),\n );\n }\n\n return this.ensureHydrationPromise();\n }\n\n private captureStackTrace(): string {\n if (\n !StateContainer.enableStackTrace ||\n (typeof process !== 'undefined' && process.env?.NODE_ENV === 'production')\n ) {\n return '';\n }\n\n try {\n const error = new Error();\n const stack = error.stack || '';\n const lines = stack.split('\\n');\n const relevantLines = lines.slice(1);\n const formattedLines: string[] = [];\n\n for (const line of relevantLines) {\n if (!line.trim()) continue;\n\n if (\n line.includes('StateContainer.emit') ||\n line.includes('StateContainer.update') ||\n line.includes('StateContainer.captureStackTrace') ||\n line.includes('[blac.emit]') ||\n line.includes('[blac.update]') ||\n line.includes('Cubit.patch') ||\n line.includes('/blac-core/dist/') ||\n line.includes('@blac/core/') ||\n line.includes('/blac-react/dist/') ||\n line.includes('@blac/react/')\n ) {\n continue;\n }\n\n if (\n line.includes('node_modules') ||\n line.includes('react-dom') ||\n line.includes('react_jsx') ||\n line.includes('.vite/deps') ||\n line.includes('executeDispatch') ||\n line.includes('runWithFiber') ||\n line.includes('invokeGuarded') ||\n line.includes('callCallback') ||\n line.includes('processDispatchQueue') ||\n line.includes('dispatchEvent') ||\n line.includes('batchedUpdates')\n ) {\n continue;\n }\n\n const formatted = this.formatStackLine(line);\n if (formatted) {\n formattedLines.push(formatted);\n }\n }\n\n return formattedLines.join('\\n');\n } catch {\n return '';\n }\n }\n\n private formatStackLine(line: string): string | null {\n const match = line.match(/at\\s+(.+?)\\s+\\((.+?):(\\d+):(\\d+)\\)/);\n if (!match) {\n const simpleMatch = line.match(/at\\s+(.+?):(\\d+):(\\d+)/);\n if (simpleMatch) {\n const [, url, lineNum, col] = simpleMatch;\n return ` at ${url}:${lineNum}:${col}`;\n }\n return null;\n }\n\n const [, functionName, url, lineNum, col] = match;\n return ` at ${functionName} (${url}:${lineNum}:${col})`;\n }\n\n private applyState(newState: S, source: 'default' | 'hydration'): void {\n if (this._disposed) {\n throw new Error(`Cannot emit state from disposed container ${this.name}`);\n }\n\n if (this._state === newState) return;\n\n if (this._hydrationStatus === 'hydrating' && source !== 'hydration') {\n this._changedWhileHydrating = true;\n }\n\n const previousState = this._state;\n this._state = newState;\n\n this.emitSystemEvent('stateChanged', {\n state: newState,\n previousState,\n });\n\n const listeners = Array.from(this._listeners);\n for (const listener of listeners) {\n try {\n listener(newState);\n } catch (error) {\n console.error(`[${this.name}] Error in listener:`, error);\n }\n }\n\n const stackTrace = this.captureStackTrace();\n\n getRegistry().emit(\n 'stateChanged',\n this,\n previousState,\n newState,\n stackTrace,\n );\n this.lastUpdateTimestamp = Date.now();\n }\n\n private setHydrationStatus(status: HydrationStatus, error?: Error): void {\n const previousStatus = this._hydrationStatus;\n this._hydrationStatus = status;\n this._hydrationError = error;\n\n this.emitSystemEvent('hydrationChanged', {\n status,\n previousStatus,\n error,\n changedWhileHydrating: this._changedWhileHydrating,\n });\n }\n\n private ensureHydrationPromise(): Promise<void> {\n if (!this._hydrationPromise || this._hydrationPromiseSettled) {\n this._hydrationPromiseSettled = false;\n this._hydrationPromise = new Promise<void>((resolve, reject) => {\n this._resolveHydrationPromise = () => {\n if (this._hydrationPromiseSettled) return;\n this._hydrationPromiseSettled = true;\n resolve();\n };\n this._rejectHydrationPromise = (error: Error) => {\n if (this._hydrationPromiseSettled) return;\n this._hydrationPromiseSettled = true;\n reject(error);\n };\n });\n this._hydrationPromise.catch(() => {});\n }\n\n return this._hydrationPromise;\n }\n\n private resolveHydration(): void {\n this._resolveHydrationPromise?.();\n }\n\n private rejectHydration(error: Error): void {\n void this.ensureHydrationPromise();\n this._rejectHydrationPromise?.(error);\n }\n\n protected onSystemEvent = <E extends SystemEvent>(\n event: E,\n handler: SystemEventHandler<S, E>,\n ): (() => void) => {\n let handlers = this._systemEventHandlers.get(event);\n if (!handlers) {\n handlers = new Set();\n this._systemEventHandlers.set(event, handlers);\n }\n handlers.add(handler as SystemEventHandler<S, any>);\n\n return () => {\n handlers?.delete(handler as SystemEventHandler<S, any>);\n };\n };\n\n private emitSystemEvent<E extends SystemEvent>(\n event: E,\n payload: SystemEventPayloads<S>[E],\n ): void {\n const handlers = this._systemEventHandlers.get(event);\n if (!handlers) return;\n\n for (const handler of handlers) {\n try {\n handler(payload);\n } catch (error) {\n console.error(`[${this.name}] Error in system event handler:`, error);\n }\n }\n }\n}\n","import { StateContainer } from './StateContainer';\nimport { EMIT, UPDATE } from './symbols';\n\nexport abstract class Cubit<S extends object = any> extends StateContainer<S> {\n constructor(initialState: S) {\n super(initialState);\n }\n\n public emit(newState: S): void {\n this[EMIT](newState);\n }\n\n public update(updater: (current: S) => S): void {\n this[UPDATE](updater);\n }\n\n public patch = ((partial: S extends object ? Partial<S> : never): void => {\n if (typeof this.state !== 'object' || this.state === null) {\n throw new Error('patch() is only available for object state types');\n }\n const current = this.state;\n let hasChanges = false;\n for (const key in partial) {\n if (!Object.is((current as any)[key], (partial as any)[key])) {\n hasChanges = true;\n break;\n }\n }\n if (hasChanges) {\n this.update((c) => ({ ...c, ...partial }) as S);\n }\n }) as S extends object ? (partial: Partial<S>) => void : never;\n}\n","import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function ensure<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n): InstanceType<T> {\n return getRegistry().ensure(BlocClass, instanceKey);\n}\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ const require_config = require("./config-D3jisfdj.cjs");
2
+ //#region src/registry/ensure.ts
3
+ function ensure(BlocClass, instanceKey) {
4
+ return require_config.getRegistry().ensure(BlocClass, instanceKey);
5
+ }
6
+ //#endregion
7
+ Object.defineProperty(exports, "ensure", {
8
+ enumerable: true,
9
+ get: function() {
10
+ return ensure;
11
+ }
12
+ });
13
+
14
+ //# sourceMappingURL=ensure-BbzGXjep.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-BbzGXjep.cjs","names":["getRegistry"],"sources":["../src/registry/ensure.ts"],"sourcesContent":["import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function ensure<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n): InstanceType<T> {\n return getRegistry().ensure(BlocClass, instanceKey);\n}\n"],"mappings":";;AAGA,SAAgB,OACd,WACA,aACiB;AACjB,QAAOA,eAAAA,aAAa,CAAC,OAAO,WAAW,YAAY"}
@@ -1,9 +1,9 @@
1
- import { t as getRegistry } from "./config-XQua95Xz.js";
1
+ import { t as getRegistry } from './config-XQua95Xz.js';
2
2
  //#region src/registry/ensure.ts
3
3
  function ensure(BlocClass, instanceKey) {
4
- return getRegistry().ensure(BlocClass, instanceKey);
4
+ return getRegistry().ensure(BlocClass, instanceKey);
5
5
  }
6
6
  //#endregion
7
7
  export { ensure as t };
8
8
 
9
- //# sourceMappingURL=ensure-C5I1xp2C.js.map
9
+ //# sourceMappingURL=ensure-C5I1xp2C.js.map