@blac/core 2.0.14 → 2.0.16

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 (570) hide show
  1. package/dist/{StateContainerRegistry-DmmzYa7S.js → StateContainerRegistry-B_ViBLvJ.js} +78 -77
  2. package/dist/StateContainerRegistry-B_ViBLvJ.js.map +1 -0
  3. package/dist/{StateContainerRegistry-B4yVMYbx.cjs → StateContainerRegistry-FWKzPfS-.cjs} +77 -88
  4. package/dist/StateContainerRegistry-FWKzPfS-.cjs.map +1 -0
  5. package/dist/acquire-DHEOEVcj.cjs +46 -0
  6. package/dist/acquire-DHEOEVcj.cjs.map +1 -0
  7. package/dist/acquire-Don7499S.js +35 -0
  8. package/dist/acquire-Don7499S.js.map +1 -0
  9. package/dist/{branded-BSeA_mZO.cjs → branded-BybA0_xw.cjs} +1 -1
  10. package/dist/{branded-BSeA_mZO.cjs.map → branded-BybA0_xw.cjs.map} +1 -1
  11. package/dist/{branded-DwtzSsg0.js → branded-DkbUzncc.js} +1 -1
  12. package/dist/{branded-DwtzSsg0.js.map → branded-DkbUzncc.js.map} +1 -1
  13. package/dist/{config-DoHx0Xsl.js → config-8pyOC5gv.js} +2 -2
  14. package/dist/{config-0ZD9i3wy.js.map → config-8pyOC5gv.js.map} +1 -1
  15. package/dist/{config-B_4xXpvK.cjs → config-DVMnlHLv.cjs} +2 -2
  16. package/dist/{config-B3NIwDQv.cjs.map → config-DVMnlHLv.cjs.map} +1 -1
  17. package/dist/constants.d.cts +0 -5
  18. package/dist/constants.d.ts +0 -5
  19. package/dist/core/StateContainer.d.ts +2 -2
  20. package/dist/core/StateContainerRegistry.d.ts +25 -8
  21. package/dist/debug.cjs +3 -3
  22. package/dist/debug.js +3 -3
  23. package/dist/{Cubit-CWP8Ddzx.cjs → ensure-CLQEx0Nn.cjs} +24 -6
  24. package/dist/ensure-CLQEx0Nn.cjs.map +1 -0
  25. package/dist/{Cubit-VJuu2tt9.js → ensure-CPMiGvov.js} +19 -7
  26. package/dist/ensure-CPMiGvov.js.map +1 -0
  27. package/dist/index.cjs +33 -40
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.d.cts +2 -1
  30. package/dist/index.d.ts +2 -1
  31. package/dist/index.js +27 -33
  32. package/dist/index.js.map +1 -1
  33. package/dist/management-7jLjVHJd.js +38 -0
  34. package/dist/management-7jLjVHJd.js.map +1 -0
  35. package/dist/{management-DTzcC6aD.cjs → management-GcnNJjnm.cjs} +14 -8
  36. package/dist/management-GcnNJjnm.cjs.map +1 -0
  37. package/dist/plugins.cjs +1 -1
  38. package/dist/plugins.js +1 -1
  39. package/dist/registry/acquire.d.ts +19 -6
  40. package/dist/registry/borrow.d.ts +14 -3
  41. package/dist/registry/ensure.d.ts +7 -1
  42. package/dist/registry/index.d.ts +1 -0
  43. package/dist/registry/queries.d.ts +10 -4
  44. package/dist/registry/release.d.ts +14 -2
  45. package/dist/testing.cjs +17 -17
  46. package/dist/testing.cjs.map +1 -1
  47. package/dist/testing.d.cts +4 -4
  48. package/dist/testing.d.ts +4 -4
  49. package/dist/testing.js +14 -14
  50. package/dist/testing.js.map +1 -1
  51. package/dist/types/utilities.d.ts +1 -12
  52. package/dist/types.cjs +1 -1
  53. package/dist/types.js +1 -1
  54. package/dist/utils/static-props.d.ts +0 -9
  55. package/dist/watch/watch.d.ts +8 -5
  56. package/dist/{watch-DWCqXllW.js → watch-BmC-Tyqg.js} +11 -9
  57. package/dist/watch-BmC-Tyqg.js.map +1 -0
  58. package/dist/{watch-BpwaUL8r.cjs → watch-CKWt788i.cjs} +11 -9
  59. package/dist/watch-CKWt788i.cjs.map +1 -0
  60. package/dist/watch-entry.cjs +1 -1
  61. package/dist/watch-entry.js +1 -1
  62. package/package.json +22 -11
  63. package/dist/Cubit-9jal5zdZ.cjs +0 -390
  64. package/dist/Cubit-9jal5zdZ.cjs.map +0 -1
  65. package/dist/Cubit-BAUPiUF7.cjs +0 -380
  66. package/dist/Cubit-BAUPiUF7.cjs.map +0 -1
  67. package/dist/Cubit-BBKF3PIg.js +0 -287
  68. package/dist/Cubit-BBKF3PIg.js.map +0 -1
  69. package/dist/Cubit-BC70gaiA.js +0 -453
  70. package/dist/Cubit-BC70gaiA.js.map +0 -1
  71. package/dist/Cubit-BOgUZva7.js +0 -360
  72. package/dist/Cubit-BOgUZva7.js.map +0 -1
  73. package/dist/Cubit-BOxMvpfc.js +0 -291
  74. package/dist/Cubit-BOxMvpfc.js.map +0 -1
  75. package/dist/Cubit-BTznt8zg.js +0 -370
  76. package/dist/Cubit-BTznt8zg.js.map +0 -1
  77. package/dist/Cubit-BogJXkLm.js +0 -278
  78. package/dist/Cubit-BogJXkLm.js.map +0 -1
  79. package/dist/Cubit-C-8R_8db.cjs +0 -475
  80. package/dist/Cubit-C-8R_8db.cjs.map +0 -1
  81. package/dist/Cubit-C3Mw3EoO.cjs +0 -401
  82. package/dist/Cubit-C3Mw3EoO.cjs.map +0 -1
  83. package/dist/Cubit-CO8Fr72L.cjs +0 -447
  84. package/dist/Cubit-CO8Fr72L.cjs.map +0 -1
  85. package/dist/Cubit-COfHT1Bm.cjs +0 -321
  86. package/dist/Cubit-COfHT1Bm.cjs.map +0 -1
  87. package/dist/Cubit-CROWjjs9.js +0 -481
  88. package/dist/Cubit-CROWjjs9.js.map +0 -1
  89. package/dist/Cubit-CWP8Ddzx.cjs.map +0 -1
  90. package/dist/Cubit-CXxh9iol.js +0 -302
  91. package/dist/Cubit-CXxh9iol.js.map +0 -1
  92. package/dist/Cubit-CYOWfzQt.cjs +0 -317
  93. package/dist/Cubit-CYOWfzQt.cjs.map +0 -1
  94. package/dist/Cubit-CZaf_fp4.cjs +0 -388
  95. package/dist/Cubit-CZaf_fp4.cjs.map +0 -1
  96. package/dist/Cubit-C_dUEUdd.cjs +0 -380
  97. package/dist/Cubit-C_dUEUdd.cjs.map +0 -1
  98. package/dist/Cubit-C_rxRCTN.cjs +0 -523
  99. package/dist/Cubit-C_rxRCTN.cjs.map +0 -1
  100. package/dist/Cubit-CcKgMEBO.js +0 -299
  101. package/dist/Cubit-CcKgMEBO.js.map +0 -1
  102. package/dist/Cubit-CfT6Y1jl.js +0 -346
  103. package/dist/Cubit-CfT6Y1jl.js.map +0 -1
  104. package/dist/Cubit-CynJruuO.js +0 -369
  105. package/dist/Cubit-CynJruuO.js.map +0 -1
  106. package/dist/Cubit-D2vQ6nMb.js +0 -360
  107. package/dist/Cubit-D2vQ6nMb.js.map +0 -1
  108. package/dist/Cubit-D7jOZCoZ.js +0 -360
  109. package/dist/Cubit-D7jOZCoZ.js.map +0 -1
  110. package/dist/Cubit-D9j3IGPc.cjs +0 -523
  111. package/dist/Cubit-D9j3IGPc.cjs.map +0 -1
  112. package/dist/Cubit-DKEY9WYq.cjs +0 -296
  113. package/dist/Cubit-DKEY9WYq.cjs.map +0 -1
  114. package/dist/Cubit-DMV_0TCp.js +0 -481
  115. package/dist/Cubit-DMV_0TCp.js.map +0 -1
  116. package/dist/Cubit-DP5DXPUK.js +0 -360
  117. package/dist/Cubit-DP5DXPUK.js.map +0 -1
  118. package/dist/Cubit-DRFkzD2h.js +0 -426
  119. package/dist/Cubit-DRFkzD2h.js.map +0 -1
  120. package/dist/Cubit-DbnhTUaZ.cjs +0 -380
  121. package/dist/Cubit-DbnhTUaZ.cjs.map +0 -1
  122. package/dist/Cubit-DrqG3SP3.cjs +0 -370
  123. package/dist/Cubit-DrqG3SP3.cjs.map +0 -1
  124. package/dist/Cubit-DsDkCo42.cjs +0 -313
  125. package/dist/Cubit-DsDkCo42.cjs.map +0 -1
  126. package/dist/Cubit-DwRw1E9D.cjs +0 -309
  127. package/dist/Cubit-DwRw1E9D.cjs.map +0 -1
  128. package/dist/Cubit-Dw_kFBgc.js +0 -372
  129. package/dist/Cubit-Dw_kFBgc.js.map +0 -1
  130. package/dist/Cubit-KiXZCubP.cjs +0 -392
  131. package/dist/Cubit-KiXZCubP.cjs.map +0 -1
  132. package/dist/Cubit-Ksj7G4uR.js +0 -360
  133. package/dist/Cubit-Ksj7G4uR.js.map +0 -1
  134. package/dist/Cubit-MkjbpcPf.cjs +0 -380
  135. package/dist/Cubit-MkjbpcPf.cjs.map +0 -1
  136. package/dist/Cubit-NRhvdDQ6.js +0 -297
  137. package/dist/Cubit-NRhvdDQ6.js.map +0 -1
  138. package/dist/Cubit-PMTXxI_u.js +0 -368
  139. package/dist/Cubit-PMTXxI_u.js.map +0 -1
  140. package/dist/Cubit-VJuu2tt9.js.map +0 -1
  141. package/dist/Cubit-jz922NKf.cjs +0 -320
  142. package/dist/Cubit-jz922NKf.cjs.map +0 -1
  143. package/dist/Cubit-kU5_4jgC.cjs +0 -380
  144. package/dist/Cubit-kU5_4jgC.cjs.map +0 -1
  145. package/dist/StateContainerRegistry-B4yVMYbx.cjs.map +0 -1
  146. package/dist/StateContainerRegistry-BAcxouCu.js +0 -723
  147. package/dist/StateContainerRegistry-BAcxouCu.js.map +0 -1
  148. package/dist/StateContainerRegistry-BK57H92E.js +0 -747
  149. package/dist/StateContainerRegistry-BK57H92E.js.map +0 -1
  150. package/dist/StateContainerRegistry-BRBATSrx.cjs +0 -1030
  151. package/dist/StateContainerRegistry-BRBATSrx.cjs.map +0 -1
  152. package/dist/StateContainerRegistry-BgBIKcQF.js +0 -956
  153. package/dist/StateContainerRegistry-BgBIKcQF.js.map +0 -1
  154. package/dist/StateContainerRegistry-BglEhqdA.js +0 -709
  155. package/dist/StateContainerRegistry-BglEhqdA.js.map +0 -1
  156. package/dist/StateContainerRegistry-BhcnG0DF.js +0 -665
  157. package/dist/StateContainerRegistry-BhcnG0DF.js.map +0 -1
  158. package/dist/StateContainerRegistry-BpO5t-0i.js +0 -682
  159. package/dist/StateContainerRegistry-BpO5t-0i.js.map +0 -1
  160. package/dist/StateContainerRegistry-BqS-wpb_.js +0 -957
  161. package/dist/StateContainerRegistry-BqS-wpb_.js.map +0 -1
  162. package/dist/StateContainerRegistry-BrEGYPZT.cjs +0 -1029
  163. package/dist/StateContainerRegistry-BrEGYPZT.cjs.map +0 -1
  164. package/dist/StateContainerRegistry-BsMIpllP.cjs +0 -659
  165. package/dist/StateContainerRegistry-BsMIpllP.cjs.map +0 -1
  166. package/dist/StateContainerRegistry-Bxfne4A7.cjs +0 -908
  167. package/dist/StateContainerRegistry-Bxfne4A7.cjs.map +0 -1
  168. package/dist/StateContainerRegistry-C0E7vsgy.js +0 -758
  169. package/dist/StateContainerRegistry-C0E7vsgy.js.map +0 -1
  170. package/dist/StateContainerRegistry-C0I77Ndz.cjs +0 -920
  171. package/dist/StateContainerRegistry-C0I77Ndz.cjs.map +0 -1
  172. package/dist/StateContainerRegistry-CDH9mnQS.cjs +0 -715
  173. package/dist/StateContainerRegistry-CDH9mnQS.cjs.map +0 -1
  174. package/dist/StateContainerRegistry-CTOXUf75.cjs +0 -742
  175. package/dist/StateContainerRegistry-CTOXUf75.cjs.map +0 -1
  176. package/dist/StateContainerRegistry-CX2CBOmv.cjs +0 -795
  177. package/dist/StateContainerRegistry-CX2CBOmv.cjs.map +0 -1
  178. package/dist/StateContainerRegistry-CXnnf2-l.js +0 -867
  179. package/dist/StateContainerRegistry-CXnnf2-l.js.map +0 -1
  180. package/dist/StateContainerRegistry-CehuIpK_.cjs +0 -811
  181. package/dist/StateContainerRegistry-CehuIpK_.cjs.map +0 -1
  182. package/dist/StateContainerRegistry-Ci0ajc5g.js +0 -720
  183. package/dist/StateContainerRegistry-Ci0ajc5g.js.map +0 -1
  184. package/dist/StateContainerRegistry-Ck2-XmT_.js +0 -627
  185. package/dist/StateContainerRegistry-Ck2-XmT_.js.map +0 -1
  186. package/dist/StateContainerRegistry-D1lVJFGL.cjs +0 -753
  187. package/dist/StateContainerRegistry-D1lVJFGL.cjs.map +0 -1
  188. package/dist/StateContainerRegistry-DC4N73O6.js +0 -672
  189. package/dist/StateContainerRegistry-DC4N73O6.js.map +0 -1
  190. package/dist/StateContainerRegistry-DOkDGng-.js +0 -626
  191. package/dist/StateContainerRegistry-DOkDGng-.js.map +0 -1
  192. package/dist/StateContainerRegistry-DOuGI-l5.js +0 -685
  193. package/dist/StateContainerRegistry-DOuGI-l5.js.map +0 -1
  194. package/dist/StateContainerRegistry-DT66lr3I.cjs +0 -698
  195. package/dist/StateContainerRegistry-DT66lr3I.cjs.map +0 -1
  196. package/dist/StateContainerRegistry-DmmzYa7S.js.map +0 -1
  197. package/dist/StateContainerRegistry-Upsrlg9G.cjs +0 -756
  198. package/dist/StateContainerRegistry-Upsrlg9G.cjs.map +0 -1
  199. package/dist/StateContainerRegistry-WznfcA-Q.js +0 -855
  200. package/dist/StateContainerRegistry-WznfcA-Q.js.map +0 -1
  201. package/dist/StateContainerRegistry-Yph6UCA_.js +0 -678
  202. package/dist/StateContainerRegistry-Yph6UCA_.js.map +0 -1
  203. package/dist/StateContainerRegistry-mseeTqSA.cjs +0 -718
  204. package/dist/StateContainerRegistry-mseeTqSA.cjs.map +0 -1
  205. package/dist/StateContainerRegistry-pRNxHNFD.cjs +0 -705
  206. package/dist/StateContainerRegistry-pRNxHNFD.cjs.map +0 -1
  207. package/dist/StateContainerRegistry-vXMWtG7J.cjs +0 -660
  208. package/dist/StateContainerRegistry-vXMWtG7J.cjs.map +0 -1
  209. package/dist/StateContainerRegistry-v_prqMcI.cjs +0 -711
  210. package/dist/StateContainerRegistry-v_prqMcI.cjs.map +0 -1
  211. package/dist/branded-DCqi3De1.cjs +0 -18
  212. package/dist/branded-DCqi3De1.cjs.map +0 -1
  213. package/dist/branded-Max3xOTA.js +0 -13
  214. package/dist/branded-Max3xOTA.js.map +0 -1
  215. package/dist/config-0ZD9i3wy.js +0 -16
  216. package/dist/config-B3NIwDQv.cjs +0 -32
  217. package/dist/config-BKGHop0V.js +0 -16
  218. package/dist/config-BKGHop0V.js.map +0 -1
  219. package/dist/config-BKoaAlmb.js +0 -16
  220. package/dist/config-BKoaAlmb.js.map +0 -1
  221. package/dist/config-BPj08-8h.cjs +0 -32
  222. package/dist/config-BPj08-8h.cjs.map +0 -1
  223. package/dist/config-BR0Xy-Tn.cjs +0 -32
  224. package/dist/config-BR0Xy-Tn.cjs.map +0 -1
  225. package/dist/config-B_4xXpvK.cjs.map +0 -1
  226. package/dist/config-BflrQM4_.cjs +0 -32
  227. package/dist/config-BflrQM4_.cjs.map +0 -1
  228. package/dist/config-BzObBsk2.cjs +0 -32
  229. package/dist/config-BzObBsk2.cjs.map +0 -1
  230. package/dist/config-C0yumL1H.cjs +0 -32
  231. package/dist/config-C0yumL1H.cjs.map +0 -1
  232. package/dist/config-C8xqVHTf.js +0 -16
  233. package/dist/config-C8xqVHTf.js.map +0 -1
  234. package/dist/config-CCUhIYIF.js +0 -16
  235. package/dist/config-CCUhIYIF.js.map +0 -1
  236. package/dist/config-CGo__MAt.js +0 -16
  237. package/dist/config-CGo__MAt.js.map +0 -1
  238. package/dist/config-CQH9fTY-.cjs +0 -32
  239. package/dist/config-CQH9fTY-.cjs.map +0 -1
  240. package/dist/config-CR_Bz7RD.js +0 -16
  241. package/dist/config-CR_Bz7RD.js.map +0 -1
  242. package/dist/config-CTOa-yPN.cjs +0 -32
  243. package/dist/config-CTOa-yPN.cjs.map +0 -1
  244. package/dist/config-Cd7Q-B4g.js +0 -16
  245. package/dist/config-Cd7Q-B4g.js.map +0 -1
  246. package/dist/config-CmDEX-1o.js +0 -16
  247. package/dist/config-CmDEX-1o.js.map +0 -1
  248. package/dist/config-CoNMTnMA.cjs +0 -32
  249. package/dist/config-CoNMTnMA.cjs.map +0 -1
  250. package/dist/config-Cwj8-C1J.js +0 -16
  251. package/dist/config-Cwj8-C1J.js.map +0 -1
  252. package/dist/config-D3jisfdj.cjs +0 -32
  253. package/dist/config-D3jisfdj.cjs.map +0 -1
  254. package/dist/config-D4GifZQ4.js +0 -16
  255. package/dist/config-D4GifZQ4.js.map +0 -1
  256. package/dist/config-DDrSQGpQ.cjs +0 -32
  257. package/dist/config-DDrSQGpQ.cjs.map +0 -1
  258. package/dist/config-DEcslxan.cjs +0 -32
  259. package/dist/config-DEcslxan.cjs.map +0 -1
  260. package/dist/config-DLzmy2rZ.cjs +0 -32
  261. package/dist/config-DLzmy2rZ.cjs.map +0 -1
  262. package/dist/config-DMNZ2YLV.cjs +0 -32
  263. package/dist/config-DMNZ2YLV.cjs.map +0 -1
  264. package/dist/config-De9oQ6Ki.js +0 -16
  265. package/dist/config-De9oQ6Ki.js.map +0 -1
  266. package/dist/config-DoHx0Xsl.js.map +0 -1
  267. package/dist/config-DokTzpr8.cjs +0 -32
  268. package/dist/config-DokTzpr8.cjs.map +0 -1
  269. package/dist/config-DslYBm4Z.js +0 -16
  270. package/dist/config-DslYBm4Z.js.map +0 -1
  271. package/dist/config-H6FAqbW4.cjs +0 -32
  272. package/dist/config-H6FAqbW4.cjs.map +0 -1
  273. package/dist/config-XQua95Xz.js +0 -16
  274. package/dist/config-XQua95Xz.js.map +0 -1
  275. package/dist/config-Yp645dGK.js +0 -16
  276. package/dist/config-Yp645dGK.js.map +0 -1
  277. package/dist/config-ispAzOZV.js +0 -16
  278. package/dist/config-ispAzOZV.js.map +0 -1
  279. package/dist/ensure-9VEq5H0L.js +0 -9
  280. package/dist/ensure-9VEq5H0L.js.map +0 -1
  281. package/dist/ensure-BB6xHQAF.cjs +0 -14
  282. package/dist/ensure-BB6xHQAF.cjs.map +0 -1
  283. package/dist/ensure-BNDfTzqg.cjs +0 -14
  284. package/dist/ensure-BNDfTzqg.cjs.map +0 -1
  285. package/dist/ensure-BVCnjU7r.js +0 -365
  286. package/dist/ensure-BVCnjU7r.js.map +0 -1
  287. package/dist/ensure-BbzGXjep.cjs +0 -14
  288. package/dist/ensure-BbzGXjep.cjs.map +0 -1
  289. package/dist/ensure-BlIaQai6.js +0 -9
  290. package/dist/ensure-BlIaQai6.js.map +0 -1
  291. package/dist/ensure-Bm3oHxga.js +0 -9
  292. package/dist/ensure-Bm3oHxga.js.map +0 -1
  293. package/dist/ensure-C3eIRs6e.cjs +0 -14
  294. package/dist/ensure-C3eIRs6e.cjs.map +0 -1
  295. package/dist/ensure-C5I1xp2C.js +0 -9
  296. package/dist/ensure-C5I1xp2C.js.map +0 -1
  297. package/dist/ensure-CJZL7bcA.cjs +0 -391
  298. package/dist/ensure-CJZL7bcA.cjs.map +0 -1
  299. package/dist/ensure-CN6unBOe.cjs +0 -14
  300. package/dist/ensure-CN6unBOe.cjs.map +0 -1
  301. package/dist/ensure-CSHYjIeH.cjs +0 -14
  302. package/dist/ensure-CSHYjIeH.cjs.map +0 -1
  303. package/dist/ensure-CU-B1ywv.js +0 -9
  304. package/dist/ensure-CU-B1ywv.js.map +0 -1
  305. package/dist/ensure-CWKzeno7.js +0 -9
  306. package/dist/ensure-CWKzeno7.js.map +0 -1
  307. package/dist/ensure-CkENsuQ9.js +0 -9
  308. package/dist/ensure-CkENsuQ9.js.map +0 -1
  309. package/dist/ensure-Cm-4_LSh.cjs +0 -14
  310. package/dist/ensure-Cm-4_LSh.cjs.map +0 -1
  311. package/dist/ensure-Cqex5r1P.cjs +0 -14
  312. package/dist/ensure-Cqex5r1P.cjs.map +0 -1
  313. package/dist/ensure-Cv5AbNGZ.js +0 -9
  314. package/dist/ensure-Cv5AbNGZ.js.map +0 -1
  315. package/dist/ensure-D63lEMUK.cjs +0 -14
  316. package/dist/ensure-D63lEMUK.cjs.map +0 -1
  317. package/dist/ensure-DGEtPU9A.cjs +0 -14
  318. package/dist/ensure-DGEtPU9A.cjs.map +0 -1
  319. package/dist/ensure-DM3qb336.cjs +0 -14
  320. package/dist/ensure-DM3qb336.cjs.map +0 -1
  321. package/dist/ensure-DME-_T0j.cjs +0 -14
  322. package/dist/ensure-DME-_T0j.cjs.map +0 -1
  323. package/dist/ensure-DWd0GCYB.js +0 -9
  324. package/dist/ensure-DWd0GCYB.js.map +0 -1
  325. package/dist/ensure-DamKOP6q.cjs +0 -14
  326. package/dist/ensure-DamKOP6q.cjs.map +0 -1
  327. package/dist/ensure-Dcfptl-A.js +0 -9
  328. package/dist/ensure-Dcfptl-A.js.map +0 -1
  329. package/dist/ensure-Def-EBWG.js +0 -9
  330. package/dist/ensure-Def-EBWG.js.map +0 -1
  331. package/dist/ensure-DnHL5QiQ.cjs +0 -14
  332. package/dist/ensure-DnHL5QiQ.cjs.map +0 -1
  333. package/dist/ensure-Dr7I78Ku.cjs +0 -14
  334. package/dist/ensure-Dr7I78Ku.cjs.map +0 -1
  335. package/dist/ensure-SLVdGd5b.js +0 -9
  336. package/dist/ensure-SLVdGd5b.js.map +0 -1
  337. package/dist/ensure-Sb92MCXu.js +0 -9
  338. package/dist/ensure-Sb92MCXu.js.map +0 -1
  339. package/dist/ensure-gFlvevGm.cjs +0 -14
  340. package/dist/ensure-gFlvevGm.cjs.map +0 -1
  341. package/dist/ensure-l2-H7S5W.js +0 -9
  342. package/dist/ensure-l2-H7S5W.js.map +0 -1
  343. package/dist/ensure-mkL-3qh8.js +0 -9
  344. package/dist/ensure-mkL-3qh8.js.map +0 -1
  345. package/dist/ensure-n80crSlX.js +0 -9
  346. package/dist/ensure-n80crSlX.js.map +0 -1
  347. package/dist/ensure-nCxg7MCN.js +0 -9
  348. package/dist/ensure-nCxg7MCN.js.map +0 -1
  349. package/dist/ensure-vS71MV4q.cjs +0 -14
  350. package/dist/ensure-vS71MV4q.cjs.map +0 -1
  351. package/dist/management-6oQbmf0z.js +0 -41
  352. package/dist/management-6oQbmf0z.js.map +0 -1
  353. package/dist/management-B46QwA9Y.js +0 -41
  354. package/dist/management-B46QwA9Y.js.map +0 -1
  355. package/dist/management-B9yrRpeg.js +0 -41
  356. package/dist/management-B9yrRpeg.js.map +0 -1
  357. package/dist/management-BCKTEZ8Q.js +0 -41
  358. package/dist/management-BCKTEZ8Q.js.map +0 -1
  359. package/dist/management-BbMzdXbT.js +0 -41
  360. package/dist/management-BbMzdXbT.js.map +0 -1
  361. package/dist/management-Bg652agq.js +0 -41
  362. package/dist/management-Bg652agq.js.map +0 -1
  363. package/dist/management-BnedF5ZD.cjs +0 -79
  364. package/dist/management-BnedF5ZD.cjs.map +0 -1
  365. package/dist/management-BoUa99eB.cjs +0 -79
  366. package/dist/management-BoUa99eB.cjs.map +0 -1
  367. package/dist/management-C-wBdpho.js +0 -37
  368. package/dist/management-C-wBdpho.js.map +0 -1
  369. package/dist/management-C4SHcrJm.cjs +0 -79
  370. package/dist/management-C4SHcrJm.cjs.map +0 -1
  371. package/dist/management-CK-GL3wY.js +0 -41
  372. package/dist/management-CK-GL3wY.js.map +0 -1
  373. package/dist/management-CPhgY8OE.js +0 -41
  374. package/dist/management-CPhgY8OE.js.map +0 -1
  375. package/dist/management-CU_V3LIP.js +0 -41
  376. package/dist/management-CU_V3LIP.js.map +0 -1
  377. package/dist/management-CUwXDSi9.cjs +0 -79
  378. package/dist/management-CUwXDSi9.cjs.map +0 -1
  379. package/dist/management-CaqiyNzB.js +0 -41
  380. package/dist/management-CaqiyNzB.js.map +0 -1
  381. package/dist/management-Cin-JvYe.js +0 -41
  382. package/dist/management-Cin-JvYe.js.map +0 -1
  383. package/dist/management-ClaXym0F.cjs +0 -79
  384. package/dist/management-ClaXym0F.cjs.map +0 -1
  385. package/dist/management-DL0Uzsoz.js +0 -41
  386. package/dist/management-DL0Uzsoz.js.map +0 -1
  387. package/dist/management-DLdAQfqk.cjs +0 -79
  388. package/dist/management-DLdAQfqk.cjs.map +0 -1
  389. package/dist/management-DMZ8qpwr.cjs +0 -79
  390. package/dist/management-DMZ8qpwr.cjs.map +0 -1
  391. package/dist/management-DTzcC6aD.cjs.map +0 -1
  392. package/dist/management-DYLNyj9p.cjs +0 -79
  393. package/dist/management-DYLNyj9p.cjs.map +0 -1
  394. package/dist/management-Dag9u4t6.cjs +0 -79
  395. package/dist/management-Dag9u4t6.cjs.map +0 -1
  396. package/dist/management-DbMRdDBo.cjs +0 -79
  397. package/dist/management-DbMRdDBo.cjs.map +0 -1
  398. package/dist/management-DfnDAKmP.js +0 -41
  399. package/dist/management-DfnDAKmP.js.map +0 -1
  400. package/dist/management-DjBU1gtb.cjs +0 -79
  401. package/dist/management-DjBU1gtb.cjs.map +0 -1
  402. package/dist/management-DwCozsY8.js +0 -41
  403. package/dist/management-DwCozsY8.js.map +0 -1
  404. package/dist/management-H4m3ciJO.js +0 -32
  405. package/dist/management-H4m3ciJO.js.map +0 -1
  406. package/dist/management-Xo3A6Za3.cjs +0 -79
  407. package/dist/management-Xo3A6Za3.cjs.map +0 -1
  408. package/dist/management-ZU2YzOkr.js +0 -37
  409. package/dist/management-ZU2YzOkr.js.map +0 -1
  410. package/dist/management-baPDwA9n.cjs +0 -79
  411. package/dist/management-baPDwA9n.cjs.map +0 -1
  412. package/dist/management-jQGCvZNN.cjs +0 -70
  413. package/dist/management-jQGCvZNN.cjs.map +0 -1
  414. package/dist/management-ry_KteFK.cjs +0 -79
  415. package/dist/management-ry_KteFK.cjs.map +0 -1
  416. package/dist/management-xoZ7w3bI.cjs +0 -70
  417. package/dist/management-xoZ7w3bI.cjs.map +0 -1
  418. package/dist/resolve-dependencies-B2QggQAi.js +0 -729
  419. package/dist/resolve-dependencies-B2QggQAi.js.map +0 -1
  420. package/dist/resolve-dependencies-B6JDXvpr.js +0 -739
  421. package/dist/resolve-dependencies-B6JDXvpr.js.map +0 -1
  422. package/dist/resolve-dependencies-BA3u06uC.js +0 -731
  423. package/dist/resolve-dependencies-BA3u06uC.js.map +0 -1
  424. package/dist/resolve-dependencies-BAKAoD0U.js +0 -878
  425. package/dist/resolve-dependencies-BAKAoD0U.js.map +0 -1
  426. package/dist/resolve-dependencies-BFZQq60Y.cjs +0 -832
  427. package/dist/resolve-dependencies-BFZQq60Y.cjs.map +0 -1
  428. package/dist/resolve-dependencies-BGafS3Ww.js +0 -731
  429. package/dist/resolve-dependencies-BGafS3Ww.js.map +0 -1
  430. package/dist/resolve-dependencies-BHd34gS3.cjs +0 -832
  431. package/dist/resolve-dependencies-BHd34gS3.cjs.map +0 -1
  432. package/dist/resolve-dependencies-BNeayhbQ.cjs +0 -840
  433. package/dist/resolve-dependencies-BNeayhbQ.cjs.map +0 -1
  434. package/dist/resolve-dependencies-BT6TU2HF.cjs +0 -832
  435. package/dist/resolve-dependencies-BT6TU2HF.cjs.map +0 -1
  436. package/dist/resolve-dependencies-BWEMpuDy.js +0 -729
  437. package/dist/resolve-dependencies-BWEMpuDy.js.map +0 -1
  438. package/dist/resolve-dependencies-BiWkW2eS.js +0 -731
  439. package/dist/resolve-dependencies-BiWkW2eS.js.map +0 -1
  440. package/dist/resolve-dependencies-BjxCztYD.js +0 -739
  441. package/dist/resolve-dependencies-BjxCztYD.js.map +0 -1
  442. package/dist/resolve-dependencies-BlyBV0hB.cjs +0 -969
  443. package/dist/resolve-dependencies-BlyBV0hB.cjs.map +0 -1
  444. package/dist/resolve-dependencies-By26rT_i.js +0 -739
  445. package/dist/resolve-dependencies-By26rT_i.js.map +0 -1
  446. package/dist/resolve-dependencies-C9Kf7AzY.cjs +0 -832
  447. package/dist/resolve-dependencies-C9Kf7AzY.cjs.map +0 -1
  448. package/dist/resolve-dependencies-CTzV1txG.js +0 -731
  449. package/dist/resolve-dependencies-CTzV1txG.js.map +0 -1
  450. package/dist/resolve-dependencies-CWjuGHiF.cjs +0 -969
  451. package/dist/resolve-dependencies-CWjuGHiF.cjs.map +0 -1
  452. package/dist/resolve-dependencies-ClSsP0DJ.cjs +0 -830
  453. package/dist/resolve-dependencies-ClSsP0DJ.cjs.map +0 -1
  454. package/dist/resolve-dependencies-D0vTzZgs.js +0 -731
  455. package/dist/resolve-dependencies-D0vTzZgs.js.map +0 -1
  456. package/dist/resolve-dependencies-D2WnZMF-.cjs +0 -832
  457. package/dist/resolve-dependencies-D2WnZMF-.cjs.map +0 -1
  458. package/dist/resolve-dependencies-DCBLTeza.cjs +0 -969
  459. package/dist/resolve-dependencies-DCBLTeza.cjs.map +0 -1
  460. package/dist/resolve-dependencies-DMlqYJR2.js +0 -731
  461. package/dist/resolve-dependencies-DMlqYJR2.js.map +0 -1
  462. package/dist/resolve-dependencies-DP6U1EYB.cjs +0 -840
  463. package/dist/resolve-dependencies-DP6U1EYB.cjs.map +0 -1
  464. package/dist/resolve-dependencies-DSQNXvnV.cjs +0 -832
  465. package/dist/resolve-dependencies-DSQNXvnV.cjs.map +0 -1
  466. package/dist/resolve-dependencies-DV3HO_uH.js +0 -878
  467. package/dist/resolve-dependencies-DV3HO_uH.js.map +0 -1
  468. package/dist/resolve-dependencies-DXwMhP0Y.js +0 -878
  469. package/dist/resolve-dependencies-DXwMhP0Y.js.map +0 -1
  470. package/dist/resolve-dependencies-DbRWlt9u.js +0 -878
  471. package/dist/resolve-dependencies-DbRWlt9u.js.map +0 -1
  472. package/dist/resolve-dependencies-DcUUva2P.cjs +0 -832
  473. package/dist/resolve-dependencies-DcUUva2P.cjs.map +0 -1
  474. package/dist/resolve-dependencies-Dd8T6TLt.cjs +0 -832
  475. package/dist/resolve-dependencies-Dd8T6TLt.cjs.map +0 -1
  476. package/dist/resolve-dependencies-Dfdp_DZd.cjs +0 -840
  477. package/dist/resolve-dependencies-Dfdp_DZd.cjs.map +0 -1
  478. package/dist/resolve-dependencies-GJ8PNyNB.cjs +0 -969
  479. package/dist/resolve-dependencies-GJ8PNyNB.cjs.map +0 -1
  480. package/dist/resolve-dependencies-KSpTt4jy.cjs +0 -830
  481. package/dist/resolve-dependencies-KSpTt4jy.cjs.map +0 -1
  482. package/dist/resolve-dependencies-Nvjp4CwS.js +0 -731
  483. package/dist/resolve-dependencies-Nvjp4CwS.js.map +0 -1
  484. package/dist/resolve-dependencies-f-QUqYiL.js +0 -731
  485. package/dist/resolve-dependencies-f-QUqYiL.js.map +0 -1
  486. package/dist/tracked-B77j2g9M.js +0 -197
  487. package/dist/tracked-B77j2g9M.js.map +0 -1
  488. package/dist/tracked-BDVi2LKM.cjs +0 -227
  489. package/dist/tracked-BDVi2LKM.cjs.map +0 -1
  490. package/dist/tracked-BFdJCzL0.cjs +0 -242
  491. package/dist/tracked-BFdJCzL0.cjs.map +0 -1
  492. package/dist/tracked-BH-gX4T1.cjs +0 -227
  493. package/dist/tracked-BH-gX4T1.cjs.map +0 -1
  494. package/dist/tracked-BTHok3Dl.cjs +0 -227
  495. package/dist/tracked-BTHok3Dl.cjs.map +0 -1
  496. package/dist/tracked-BTbFkFeM.js +0 -212
  497. package/dist/tracked-BTbFkFeM.js.map +0 -1
  498. package/dist/tracked-BU_OBWqM.cjs +0 -242
  499. package/dist/tracked-BU_OBWqM.cjs.map +0 -1
  500. package/dist/tracked-BfctH2es.cjs +0 -242
  501. package/dist/tracked-BfctH2es.cjs.map +0 -1
  502. package/dist/tracked-BhQtzUhZ.js +0 -212
  503. package/dist/tracked-BhQtzUhZ.js.map +0 -1
  504. package/dist/tracked-BnqrYXiO.js +0 -212
  505. package/dist/tracked-BnqrYXiO.js.map +0 -1
  506. package/dist/tracked-BtgFOGup.js +0 -212
  507. package/dist/tracked-BtgFOGup.js.map +0 -1
  508. package/dist/tracked-C3nIS4J7.cjs +0 -242
  509. package/dist/tracked-C3nIS4J7.cjs.map +0 -1
  510. package/dist/tracked-C52awNV9.js +0 -197
  511. package/dist/tracked-C52awNV9.js.map +0 -1
  512. package/dist/tracked-CGzduF2m.js +0 -212
  513. package/dist/tracked-CGzduF2m.js.map +0 -1
  514. package/dist/tracked-CK_-ixtX.cjs +0 -227
  515. package/dist/tracked-CK_-ixtX.cjs.map +0 -1
  516. package/dist/tracked-CLlvURln.js +0 -212
  517. package/dist/tracked-CLlvURln.js.map +0 -1
  518. package/dist/tracked-CgHWmuGC.cjs +0 -242
  519. package/dist/tracked-CgHWmuGC.cjs.map +0 -1
  520. package/dist/tracked-CoAlC8fs.js +0 -197
  521. package/dist/tracked-CoAlC8fs.js.map +0 -1
  522. package/dist/tracked-D3Xjm1H1.cjs +0 -242
  523. package/dist/tracked-D3Xjm1H1.cjs.map +0 -1
  524. package/dist/tracked-DB6yMV5F.js +0 -212
  525. package/dist/tracked-DB6yMV5F.js.map +0 -1
  526. package/dist/tracked-DBn-bs_G.js +0 -197
  527. package/dist/tracked-DBn-bs_G.js.map +0 -1
  528. package/dist/tracked-DCfBaYjL.cjs +0 -227
  529. package/dist/tracked-DCfBaYjL.cjs.map +0 -1
  530. package/dist/tracked-DKduNLgI.js +0 -197
  531. package/dist/tracked-DKduNLgI.js.map +0 -1
  532. package/dist/tracked-DMBTDF0P.js +0 -197
  533. package/dist/tracked-DMBTDF0P.js.map +0 -1
  534. package/dist/tracked-DN3h3Rp1.js +0 -197
  535. package/dist/tracked-DN3h3Rp1.js.map +0 -1
  536. package/dist/tracked-DOGh1Q5Z.cjs +0 -242
  537. package/dist/tracked-DOGh1Q5Z.cjs.map +0 -1
  538. package/dist/tracked-DUkp4zve.cjs +0 -227
  539. package/dist/tracked-DUkp4zve.cjs.map +0 -1
  540. package/dist/tracked-D_ou7mYG.js +0 -212
  541. package/dist/tracked-D_ou7mYG.js.map +0 -1
  542. package/dist/tracked-Dcu6EATB.js +0 -197
  543. package/dist/tracked-Dcu6EATB.js.map +0 -1
  544. package/dist/tracked-GvAJQVAI.cjs +0 -271
  545. package/dist/tracked-GvAJQVAI.cjs.map +0 -1
  546. package/dist/tracked-O2lv-kJV.cjs +0 -242
  547. package/dist/tracked-O2lv-kJV.cjs.map +0 -1
  548. package/dist/tracked-WF6aXuAo.js +0 -223
  549. package/dist/tracked-WF6aXuAo.js.map +0 -1
  550. package/dist/tracked-d_sQWU3c.cjs +0 -227
  551. package/dist/tracked-d_sQWU3c.cjs.map +0 -1
  552. package/dist/tracked-n9TMK-30.cjs +0 -227
  553. package/dist/tracked-n9TMK-30.cjs.map +0 -1
  554. package/dist/tracked-njU-_pVa.cjs +0 -242
  555. package/dist/tracked-njU-_pVa.cjs.map +0 -1
  556. package/dist/tracked-zAgmKIlC.js +0 -212
  557. package/dist/tracked-zAgmKIlC.js.map +0 -1
  558. package/dist/tracking/dependency-manager.d.ts +0 -41
  559. package/dist/tracking/index.d.ts +0 -28
  560. package/dist/tracking/iteration-perf.bench.d.ts +0 -1
  561. package/dist/tracking/path-utils.d.ts +0 -69
  562. package/dist/tracking/resolve-dependencies.d.ts +0 -9
  563. package/dist/tracking/tracked.d.ts +0 -73
  564. package/dist/tracking/tracking-proxy.d.ts +0 -230
  565. package/dist/tracking.cjs +0 -21
  566. package/dist/tracking.d.cts +0 -9
  567. package/dist/tracking.d.ts +0 -9
  568. package/dist/tracking.js +0 -32
  569. package/dist/watch-BpwaUL8r.cjs.map +0 -1
  570. package/dist/watch-DWCqXllW.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-CLQEx0Nn.cjs","names":["StructuralContainer","getRegistry","getBlacConfig","ALL_PATHS","getClassEquality","getRegistry"],"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","/**\n * @internal @deprecated Symbol-keyed mutation entry point on `StateContainer`.\n *\n * Per A2 audit (`plans/blac-core-migration/_audit.md`), this symbol has zero\n * external consumers — only in-package tests still reference it. C0 keeps it\n * as a thin alias for `emit()` so the existing test files typecheck and run\n * unchanged; C5 will port those tests to use `emit()` directly and delete\n * this symbol along with its `[EMIT]` method on `StateContainer`.\n *\n * Do not add new uses of this symbol.\n */\nexport const EMIT = Symbol('blac.emit');\n\n/**\n * @internal Apply one owner's (consumer's) deps slice to an instance.\n * Called by framework adapters (e.g. @blac/react useBloc) — not public API.\n *\n * Kept until D0 ports `useBloc` off the legacy adapter surface. See A2 audit\n * (`plans/blac-core-migration/_audit.md`) for the consumer list.\n */\nexport const APPLY_DEPS = Symbol('blac.applyDeps');\n\n/**\n * @internal Withdraw one owner's entire deps slice (consumer unmounted).\n * Called by framework adapters — not public API.\n *\n * Kept until D0 ports `useBloc`. See A2 audit for the consumer list.\n */\nexport const REMOVE_DEPS_OWNER = Symbol('blac.removeDepsOwner');\n","import {\n ALL_PATHS,\n StructuralContainer,\n type DeepPartial,\n type StructuralContainerOptions,\n} from '@dirtytalk/structural';\nimport { generateSimpleId } from '../utils/idGenerator';\nimport { getRegistry } from '../registry/config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n} from '../types/utilities';\nimport { APPLY_DEPS, EMIT, REMOVE_DEPS_OWNER } from './symbols';\nimport { type EqualityFn, getBlacConfig } from '../config';\nimport { getClassEquality } from '../utils/static-props';\n\nexport interface StateContainerConfig {\n name?: string;\n debug?: boolean;\n instanceId?: string;\n /** Args passed at acquire time; forwarded to init(). */\n args?: unknown;\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\n/**\n * Shallow per-key `Object.is` comparison of two plain records. Keys are\n * considered: a key present in one but not the other (regardless of value)\n * makes the records unequal. Used to detect real deps changes.\n */\nfunction shallowEqualRecord(\n a: Record<string, unknown>,\n b: Record<string, unknown>,\n): boolean {\n if (a === b) return true;\n const aKeys = Object.keys(a);\n if (aKeys.length !== Object.keys(b).length) return false;\n for (const key of aKeys) {\n if (!(key in b)) return false;\n if (!Object.is(a[key], b[key])) return false;\n }\n return true;\n}\n\n/**\n * BlaC's lifecycle/identity/dependency layer on top of `StructuralContainer`.\n *\n * StructuralContainer provides:\n * - `state` getter\n * - `emit` / `patch` / `update` (path-tracked, microtask-flushed)\n * - `channel` (the underlying `DirtyChannel`)\n * - `registerConsumerPaths` / `unregisterConsumer` (for fine-grained consumers)\n * - per-class `PathInterner`\n *\n * StateContainer layers on:\n * - identity (`name`, `instanceId`, `createdAt`, `debug`)\n * - lifecycle (`dispose`, `isDisposed`, `onSystemEvent`)\n * - hydration (`beginHydration` / `applyHydratedState` / `finishHydration` / `failHydration` / `waitForHydration`)\n * - cross-bloc deps (`depend()`, `dependencies` getter)\n * - per-consumer deps slices (`APPLY_DEPS` / `REMOVE_DEPS_OWNER` / `onDepsChanged`)\n * - registry integration (config-driven equality, emit-rate circuit breaker)\n *\n * Subscribers can attach via:\n * - `subscribe(listener)` — legacy state listener (back-compat); fires on\n * every flush with the latest state.\n * - `onSystemEvent('stateChanged' | 'dispose' | 'hydrationChanged', cb)` —\n * coarse lifecycle events.\n * - `this.channel.subscribe(interest, cb)` — path-scoped (new code).\n */\nexport abstract class StateContainer<\n S extends object = any,\n Args = void,\n Deps extends object = Record<string, never>,\n> extends StructuralContainer<S> {\n static __excludeFromDevTools = false;\n\n /** @internal phantom — the args type this bloc is constructed with (see init()) */\n declare readonly __args: Args;\n /** @internal phantom — the injected deps type */\n declare readonly __deps: Deps;\n\n // ---------------------------------------------------------------------------\n // Per-consumer deps slices (APPLY_DEPS / REMOVE_DEPS_OWNER)\n //\n // Kept until D0 ports `useBloc` off the adapter surface. See A2 audit:\n // `@blac/react/src/useBloc.ts` calls these via the `@blac/adapter`\n // re-export. EMIT is gone; APPLY_DEPS / REMOVE_DEPS_OWNER stay.\n // ---------------------------------------------------------------------------\n\n private _depsByOwner: Map<string, Partial<Deps>> | null = null;\n private _deps: Partial<Deps> = {};\n\n get deps(): Readonly<Deps> {\n return this._deps as Readonly<Deps>;\n }\n\n /**\n * @internal Apply one owner's (consumer's) deps slice. Shallow-merges the\n * slice, reconciles keys the owner dropped since its last apply (other\n * owners' keys untouched), dev-warns on cross-owner key collisions, then\n * recomputes the merged view and fires onDepsChanged if it changed.\n *\n * Idempotent: re-applying an identical slice for the same owner is a no-op.\n */\n [APPLY_DEPS](ownerId: string, slice: Partial<Deps>): void {\n if (this._disposed) return;\n\n const owners = (this._depsByOwner ??= new Map());\n const prevSlice = owners.get(ownerId);\n\n if (prevSlice && shallowEqualRecord(prevSlice, slice)) {\n return;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n for (const key of Object.keys(slice) as (keyof Deps)[]) {\n for (const [otherOwner, otherSlice] of owners) {\n if (otherOwner === ownerId) continue;\n if (\n key in otherSlice &&\n (otherSlice as Record<keyof Deps, unknown>)[key] !==\n (slice as Record<keyof Deps, unknown>)[key]\n ) {\n console.warn(\n `[${this.name}] multiple owners writing dep \\`${String(\n key,\n )}\\`; last write wins`,\n );\n }\n }\n }\n }\n\n owners.set(ownerId, { ...slice });\n this.reconcileDeps();\n }\n\n /**\n * @internal Withdraw an owner's entire deps slice (consumer unmounted).\n */\n [REMOVE_DEPS_OWNER](ownerId: string): void {\n if (this._disposed) return;\n if (!this._depsByOwner?.delete(ownerId)) return;\n this.reconcileDeps();\n }\n\n private reconcileDeps(): void {\n const prev = this._deps;\n const next: Partial<Deps> = {};\n if (this._depsByOwner) {\n for (const slice of this._depsByOwner.values()) {\n Object.assign(next, slice);\n }\n }\n for (const key of Object.keys(prev) as (keyof Deps)[]) {\n if (!(key in next)) {\n (next as Record<keyof Deps, unknown>)[key] = undefined;\n }\n }\n\n if (shallowEqualRecord(prev, next)) return;\n\n this._deps = next;\n this.onDepsChanged(next as Readonly<Deps>, prev as Readonly<Deps>);\n this._registry.emit(\n 'depsChanged',\n this,\n prev as Readonly<Record<string, unknown>>,\n next as Readonly<Record<string, unknown>>,\n );\n }\n\n protected onDepsChanged(_next: Readonly<Deps>, _prev: Readonly<Deps>): void {}\n\n // ---------------------------------------------------------------------------\n // Identity / lifecycle\n // ---------------------------------------------------------------------------\n\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 _initCalled = false;\n\n // Dev-only emit-rate circuit breaker state (see configureBlac.maxEmitsPerSecond).\n private _emitWindowStart = 0;\n private _emitCount = 0;\n private _emitRateWarned = false;\n\n // Legacy listener-style subscribers (subscribe(listener)). Fires on every\n // channel flush with the latest state. Kept for back-compat with code that\n // hasn't migrated to `channel.subscribe(interest, cb)`.\n private readonly _listeners = new Set<StateListener<S>>();\n\n // System-event handlers (stateChanged | dispose | hydrationChanged).\n private readonly _systemEventHandlers = new Map<\n SystemEvent,\n Set<SystemEventHandler<S, any>>\n >();\n\n // Cross-bloc dependencies recorded by depend(). Map<DepCtor, instanceKey>.\n private _dependencies: Map<StateContainerConstructor, string> | null = null;\n\n // Pending state-change capture; set by emit(), drained by the channel-bridge\n // callback on flush. Coalesced: multiple emits in one tick collapse to one\n // (prev = the first prev, next = the latest next), matching Decision 7.\n private _pendingChange: { prev: S; next: S } | null = null;\n\n // Unsubscribe from the internal bridge that turns channel flushes into\n // legacy listener calls + 'stateChanged' system events.\n private _bridgeUnsub: (() => void) | null = null;\n\n private _registry = getRegistry();\n private _equalityFn: EqualityFn = getBlacConfig().equality;\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\n get dependencies(): ReadonlyMap<StateContainerConstructor, string> {\n return this._dependencies ?? EMPTY_DEPS;\n }\n\n get args(): Args | undefined {\n return this._config.args as Args | undefined;\n }\n\n /**\n * Declare a cross-bloc dependency. Returns a getter so callers write\n * `this.user()` lazily — the dep is resolved against the registry on each\n * call, which keeps the surface immune to dep-instance churn.\n *\n * Note: this does NOT auto-resubscribe to the dep's channel. Consumers that\n * need reactive updates from a dep should subscribe explicitly (typically\n * via the framework adapter / `useBloc`'s tracker). A naive auto-bridge\n * here would cycle on mutual deps; the channel's same-tick coalescing\n * limits the blast radius but a true mutual cycle is still a user bug.\n */\n protected depend<T extends StateContainerConstructor>(\n Type: T,\n args?: ExtractArgs<T>,\n ): () => InstanceType<T> {\n if (!this._dependencies) {\n this._dependencies = new Map();\n }\n const key = this._registry.resolveKey(Type, undefined, args);\n this._dependencies.set(Type, key);\n return () => this._registry.ensure(Type, key, args);\n }\n\n constructor(initialState: S, options?: StructuralContainerOptions) {\n super(initialState, options);\n\n // Bridge channel flushes -> legacy listeners + 'stateChanged' system event.\n // Interest is ALL_PATHS so we wake on every flush. Coalesced via\n // `_pendingChange`: if no emit happened (e.g. a no-op patch), the bridge\n // sees null and skips.\n this._bridgeUnsub = this.channel.subscribe(\n () => ALL_PATHS,\n () => this._drainPending(),\n );\n }\n\n /**\n * Called once after construction with the args passed at acquire time, before the first\n * state snapshot is read by any consumer. Override to seed args-derived state (via\n * this.emit(...)) or kick off loads.\n */\n protected init(_args: Args): void {}\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 const perClass = getClassEquality(\n this.constructor as StateContainerConstructor,\n );\n this._equalityFn = perClass ?? getBlacConfig().equality;\n this._registry.emit('created', this);\n if (!this._initCalled) {\n this._initCalled = true;\n this.init(this._config.args as Args);\n }\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 // ---------------------------------------------------------------------------\n // Subscribe (legacy listener-style) — back-compat.\n //\n // Old surface: subscribe(listener: (state) => void). New code should use\n // `this.channel.subscribe(interest, cb)` directly. This override shadows\n // `StructuralContainer.subscribe`'s richer signature on purpose — only one\n // legacy consumer pattern exists (per A2 audit: tracking/, watch/, adapter).\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 () => {\n this._listeners.delete(listener);\n };\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle: dispose\n // ---------------------------------------------------------------------------\n\n dispose(): void {\n if (this._disposed) return;\n\n if (this.debug) {\n console.log(`[${this.name}] Disposing...`);\n }\n\n // Reconcile to an empty deps view so a final onDepsChanged(next, prev)\n // fires with all keys absent (undefined). After this, APPLY_DEPS /\n // REMOVE_DEPS_OWNER are guarded by _disposed.\n if (this._depsByOwner) {\n this._depsByOwner.clear();\n this.reconcileDeps();\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 // Tear down the channel bridge so we don't leak a subscription.\n this._bridgeUnsub?.();\n this._bridgeUnsub = null;\n\n this._listeners.clear();\n this._systemEventHandlers.clear();\n this._pendingChange = null;\n\n this._registry.emit('disposed', this);\n\n if (this.debug) {\n console.log(`[${this.name}] Disposed successfully`);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Mutation: emit / patch / update.\n //\n // We override `emit` to layer in:\n // - disposed guard\n // - equality-fn short-circuit (consults getBlacConfig().equality or the\n // per-class override via @blac decorator)\n // - emit-rate circuit breaker (dev-only)\n // - `_changedWhileHydrating` flag tracking\n // - registry-level stateChanged notification (microtask-deferred)\n // - pending-change capture so the channel-bridge callback can fire the\n // legacy listeners + 'stateChanged' system event with prev/next.\n //\n // The actual change-detection (path diff, channel mark, single-consumer\n // skip) is delegated to `super.emit`.\n // ---------------------------------------------------------------------------\n\n override emit(next: S): void {\n this.applyState(next, 'default');\n }\n\n /**\n * Override of `StructuralContainer.patch` that routes through the\n * StateContainer concerns: disposed guard, dev-only emit-rate check,\n * `_changedWhileHydrating` flag, pending-change capture (so legacy\n * listeners and `stateChanged` system events see the merged prev/next),\n * and the registry-level `stateChanged` notification. We still call\n * `super.patch` so path-marking semantics (the whole point of patch) are\n * preserved.\n */\n override patch(partial: DeepPartial<S>): void {\n if (this._disposed) {\n throw new Error(`Cannot emit state from disposed container ${this.name}`);\n }\n const partialKeys = Object.keys(partial as object);\n if (partialKeys.length === 0) return;\n\n const prev = this.state;\n\n // Pre-spread skip: if every top-level key in `partial` is already\n // `Object.is`-equal to the current state's value at that key, the\n // merge is a structural no-op — skip entirely. Matches the pre-C0\n // `Cubit.patch` semantics (per-key Object.is short-circuit). This is\n // shallow on purpose; deep no-op detection lives in `super.patch`'s\n // path-diff path which still wakes consumers if anything truly moved.\n let allEqual = true;\n for (const key of partialKeys) {\n if (\n !Object.is(\n (prev as Record<string, unknown>)[key],\n (partial as Record<string, unknown>)[key],\n )\n ) {\n allEqual = false;\n break;\n }\n }\n if (allEqual) return;\n\n if (process.env.NODE_ENV !== 'production') {\n this._checkEmitRate();\n }\n\n super.patch(partial);\n\n const next = this.state;\n if (Object.is(prev, next)) return;\n\n if (this._hydrationStatus === 'hydrating') {\n this._changedWhileHydrating = true;\n }\n\n if (this._pendingChange) {\n this._pendingChange.next = next;\n } else {\n this._pendingChange = { prev, next };\n }\n\n if (this._registry.hasStateChangedListeners) {\n this._registry.notifyStateChanged(this, prev, next);\n }\n }\n\n /**\n * @internal @deprecated Symbol-keyed alias for `emit`. Kept only so legacy\n * in-package tests that index with `[EMIT]` typecheck/run unchanged. C5\n * removes this along with the `EMIT` symbol.\n */\n protected [EMIT](next: S): void {\n this.applyState(next, 'default');\n }\n\n private applyState(next: S, source: 'default' | 'hydration'): void {\n if (this._disposed) {\n throw new Error(`Cannot emit state from disposed container ${this.name}`);\n }\n\n const prev = this.state;\n if (prev === next) return;\n if (this._equalityFn(prev, next)) return;\n\n if (process.env.NODE_ENV !== 'production') {\n this._checkEmitRate();\n }\n\n if (this._hydrationStatus === 'hydrating' && source !== 'hydration') {\n this._changedWhileHydrating = true;\n }\n\n // Coalesce: keep the first prev seen this tick, take the latest next.\n if (this._pendingChange) {\n this._pendingChange.next = next;\n } else {\n this._pendingChange = { prev, next };\n }\n\n super.emit(next);\n\n if (this._registry.hasStateChangedListeners) {\n this._registry.notifyStateChanged(this, prev, next);\n }\n }\n\n /**\n * Called by the channel-bridge subscriber on each flush. Drains the\n * pending change (if any) into legacy listeners and the 'stateChanged'\n * system event. No pending change == flush from a no-op patch == skip.\n */\n private _drainPending(): void {\n const pending = this._pendingChange;\n if (!pending) return;\n this._pendingChange = null;\n\n // Iterate against a fixed-size snapshot so a listener that subscribes a\n // new listener mid-drain does not get the late one called in this flush.\n // (Matches the pre-C0 contract; restored by counting against the size\n // captured at drain entry.) Order matches pre-C0: 'stateChanged' system\n // event fires *before* legacy subscribe() listeners.\n const handlers = this._systemEventHandlers.get('stateChanged');\n if (handlers && handlers.size > 0) {\n const payload = { state: pending.next, previousState: pending.prev };\n let count = 0;\n const size = handlers.size;\n for (const handler of handlers) {\n if (++count > size) break;\n try {\n handler(payload);\n } catch (error) {\n console.error(`[${this.name}] Error in system event handler:`, error);\n }\n }\n }\n\n if (this._listeners.size > 0) {\n const current = this.state;\n let count = 0;\n const size = this._listeners.size;\n for (const listener of this._listeners) {\n if (++count > size) break;\n try {\n listener(current);\n } catch (error) {\n console.error(`[${this.name}] Error in listener:`, error);\n }\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Hydration\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(next: 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(next, '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 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 // ---------------------------------------------------------------------------\n // System events\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 // ---------------------------------------------------------------------------\n // Emit-rate circuit breaker (dev-only)\n // ---------------------------------------------------------------------------\n\n /**\n * Dev-only soft circuit breaker. Counts real state changes in a rolling 1s\n * window and warns once if the rate exceeds `maxEmitsPerSecond` — the\n * signature of a runaway loop (RAF/animation or emit-on-every-commit) pushing\n * high-frequency data through state, which freezes subscribers/plugins.\n */\n private _checkEmitRate(): void {\n const limit = getBlacConfig().maxEmitsPerSecond;\n if (!(limit > 0) || !Number.isFinite(limit) || this._emitRateWarned) return;\n\n const now = Date.now();\n if (now - this._emitWindowStart >= 1000) {\n this._emitWindowStart = now;\n this._emitCount = 1;\n return;\n }\n\n this._emitCount++;\n if (this._emitCount > limit) {\n this._emitRateWarned = true;\n console.warn(\n `[${this.name}] emitted more than ${limit} state changes in under a second. ` +\n `This is usually a runaway loop pushing high-frequency data through state ` +\n `(e.g. \\`emit\\`/\\`patch\\` inside a requestAnimationFrame loop, or an effect ` +\n `that emits on every render). It can freeze the app by saturating ` +\n `subscribers and plugins (logging/devtools). Keep high-frequency work ` +\n `imperative and emit only coarse/throttled state, or raise ` +\n `\\`configureBlac({ maxEmitsPerSecond })\\`. (This warning fires once.)`,\n );\n }\n }\n}\n","import { StateContainer } from './StateContainer';\n\n/**\n * `Cubit<S>` is a `StateContainer<S>` with `emit` / `patch` exposed as\n * public mutation surface. Today it adds nothing structurally beyond\n * `StateContainer` — both are inherited from the underlying\n * `StructuralContainer<S>`. Kept as a real class (not a type alias) because\n * downstream code does `instance instanceof Cubit` checks (see A2 audit).\n *\n * The class body is intentionally empty: a no-op `emit` override would\n * still go through `applyState`, and `patch` is inherited from\n * `StructuralContainer` (path-diffed, microtask-flushed). If a caller\n * needs the old \"skip if no real change\" patch semantics, they can wrap\n * `patch` themselves or call `emit` after a manual equality check.\n */\nexport abstract class Cubit<\n S extends object = any,\n Args = void,\n Deps extends object = Record<string, never>,\n> extends StateContainer<S, Args, Deps> {}\n","import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n} from '../types/utilities';\n\n/**\n * Ensure an instance exists without taking ownership (no ref added). Instance\n * identity is derived purely from `args`, matching `acquire`.\n */\nexport function ensure<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): InstanceType<T> {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.ensure(BlocClass, key, opts?.args);\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { f as getBlacConfig, i as getClassEquality, l as BLAC_DEFAULTS } from "./StateContainerRegistry-DmmzYa7S.js";
2
- import { t as getRegistry } from "./config-DoHx0Xsl.js";
1
+ import { i as getClassEquality, u as getBlacConfig } from "./StateContainerRegistry-B_ViBLvJ.js";
2
+ import { t as getRegistry } from "./config-8pyOC5gv.js";
3
3
  import { ALL_PATHS, StructuralContainer } from "@dirtytalk/structural";
4
4
  //#region src/utils/idGenerator.ts
5
5
  /**
@@ -155,10 +155,11 @@ var StateContainer = class extends StructuralContainer {
155
155
  * here would cycle on mutual deps; the channel's same-tick coalescing
156
156
  * limits the blast radius but a true mutual cycle is still a user bug.
157
157
  */
158
- depend(Type, instanceKey) {
158
+ depend(Type, args) {
159
159
  if (!this._dependencies) this._dependencies = /* @__PURE__ */ new Map();
160
- this._dependencies.set(Type, instanceKey ?? BLAC_DEFAULTS.DEFAULT_INSTANCE_KEY);
161
- return () => this._registry.ensure(Type, instanceKey);
160
+ const key = this._registry.resolveKey(Type, void 0, args);
161
+ this._dependencies.set(Type, key);
162
+ return () => this._registry.ensure(Type, key, args);
162
163
  }
163
164
  constructor(initialState, options) {
164
165
  super(initialState, options);
@@ -476,6 +477,17 @@ var StateContainer = class extends StructuralContainer {
476
477
  */
477
478
  var Cubit = class extends StateContainer {};
478
479
  //#endregion
479
- export { REMOVE_DEPS_OWNER as a, EMIT as i, StateContainer as n, APPLY_DEPS as r, Cubit as t };
480
+ //#region src/registry/ensure.ts
481
+ /**
482
+ * Ensure an instance exists without taking ownership (no ref added). Instance
483
+ * identity is derived purely from `args`, matching `acquire`.
484
+ */
485
+ function ensure(BlocClass, opts) {
486
+ const registry = getRegistry();
487
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
488
+ return registry.ensure(BlocClass, key, opts?.args);
489
+ }
490
+ //#endregion
491
+ export { EMIT as a, APPLY_DEPS as i, Cubit as n, REMOVE_DEPS_OWNER as o, StateContainer as r, ensure as t };
480
492
 
481
- //# sourceMappingURL=Cubit-VJuu2tt9.js.map
493
+ //# sourceMappingURL=ensure-CPMiGvov.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-CPMiGvov.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","/**\n * @internal @deprecated Symbol-keyed mutation entry point on `StateContainer`.\n *\n * Per A2 audit (`plans/blac-core-migration/_audit.md`), this symbol has zero\n * external consumers — only in-package tests still reference it. C0 keeps it\n * as a thin alias for `emit()` so the existing test files typecheck and run\n * unchanged; C5 will port those tests to use `emit()` directly and delete\n * this symbol along with its `[EMIT]` method on `StateContainer`.\n *\n * Do not add new uses of this symbol.\n */\nexport const EMIT = Symbol('blac.emit');\n\n/**\n * @internal Apply one owner's (consumer's) deps slice to an instance.\n * Called by framework adapters (e.g. @blac/react useBloc) — not public API.\n *\n * Kept until D0 ports `useBloc` off the legacy adapter surface. See A2 audit\n * (`plans/blac-core-migration/_audit.md`) for the consumer list.\n */\nexport const APPLY_DEPS = Symbol('blac.applyDeps');\n\n/**\n * @internal Withdraw one owner's entire deps slice (consumer unmounted).\n * Called by framework adapters — not public API.\n *\n * Kept until D0 ports `useBloc`. See A2 audit for the consumer list.\n */\nexport const REMOVE_DEPS_OWNER = Symbol('blac.removeDepsOwner');\n","import {\n ALL_PATHS,\n StructuralContainer,\n type DeepPartial,\n type StructuralContainerOptions,\n} from '@dirtytalk/structural';\nimport { generateSimpleId } from '../utils/idGenerator';\nimport { getRegistry } from '../registry/config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n} from '../types/utilities';\nimport { APPLY_DEPS, EMIT, REMOVE_DEPS_OWNER } from './symbols';\nimport { type EqualityFn, getBlacConfig } from '../config';\nimport { getClassEquality } from '../utils/static-props';\n\nexport interface StateContainerConfig {\n name?: string;\n debug?: boolean;\n instanceId?: string;\n /** Args passed at acquire time; forwarded to init(). */\n args?: unknown;\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\n/**\n * Shallow per-key `Object.is` comparison of two plain records. Keys are\n * considered: a key present in one but not the other (regardless of value)\n * makes the records unequal. Used to detect real deps changes.\n */\nfunction shallowEqualRecord(\n a: Record<string, unknown>,\n b: Record<string, unknown>,\n): boolean {\n if (a === b) return true;\n const aKeys = Object.keys(a);\n if (aKeys.length !== Object.keys(b).length) return false;\n for (const key of aKeys) {\n if (!(key in b)) return false;\n if (!Object.is(a[key], b[key])) return false;\n }\n return true;\n}\n\n/**\n * BlaC's lifecycle/identity/dependency layer on top of `StructuralContainer`.\n *\n * StructuralContainer provides:\n * - `state` getter\n * - `emit` / `patch` / `update` (path-tracked, microtask-flushed)\n * - `channel` (the underlying `DirtyChannel`)\n * - `registerConsumerPaths` / `unregisterConsumer` (for fine-grained consumers)\n * - per-class `PathInterner`\n *\n * StateContainer layers on:\n * - identity (`name`, `instanceId`, `createdAt`, `debug`)\n * - lifecycle (`dispose`, `isDisposed`, `onSystemEvent`)\n * - hydration (`beginHydration` / `applyHydratedState` / `finishHydration` / `failHydration` / `waitForHydration`)\n * - cross-bloc deps (`depend()`, `dependencies` getter)\n * - per-consumer deps slices (`APPLY_DEPS` / `REMOVE_DEPS_OWNER` / `onDepsChanged`)\n * - registry integration (config-driven equality, emit-rate circuit breaker)\n *\n * Subscribers can attach via:\n * - `subscribe(listener)` — legacy state listener (back-compat); fires on\n * every flush with the latest state.\n * - `onSystemEvent('stateChanged' | 'dispose' | 'hydrationChanged', cb)` —\n * coarse lifecycle events.\n * - `this.channel.subscribe(interest, cb)` — path-scoped (new code).\n */\nexport abstract class StateContainer<\n S extends object = any,\n Args = void,\n Deps extends object = Record<string, never>,\n> extends StructuralContainer<S> {\n static __excludeFromDevTools = false;\n\n /** @internal phantom — the args type this bloc is constructed with (see init()) */\n declare readonly __args: Args;\n /** @internal phantom — the injected deps type */\n declare readonly __deps: Deps;\n\n // ---------------------------------------------------------------------------\n // Per-consumer deps slices (APPLY_DEPS / REMOVE_DEPS_OWNER)\n //\n // Kept until D0 ports `useBloc` off the adapter surface. See A2 audit:\n // `@blac/react/src/useBloc.ts` calls these via the `@blac/adapter`\n // re-export. EMIT is gone; APPLY_DEPS / REMOVE_DEPS_OWNER stay.\n // ---------------------------------------------------------------------------\n\n private _depsByOwner: Map<string, Partial<Deps>> | null = null;\n private _deps: Partial<Deps> = {};\n\n get deps(): Readonly<Deps> {\n return this._deps as Readonly<Deps>;\n }\n\n /**\n * @internal Apply one owner's (consumer's) deps slice. Shallow-merges the\n * slice, reconciles keys the owner dropped since its last apply (other\n * owners' keys untouched), dev-warns on cross-owner key collisions, then\n * recomputes the merged view and fires onDepsChanged if it changed.\n *\n * Idempotent: re-applying an identical slice for the same owner is a no-op.\n */\n [APPLY_DEPS](ownerId: string, slice: Partial<Deps>): void {\n if (this._disposed) return;\n\n const owners = (this._depsByOwner ??= new Map());\n const prevSlice = owners.get(ownerId);\n\n if (prevSlice && shallowEqualRecord(prevSlice, slice)) {\n return;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n for (const key of Object.keys(slice) as (keyof Deps)[]) {\n for (const [otherOwner, otherSlice] of owners) {\n if (otherOwner === ownerId) continue;\n if (\n key in otherSlice &&\n (otherSlice as Record<keyof Deps, unknown>)[key] !==\n (slice as Record<keyof Deps, unknown>)[key]\n ) {\n console.warn(\n `[${this.name}] multiple owners writing dep \\`${String(\n key,\n )}\\`; last write wins`,\n );\n }\n }\n }\n }\n\n owners.set(ownerId, { ...slice });\n this.reconcileDeps();\n }\n\n /**\n * @internal Withdraw an owner's entire deps slice (consumer unmounted).\n */\n [REMOVE_DEPS_OWNER](ownerId: string): void {\n if (this._disposed) return;\n if (!this._depsByOwner?.delete(ownerId)) return;\n this.reconcileDeps();\n }\n\n private reconcileDeps(): void {\n const prev = this._deps;\n const next: Partial<Deps> = {};\n if (this._depsByOwner) {\n for (const slice of this._depsByOwner.values()) {\n Object.assign(next, slice);\n }\n }\n for (const key of Object.keys(prev) as (keyof Deps)[]) {\n if (!(key in next)) {\n (next as Record<keyof Deps, unknown>)[key] = undefined;\n }\n }\n\n if (shallowEqualRecord(prev, next)) return;\n\n this._deps = next;\n this.onDepsChanged(next as Readonly<Deps>, prev as Readonly<Deps>);\n this._registry.emit(\n 'depsChanged',\n this,\n prev as Readonly<Record<string, unknown>>,\n next as Readonly<Record<string, unknown>>,\n );\n }\n\n protected onDepsChanged(_next: Readonly<Deps>, _prev: Readonly<Deps>): void {}\n\n // ---------------------------------------------------------------------------\n // Identity / lifecycle\n // ---------------------------------------------------------------------------\n\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 _initCalled = false;\n\n // Dev-only emit-rate circuit breaker state (see configureBlac.maxEmitsPerSecond).\n private _emitWindowStart = 0;\n private _emitCount = 0;\n private _emitRateWarned = false;\n\n // Legacy listener-style subscribers (subscribe(listener)). Fires on every\n // channel flush with the latest state. Kept for back-compat with code that\n // hasn't migrated to `channel.subscribe(interest, cb)`.\n private readonly _listeners = new Set<StateListener<S>>();\n\n // System-event handlers (stateChanged | dispose | hydrationChanged).\n private readonly _systemEventHandlers = new Map<\n SystemEvent,\n Set<SystemEventHandler<S, any>>\n >();\n\n // Cross-bloc dependencies recorded by depend(). Map<DepCtor, instanceKey>.\n private _dependencies: Map<StateContainerConstructor, string> | null = null;\n\n // Pending state-change capture; set by emit(), drained by the channel-bridge\n // callback on flush. Coalesced: multiple emits in one tick collapse to one\n // (prev = the first prev, next = the latest next), matching Decision 7.\n private _pendingChange: { prev: S; next: S } | null = null;\n\n // Unsubscribe from the internal bridge that turns channel flushes into\n // legacy listener calls + 'stateChanged' system events.\n private _bridgeUnsub: (() => void) | null = null;\n\n private _registry = getRegistry();\n private _equalityFn: EqualityFn = getBlacConfig().equality;\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\n get dependencies(): ReadonlyMap<StateContainerConstructor, string> {\n return this._dependencies ?? EMPTY_DEPS;\n }\n\n get args(): Args | undefined {\n return this._config.args as Args | undefined;\n }\n\n /**\n * Declare a cross-bloc dependency. Returns a getter so callers write\n * `this.user()` lazily — the dep is resolved against the registry on each\n * call, which keeps the surface immune to dep-instance churn.\n *\n * Note: this does NOT auto-resubscribe to the dep's channel. Consumers that\n * need reactive updates from a dep should subscribe explicitly (typically\n * via the framework adapter / `useBloc`'s tracker). A naive auto-bridge\n * here would cycle on mutual deps; the channel's same-tick coalescing\n * limits the blast radius but a true mutual cycle is still a user bug.\n */\n protected depend<T extends StateContainerConstructor>(\n Type: T,\n args?: ExtractArgs<T>,\n ): () => InstanceType<T> {\n if (!this._dependencies) {\n this._dependencies = new Map();\n }\n const key = this._registry.resolveKey(Type, undefined, args);\n this._dependencies.set(Type, key);\n return () => this._registry.ensure(Type, key, args);\n }\n\n constructor(initialState: S, options?: StructuralContainerOptions) {\n super(initialState, options);\n\n // Bridge channel flushes -> legacy listeners + 'stateChanged' system event.\n // Interest is ALL_PATHS so we wake on every flush. Coalesced via\n // `_pendingChange`: if no emit happened (e.g. a no-op patch), the bridge\n // sees null and skips.\n this._bridgeUnsub = this.channel.subscribe(\n () => ALL_PATHS,\n () => this._drainPending(),\n );\n }\n\n /**\n * Called once after construction with the args passed at acquire time, before the first\n * state snapshot is read by any consumer. Override to seed args-derived state (via\n * this.emit(...)) or kick off loads.\n */\n protected init(_args: Args): void {}\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 const perClass = getClassEquality(\n this.constructor as StateContainerConstructor,\n );\n this._equalityFn = perClass ?? getBlacConfig().equality;\n this._registry.emit('created', this);\n if (!this._initCalled) {\n this._initCalled = true;\n this.init(this._config.args as Args);\n }\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 // ---------------------------------------------------------------------------\n // Subscribe (legacy listener-style) — back-compat.\n //\n // Old surface: subscribe(listener: (state) => void). New code should use\n // `this.channel.subscribe(interest, cb)` directly. This override shadows\n // `StructuralContainer.subscribe`'s richer signature on purpose — only one\n // legacy consumer pattern exists (per A2 audit: tracking/, watch/, adapter).\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 () => {\n this._listeners.delete(listener);\n };\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle: dispose\n // ---------------------------------------------------------------------------\n\n dispose(): void {\n if (this._disposed) return;\n\n if (this.debug) {\n console.log(`[${this.name}] Disposing...`);\n }\n\n // Reconcile to an empty deps view so a final onDepsChanged(next, prev)\n // fires with all keys absent (undefined). After this, APPLY_DEPS /\n // REMOVE_DEPS_OWNER are guarded by _disposed.\n if (this._depsByOwner) {\n this._depsByOwner.clear();\n this.reconcileDeps();\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 // Tear down the channel bridge so we don't leak a subscription.\n this._bridgeUnsub?.();\n this._bridgeUnsub = null;\n\n this._listeners.clear();\n this._systemEventHandlers.clear();\n this._pendingChange = null;\n\n this._registry.emit('disposed', this);\n\n if (this.debug) {\n console.log(`[${this.name}] Disposed successfully`);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Mutation: emit / patch / update.\n //\n // We override `emit` to layer in:\n // - disposed guard\n // - equality-fn short-circuit (consults getBlacConfig().equality or the\n // per-class override via @blac decorator)\n // - emit-rate circuit breaker (dev-only)\n // - `_changedWhileHydrating` flag tracking\n // - registry-level stateChanged notification (microtask-deferred)\n // - pending-change capture so the channel-bridge callback can fire the\n // legacy listeners + 'stateChanged' system event with prev/next.\n //\n // The actual change-detection (path diff, channel mark, single-consumer\n // skip) is delegated to `super.emit`.\n // ---------------------------------------------------------------------------\n\n override emit(next: S): void {\n this.applyState(next, 'default');\n }\n\n /**\n * Override of `StructuralContainer.patch` that routes through the\n * StateContainer concerns: disposed guard, dev-only emit-rate check,\n * `_changedWhileHydrating` flag, pending-change capture (so legacy\n * listeners and `stateChanged` system events see the merged prev/next),\n * and the registry-level `stateChanged` notification. We still call\n * `super.patch` so path-marking semantics (the whole point of patch) are\n * preserved.\n */\n override patch(partial: DeepPartial<S>): void {\n if (this._disposed) {\n throw new Error(`Cannot emit state from disposed container ${this.name}`);\n }\n const partialKeys = Object.keys(partial as object);\n if (partialKeys.length === 0) return;\n\n const prev = this.state;\n\n // Pre-spread skip: if every top-level key in `partial` is already\n // `Object.is`-equal to the current state's value at that key, the\n // merge is a structural no-op — skip entirely. Matches the pre-C0\n // `Cubit.patch` semantics (per-key Object.is short-circuit). This is\n // shallow on purpose; deep no-op detection lives in `super.patch`'s\n // path-diff path which still wakes consumers if anything truly moved.\n let allEqual = true;\n for (const key of partialKeys) {\n if (\n !Object.is(\n (prev as Record<string, unknown>)[key],\n (partial as Record<string, unknown>)[key],\n )\n ) {\n allEqual = false;\n break;\n }\n }\n if (allEqual) return;\n\n if (process.env.NODE_ENV !== 'production') {\n this._checkEmitRate();\n }\n\n super.patch(partial);\n\n const next = this.state;\n if (Object.is(prev, next)) return;\n\n if (this._hydrationStatus === 'hydrating') {\n this._changedWhileHydrating = true;\n }\n\n if (this._pendingChange) {\n this._pendingChange.next = next;\n } else {\n this._pendingChange = { prev, next };\n }\n\n if (this._registry.hasStateChangedListeners) {\n this._registry.notifyStateChanged(this, prev, next);\n }\n }\n\n /**\n * @internal @deprecated Symbol-keyed alias for `emit`. Kept only so legacy\n * in-package tests that index with `[EMIT]` typecheck/run unchanged. C5\n * removes this along with the `EMIT` symbol.\n */\n protected [EMIT](next: S): void {\n this.applyState(next, 'default');\n }\n\n private applyState(next: S, source: 'default' | 'hydration'): void {\n if (this._disposed) {\n throw new Error(`Cannot emit state from disposed container ${this.name}`);\n }\n\n const prev = this.state;\n if (prev === next) return;\n if (this._equalityFn(prev, next)) return;\n\n if (process.env.NODE_ENV !== 'production') {\n this._checkEmitRate();\n }\n\n if (this._hydrationStatus === 'hydrating' && source !== 'hydration') {\n this._changedWhileHydrating = true;\n }\n\n // Coalesce: keep the first prev seen this tick, take the latest next.\n if (this._pendingChange) {\n this._pendingChange.next = next;\n } else {\n this._pendingChange = { prev, next };\n }\n\n super.emit(next);\n\n if (this._registry.hasStateChangedListeners) {\n this._registry.notifyStateChanged(this, prev, next);\n }\n }\n\n /**\n * Called by the channel-bridge subscriber on each flush. Drains the\n * pending change (if any) into legacy listeners and the 'stateChanged'\n * system event. No pending change == flush from a no-op patch == skip.\n */\n private _drainPending(): void {\n const pending = this._pendingChange;\n if (!pending) return;\n this._pendingChange = null;\n\n // Iterate against a fixed-size snapshot so a listener that subscribes a\n // new listener mid-drain does not get the late one called in this flush.\n // (Matches the pre-C0 contract; restored by counting against the size\n // captured at drain entry.) Order matches pre-C0: 'stateChanged' system\n // event fires *before* legacy subscribe() listeners.\n const handlers = this._systemEventHandlers.get('stateChanged');\n if (handlers && handlers.size > 0) {\n const payload = { state: pending.next, previousState: pending.prev };\n let count = 0;\n const size = handlers.size;\n for (const handler of handlers) {\n if (++count > size) break;\n try {\n handler(payload);\n } catch (error) {\n console.error(`[${this.name}] Error in system event handler:`, error);\n }\n }\n }\n\n if (this._listeners.size > 0) {\n const current = this.state;\n let count = 0;\n const size = this._listeners.size;\n for (const listener of this._listeners) {\n if (++count > size) break;\n try {\n listener(current);\n } catch (error) {\n console.error(`[${this.name}] Error in listener:`, error);\n }\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Hydration\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(next: 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(next, '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 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 // ---------------------------------------------------------------------------\n // System events\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 // ---------------------------------------------------------------------------\n // Emit-rate circuit breaker (dev-only)\n // ---------------------------------------------------------------------------\n\n /**\n * Dev-only soft circuit breaker. Counts real state changes in a rolling 1s\n * window and warns once if the rate exceeds `maxEmitsPerSecond` — the\n * signature of a runaway loop (RAF/animation or emit-on-every-commit) pushing\n * high-frequency data through state, which freezes subscribers/plugins.\n */\n private _checkEmitRate(): void {\n const limit = getBlacConfig().maxEmitsPerSecond;\n if (!(limit > 0) || !Number.isFinite(limit) || this._emitRateWarned) return;\n\n const now = Date.now();\n if (now - this._emitWindowStart >= 1000) {\n this._emitWindowStart = now;\n this._emitCount = 1;\n return;\n }\n\n this._emitCount++;\n if (this._emitCount > limit) {\n this._emitRateWarned = true;\n console.warn(\n `[${this.name}] emitted more than ${limit} state changes in under a second. ` +\n `This is usually a runaway loop pushing high-frequency data through state ` +\n `(e.g. \\`emit\\`/\\`patch\\` inside a requestAnimationFrame loop, or an effect ` +\n `that emits on every render). It can freeze the app by saturating ` +\n `subscribers and plugins (logging/devtools). Keep high-frequency work ` +\n `imperative and emit only coarse/throttled state, or raise ` +\n `\\`configureBlac({ maxEmitsPerSecond })\\`. (This warning fires once.)`,\n );\n }\n }\n}\n","import { StateContainer } from './StateContainer';\n\n/**\n * `Cubit<S>` is a `StateContainer<S>` with `emit` / `patch` exposed as\n * public mutation surface. Today it adds nothing structurally beyond\n * `StateContainer` — both are inherited from the underlying\n * `StructuralContainer<S>`. Kept as a real class (not a type alias) because\n * downstream code does `instance instanceof Cubit` checks (see A2 audit).\n *\n * The class body is intentionally empty: a no-op `emit` override would\n * still go through `applyState`, and `patch` is inherited from\n * `StructuralContainer` (path-diffed, microtask-flushed). If a caller\n * needs the old \"skip if no real change\" patch semantics, they can wrap\n * `patch` themselves or call `emit` after a manual equality check.\n */\nexport abstract class Cubit<\n S extends object = any,\n Args = void,\n Deps extends object = Record<string, never>,\n> extends StateContainer<S, Args, Deps> {}\n","import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n} from '../types/utilities';\n\n/**\n * Ensure an instance exists without taking ownership (no ref added). Instance\n * identity is derived purely from `args`, matching `acquire`.\n */\nexport function ensure<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): InstanceType<T> {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.ensure(BlocClass, key, opts?.args);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAqEA,SAAgB,iBAAiB,QAAgB,OAAwB;CACvE,IAAI,OACF,OAAO,GAAG,OAAO,GAAG;CAItB,OAAO,GAAG,OAAO,GAFC,KAAK,IAEK,EAAE,GADf,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EACjB;AACxC;;;;;;;;;;;;;;ACjEA,MAAa,OAAO,OAAO,WAAW;;;;;;;;AAStC,MAAa,aAAa,OAAO,gBAAgB;;;;;;;AAQjD,MAAa,oBAAoB,OAAO,sBAAsB;;;ACiB9D,MAAM,6BAAoC,IAAI,IAAI;;;;;;AAOlD,SAAS,mBACP,GACA,GACS;CACT,IAAI,MAAM,GAAG,OAAO;CACpB,MAAM,QAAQ,OAAO,KAAK,CAAC;CAC3B,IAAI,MAAM,WAAW,OAAO,KAAK,CAAC,EAAE,QAAQ,OAAO;CACnD,KAAK,MAAM,OAAO,OAAO;EACvB,IAAI,EAAE,OAAO,IAAI,OAAO;EACxB,IAAI,CAAC,OAAO,GAAG,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO;CACzC;CACA,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,IAAsB,iBAAtB,cAIU,oBAAuB;;+BACA;;CAkB/B,IAAI,OAAuB;EACzB,OAAO,KAAK;CACd;;;;;;;;;CAUA,CAAC,YAAY,SAAiB,OAA4B;EACxD,IAAI,KAAK,WAAW;EAEpB,MAAM,SAAU,KAAK,iCAAiB,IAAI,IAAI;EAC9C,MAAM,YAAY,OAAO,IAAI,OAAO;EAEpC,IAAI,aAAa,mBAAmB,WAAW,KAAK,GAClD;EAGF,IAAI,QAAQ,IAAI,aAAa,cAC3B,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GACjC,KAAK,MAAM,CAAC,YAAY,eAAe,QAAQ;GAC7C,IAAI,eAAe,SAAS;GAC5B,IACE,OAAO,cACN,WAA2C,SACzC,MAAsC,MAEzC,QAAQ,KACN,IAAI,KAAK,KAAK,kCAAkC,OAC9C,GACF,EAAE,oBACJ;EAEJ;EAIJ,OAAO,IAAI,SAAS,EAAE,GAAG,MAAM,CAAC;EAChC,KAAK,cAAc;CACrB;;;;CAKA,CAAC,mBAAmB,SAAuB;EACzC,IAAI,KAAK,WAAW;EACpB,IAAI,CAAC,KAAK,cAAc,OAAO,OAAO,GAAG;EACzC,KAAK,cAAc;CACrB;CAEA,gBAA8B;EAC5B,MAAM,OAAO,KAAK;EAClB,MAAM,OAAsB,CAAC;EAC7B,IAAI,KAAK,cACP,KAAK,MAAM,SAAS,KAAK,aAAa,OAAO,GAC3C,OAAO,OAAO,MAAM,KAAK;EAG7B,KAAK,MAAM,OAAO,OAAO,KAAK,IAAI,GAChC,IAAI,EAAE,OAAO,OACX,KAAsC,OAAO,KAAA;EAIjD,IAAI,mBAAmB,MAAM,IAAI,GAAG;EAEpC,KAAK,QAAQ;EACb,KAAK,cAAc,MAAwB,IAAsB;EACjE,KAAK,UAAU,KACb,eACA,MACA,MACA,IACF;CACF;CAEA,cAAwB,OAAuB,OAA6B,CAAC;CAqD7E,IAAI,eAA+D;EACjE,OAAO,KAAK,iBAAiB;CAC/B;CAEA,IAAI,OAAyB;EAC3B,OAAO,KAAK,QAAQ;CACtB;;;;;;;;;;;;CAaA,OACE,MACA,MACuB;EACvB,IAAI,CAAC,KAAK,eACR,KAAK,gCAAgB,IAAI,IAAI;EAE/B,MAAM,MAAM,KAAK,UAAU,WAAW,MAAM,KAAA,GAAW,IAAI;EAC3D,KAAK,cAAc,IAAI,MAAM,GAAG;EAChC,aAAa,KAAK,UAAU,OAAO,MAAM,KAAK,IAAI;CACpD;CAEA,YAAY,cAAiB,SAAsC;EACjE,MAAM,cAAc,OAAO;sBAxK6B;eAC3B,CAAC;mBAwFZ;0BACwB;gCAEX;2BACiB;kCAGf;iBACK,CAAC;qBACnB;0BAGK;oBACN;yBACK;oCAKI,IAAI,IAAsB;8CAGhB,IAAI,IAG1C;uBAGqE;wBAKjB;sBAIV;mBAExB,YAAY;qBACE,cAAc,EAAE;cAEnC,KAAK,YAAY;eACf;oBACI,iBAAiB,KAAK,YAAY,MAAM,MAAM;mBAC/C,KAAK,IAAI;wBAgc3B,OACA,YACiB;GACjB,IAAI,WAAW,KAAK,qBAAqB,IAAI,KAAK;GAClD,IAAI,CAAC,UAAU;IACb,2BAAW,IAAI,IAAI;IACnB,KAAK,qBAAqB,IAAI,OAAO,QAAQ;GAC/C;GACA,SAAS,IAAI,OAAqC;GAElD,aAAa;IACX,UAAU,OAAO,OAAqC;GACxD;EACF;EAraE,KAAK,eAAe,KAAK,QAAQ,gBACzB,iBACA,KAAK,cAAc,CAC3B;CACF;;;;;;CAOA,KAAe,OAAmB,CAAC;CAEnC,WAAW,QAAoC;EAC7C,KAAK,UAAU,EAAE,GAAG,OAAO;EAC3B,KAAK,OAAO,KAAK,QAAQ,QAAQ,KAAK,YAAY;EAClD,KAAK,QAAQ,KAAK,QAAQ,SAAS;EACnC,KAAK,aAAa,iBAChB,KAAK,YAAY,MACjB,KAAK,QAAQ,UACf;EACA,MAAM,WAAW,iBACf,KAAK,WACP;EACA,KAAK,cAAc,YAAY,cAAc,EAAE;EAC/C,KAAK,UAAU,KAAK,WAAW,IAAI;EACnC,IAAI,CAAC,KAAK,aAAa;GACrB,KAAK,cAAc;GACnB,KAAK,KAAK,KAAK,QAAQ,IAAY;EACrC;CACF;CAEA,IAAI,aAAsB;EACxB,OAAO,KAAK;CACd;CAEA,IAAI,kBAAmC;EACrC,OAAO,KAAK;CACd;CAEA,IAAI,iBAAoC;EACtC,OAAO,KAAK;CACd;CAEA,IAAI,aAAsB;EACxB,OAAO,KAAK,qBAAqB;CACnC;CAEA,IAAI,wBAAiC;EACnC,OAAO,KAAK;CACd;CAWA,UAAU,UAAwC;EAChD,IAAI,KAAK,WACP,MAAM,IAAI,MAAM,0CAA0C,KAAK,MAAM;EAEvE,KAAK,WAAW,IAAI,QAAQ;EAC5B,aAAa;GACX,KAAK,WAAW,OAAO,QAAQ;EACjC;CACF;CAMA,UAAgB;EACd,IAAI,KAAK,WAAW;EAEpB,IAAI,KAAK,OACP,QAAQ,IAAI,IAAI,KAAK,KAAK,eAAe;EAM3C,IAAI,KAAK,cAAc;GACrB,KAAK,aAAa,MAAM;GACxB,KAAK,cAAc;EACrB;EAEA,KAAK,YAAY;EAEjB,IAAI,KAAK,qBAAqB,aAC5B,KAAK,8BACH,IAAI,MAAM,+BAA+B,KAAK,KAAK,cAAc,CACnE;EAGF,KAAK,gBAAgB,WAAW,KAAA,CAAiB;EAGjD,KAAK,eAAe;EACpB,KAAK,eAAe;EAEpB,KAAK,WAAW,MAAM;EACtB,KAAK,qBAAqB,MAAM;EAChC,KAAK,iBAAiB;EAEtB,KAAK,UAAU,KAAK,YAAY,IAAI;EAEpC,IAAI,KAAK,OACP,QAAQ,IAAI,IAAI,KAAK,KAAK,wBAAwB;CAEtD;CAmBA,KAAc,MAAe;EAC3B,KAAK,WAAW,MAAM,SAAS;CACjC;;;;;;;;;;CAWA,MAAe,SAA+B;EAC5C,IAAI,KAAK,WACP,MAAM,IAAI,MAAM,6CAA6C,KAAK,MAAM;EAE1E,MAAM,cAAc,OAAO,KAAK,OAAiB;EACjD,IAAI,YAAY,WAAW,GAAG;EAE9B,MAAM,OAAO,KAAK;EAQlB,IAAI,WAAW;EACf,KAAK,MAAM,OAAO,aAChB,IACE,CAAC,OAAO,GACL,KAAiC,MACjC,QAAoC,IACvC,GACA;GACA,WAAW;GACX;EACF;EAEF,IAAI,UAAU;EAEd,IAAI,QAAQ,IAAI,aAAa,cAC3B,KAAK,eAAe;EAGtB,MAAM,MAAM,OAAO;EAEnB,MAAM,OAAO,KAAK;EAClB,IAAI,OAAO,GAAG,MAAM,IAAI,GAAG;EAE3B,IAAI,KAAK,qBAAqB,aAC5B,KAAK,yBAAyB;EAGhC,IAAI,KAAK,gBACP,KAAK,eAAe,OAAO;OAE3B,KAAK,iBAAiB;GAAE;GAAM;EAAK;EAGrC,IAAI,KAAK,UAAU,0BACjB,KAAK,UAAU,mBAAmB,MAAM,MAAM,IAAI;CAEtD;;;;;;CAOA,CAAW,MAAM,MAAe;EAC9B,KAAK,WAAW,MAAM,SAAS;CACjC;CAEA,WAAmB,MAAS,QAAuC;EACjE,IAAI,KAAK,WACP,MAAM,IAAI,MAAM,6CAA6C,KAAK,MAAM;EAG1E,MAAM,OAAO,KAAK;EAClB,IAAI,SAAS,MAAM;EACnB,IAAI,KAAK,YAAY,MAAM,IAAI,GAAG;EAElC,IAAI,QAAQ,IAAI,aAAa,cAC3B,KAAK,eAAe;EAGtB,IAAI,KAAK,qBAAqB,eAAe,WAAW,aACtD,KAAK,yBAAyB;EAIhC,IAAI,KAAK,gBACP,KAAK,eAAe,OAAO;OAE3B,KAAK,iBAAiB;GAAE;GAAM;EAAK;EAGrC,MAAM,KAAK,IAAI;EAEf,IAAI,KAAK,UAAU,0BACjB,KAAK,UAAU,mBAAmB,MAAM,MAAM,IAAI;CAEtD;;;;;;CAOA,gBAA8B;EAC5B,MAAM,UAAU,KAAK;EACrB,IAAI,CAAC,SAAS;EACd,KAAK,iBAAiB;EAOtB,MAAM,WAAW,KAAK,qBAAqB,IAAI,cAAc;EAC7D,IAAI,YAAY,SAAS,OAAO,GAAG;GACjC,MAAM,UAAU;IAAE,OAAO,QAAQ;IAAM,eAAe,QAAQ;GAAK;GACnE,IAAI,QAAQ;GACZ,MAAM,OAAO,SAAS;GACtB,KAAK,MAAM,WAAW,UAAU;IAC9B,IAAI,EAAE,QAAQ,MAAM;IACpB,IAAI;KACF,QAAQ,OAAO;IACjB,SAAS,OAAO;KACd,QAAQ,MAAM,IAAI,KAAK,KAAK,mCAAmC,KAAK;IACtE;GACF;EACF;EAEA,IAAI,KAAK,WAAW,OAAO,GAAG;GAC5B,MAAM,UAAU,KAAK;GACrB,IAAI,QAAQ;GACZ,MAAM,OAAO,KAAK,WAAW;GAC7B,KAAK,MAAM,YAAY,KAAK,YAAY;IACtC,IAAI,EAAE,QAAQ,MAAM;IACpB,IAAI;KACF,SAAS,OAAO;IAClB,SAAS,OAAO;KACd,QAAQ,MAAM,IAAI,KAAK,KAAK,uBAAuB,KAAK;IAC1D;GACF;EACF;CACF;CAMA,iBAAuB;EACrB,IAAI,KAAK,WACP,MAAM,IAAI,MACR,iDAAiD,KAAK,MACxD;EAGF,KAAK,yBAAyB;EAC9B,KAAK,kBAAkB,KAAA;EACvB,KAAK,oBAAoB;EACzB,KAAK,2BAA2B,KAAA;EAChC,KAAK,0BAA0B,KAAA;EAC/B,KAAK,2BAA2B;EAChC,KAAU,uBAAuB;EACjC,KAAK,mBAAmB,WAAW;CACrC;CAEA,mBAAmB,MAAkB;EACnC,IAAI,KAAK,WACP,OAAO;EAGT,IAAI,KAAK,qBAAqB,eAAe,KAAK,wBAChD,OAAO;EAGT,KAAK,WAAW,MAAM,WAAW;EACjC,OAAO;CACT;CAEA,kBAAwB;EACtB,IAAI,KAAK,qBAAqB,aAAa;GACzC,IAAI,KAAK,qBAAqB,YAC5B;GAEF,IAAI,KAAK,qBAAqB,SAC5B,KAAU,uBAAuB;EAErC;EAEA,KAAK,mBAAmB,UAAU;EAClC,KAAK,iBAAiB;CACxB;CAEA,cAAc,OAAoB;EAChC,MAAM,MACJ,iBAAiB,QACb,wBACA,IAAI,MAAM,qBAAqB,OAAO,KAAK,GAAG;EAEpD,KAAK,kBAAkB;EACvB,KAAK,mBAAmB,SAAS,GAAG;EACpC,KAAK,gBAAgB,GAAG;CAC1B;CAEA,mBAAkC;EAChC,IACE,KAAK,qBAAqB,UAC1B,KAAK,qBAAqB,YAE1B,OAAO,QAAQ,QAAQ;EAGzB,IAAI,KAAK,qBAAqB,SAC5B,OAAO,QAAQ,OACb,KAAK,mCACH,IAAI,MAAM,kCAAkC,KAAK,MAAM,CAC3D;EAGF,OAAO,KAAK,uBAAuB;CACrC;CAEA,mBAA2B,QAAyB,OAAqB;EACvE,MAAM,iBAAiB,KAAK;EAC5B,KAAK,mBAAmB;EACxB,KAAK,kBAAkB;EAEvB,KAAK,gBAAgB,oBAAoB;GACvC;GACA;GACA;GACA,uBAAuB,KAAK;EAC9B,CAAC;CACH;CAEA,yBAAgD;EAC9C,IAAI,CAAC,KAAK,qBAAqB,KAAK,0BAA0B;GAC5D,KAAK,2BAA2B;GAChC,KAAK,oBAAoB,IAAI,SAAe,SAAS,WAAW;IAC9D,KAAK,iCAAiC;KACpC,IAAI,KAAK,0BAA0B;KACnC,KAAK,2BAA2B;KAChC,QAAQ;IACV;IACA,KAAK,2BAA2B,UAAiB;KAC/C,IAAI,KAAK,0BAA0B;KACnC,KAAK,2BAA2B;KAChC,OAAO,KAAK;IACd;GACF,CAAC;GACD,KAAK,kBAAkB,YAAY,CAAC,CAAC;EACvC;EAEA,OAAO,KAAK;CACd;CAEA,mBAAiC;EAC/B,KAAK,2BAA2B;CAClC;CAEA,gBAAwB,OAAoB;EAC1C,KAAU,uBAAuB;EACjC,KAAK,0BAA0B,KAAK;CACtC;CAsBA,gBACE,OACA,SACM;EACN,MAAM,WAAW,KAAK,qBAAqB,IAAI,KAAK;EACpD,IAAI,CAAC,UAAU;EAEf,KAAK,MAAM,WAAW,UACpB,IAAI;GACF,QAAQ,OAAO;EACjB,SAAS,OAAO;GACd,QAAQ,MAAM,IAAI,KAAK,KAAK,mCAAmC,KAAK;EACtE;CAEJ;;;;;;;CAYA,iBAA+B;EAC7B,MAAM,QAAQ,cAAc,EAAE;EAC9B,IAAI,EAAE,QAAQ,MAAM,CAAC,OAAO,SAAS,KAAK,KAAK,KAAK,iBAAiB;EAErE,MAAM,MAAM,KAAK,IAAI;EACrB,IAAI,MAAM,KAAK,oBAAoB,KAAM;GACvC,KAAK,mBAAmB;GACxB,KAAK,aAAa;GAClB;EACF;EAEA,KAAK;EACL,IAAI,KAAK,aAAa,OAAO;GAC3B,KAAK,kBAAkB;GACvB,QAAQ,KACN,IAAI,KAAK,KAAK,sBAAsB,MAAM,2bAO5C;EACF;CACF;AACF;;;;;;;;;;;;;;;;ACxuBA,IAAsB,QAAtB,cAIU,eAA8B,CAAC;;;;;;;ACTzC,SAAgB,OACd,WACA,MACiB;CACjB,MAAM,WAAW,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,OAAO,WAAW,KAAK,MAAM,IAAI;AACnD"}
package/dist/index.cjs CHANGED
@@ -1,42 +1,36 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_StateContainerRegistry = require("./StateContainerRegistry-B4yVMYbx.cjs");
3
- const require_Cubit = require("./Cubit-CWP8Ddzx.cjs");
4
- const require_config = require("./config-B_4xXpvK.cjs");
5
- const require_ensure = require("./ensure-BB6xHQAF.cjs");
6
- const require_management = require("./management-DTzcC6aD.cjs");
7
- const require_watch = require("./watch-BpwaUL8r.cjs");
8
- const require_branded = require("./branded-BSeA_mZO.cjs");
2
+ const require_StateContainerRegistry = require("./StateContainerRegistry-FWKzPfS-.cjs");
3
+ const require_ensure = require("./ensure-CLQEx0Nn.cjs");
4
+ const require_config = require("./config-DVMnlHLv.cjs");
5
+ const require_acquire = require("./acquire-DHEOEVcj.cjs");
6
+ const require_management = require("./management-GcnNJjnm.cjs");
7
+ const require_watch = require("./watch-CKWt788i.cjs");
8
+ const require_branded = require("./branded-BybA0_xw.cjs");
9
9
  let _dirtytalk_structural = require("@dirtytalk/structural");
10
- //#region src/registry/acquire.ts
11
- function acquire(BlocClass, instanceKey, refId, args) {
12
- return require_config.getRegistry().acquire(BlocClass, instanceKey, {
13
- canCreate: true,
14
- countRef: true,
15
- refId,
16
- args
17
- });
18
- }
19
- /**
20
- * Resolve the storage key an instance would be acquired under, given an
21
- * (optional) explicit key and construction args. Callers that both acquire and
22
- * release (e.g. `@blac/react` `useBloc`) must use this once and pass the same
23
- * resolved key to both, so the ref is dropped under the key it was taken.
24
- */
25
- function resolveInstanceKey(BlocClass, instanceKey, args) {
26
- return require_config.getRegistry().resolveKey(BlocClass, instanceKey, args);
27
- }
28
- //#endregion
29
10
  //#region src/registry/borrow.ts
30
- function borrow(BlocClass, instanceKey) {
31
- return require_config.getRegistry().borrow(BlocClass, instanceKey);
11
+ function resolveBorrowKey(BlocClass, target) {
12
+ return require_config.getRegistry().resolveKey(BlocClass, void 0, target?.args);
32
13
  }
33
- function borrowSafe(BlocClass, instanceKey) {
34
- return require_config.getRegistry().borrowSafe(BlocClass, instanceKey);
14
+ function borrow(BlocClass, target) {
15
+ return require_config.getRegistry().borrow(BlocClass, resolveBorrowKey(BlocClass, target));
16
+ }
17
+ function borrowSafe(BlocClass, target) {
18
+ return require_config.getRegistry().borrowSafe(BlocClass, resolveBorrowKey(BlocClass, target));
35
19
  }
36
20
  //#endregion
37
21
  //#region src/registry/release.ts
38
- function release(BlocClass, instanceKey, forceDispose = false, refId) {
39
- require_config.getRegistry().release(BlocClass, instanceKey, forceDispose, refId);
22
+ /**
23
+ * Release a reference to an instance. Instance identity is derived purely from
24
+ * `args` (must match the `args` it was acquired with).
25
+ *
26
+ * @param opts.args - Construction/identity args; derives the instance key
27
+ * @param opts.refId - The specific ref to drop; drops one arbitrary ref if omitted
28
+ * @param opts.forceDispose - Force immediate disposal regardless of refs
29
+ */
30
+ function release(BlocClass, opts) {
31
+ const registry = require_config.getRegistry();
32
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
33
+ registry.release(BlocClass, key, opts?.forceDispose ?? false, opts?.refId);
40
34
  }
41
35
  //#endregion
42
36
  //#region src/decorators/blac.ts
@@ -75,14 +69,14 @@ Object.defineProperty(exports, "ALL_PATHS", {
75
69
  return _dirtytalk_structural.ALL_PATHS;
76
70
  }
77
71
  });
78
- exports.APPLY_DEPS = require_Cubit.APPLY_DEPS;
79
- exports.Cubit = require_Cubit.Cubit;
80
- exports.EMIT = require_Cubit.EMIT;
72
+ exports.APPLY_DEPS = require_ensure.APPLY_DEPS;
73
+ exports.Cubit = require_ensure.Cubit;
74
+ exports.EMIT = require_ensure.EMIT;
81
75
  exports.PluginManager = require_StateContainerRegistry.PluginManager;
82
- exports.REMOVE_DEPS_OWNER = require_Cubit.REMOVE_DEPS_OWNER;
83
- exports.StateContainer = require_Cubit.StateContainer;
76
+ exports.REMOVE_DEPS_OWNER = require_ensure.REMOVE_DEPS_OWNER;
77
+ exports.StateContainer = require_ensure.StateContainer;
84
78
  exports.StateContainerRegistry = require_StateContainerRegistry.StateContainerRegistry;
85
- exports.acquire = acquire;
79
+ exports.acquire = require_acquire.acquire;
86
80
  exports.blac = blac;
87
81
  exports.borrow = borrow;
88
82
  exports.borrowSafe = borrowSafe;
@@ -103,12 +97,11 @@ exports.hasInstance = require_management.hasInstance;
103
97
  exports.instance = require_watch.instance;
104
98
  exports.instanceId = require_branded.instanceId;
105
99
  exports.isExcludedFromDevTools = require_StateContainerRegistry.isExcludedFromDevTools;
106
- exports.isIsolatedClass = require_StateContainerRegistry.isIsolatedClass;
107
100
  exports.isKeepAliveClass = require_StateContainerRegistry.isKeepAliveClass;
108
101
  exports.register = require_management.register;
109
102
  exports.release = release;
110
103
  exports.resetBlacConfig = require_StateContainerRegistry.resetBlacConfig;
111
- exports.resolveInstanceKey = resolveInstanceKey;
104
+ exports.resolveInstanceKey = require_acquire.resolveInstanceKey;
112
105
  exports.setRegistry = require_config.setRegistry;
113
106
  exports.shallowEqualState = require_StateContainerRegistry.shallowEqualState;
114
107
  exports.watch = require_watch.watch;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["getRegistry","getRegistry","BLAC_STATIC_PROPS"],"sources":["../src/registry/acquire.ts","../src/registry/borrow.ts","../src/registry/release.ts","../src/decorators/blac.ts"],"sourcesContent":["import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n} from '../types/utilities';\n\nexport function acquire<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n refId?: string,\n args?: ExtractArgs<T>,\n): InstanceType<T> {\n return getRegistry().acquire(BlocClass, instanceKey, {\n canCreate: true,\n countRef: true,\n refId,\n args,\n });\n}\n\n/**\n * Resolve the storage key an instance would be acquired under, given an\n * (optional) explicit key and construction args. Callers that both acquire and\n * release (e.g. `@blac/react` `useBloc`) must use this once and pass the same\n * resolved key to both, so the ref is dropped under the key it was taken.\n */\nexport function resolveInstanceKey<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey: string | undefined,\n args?: ExtractArgs<T>,\n): string {\n return getRegistry().resolveKey(BlocClass, instanceKey, args);\n}\n","import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function borrow<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n): InstanceType<T> {\n return getRegistry().borrow(BlocClass, instanceKey);\n}\n\nexport function borrowSafe<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n):\n | { error: Error; instance: null }\n | { error: null; instance: InstanceType<T> } {\n return getRegistry().borrowSafe(BlocClass, instanceKey);\n}\n","import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function release<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n forceDispose = false,\n refId?: string,\n): void {\n getRegistry().release(BlocClass, instanceKey, forceDispose, refId);\n}\n","import { BLAC_STATIC_PROPS } from '../constants';\nimport type { EqualityFn } from '../config';\n\n/**\n * Configuration options for the @blac decorator.\n * Only one option can be specified at a time (union type).\n */\nexport type BlacOptions =\n /** Mark bloc to never be auto-disposed when ref count reaches 0 */\n | { keepAlive: true }\n /** Exclude bloc from DevTools tracking (prevents infinite loops) */\n | { excludeFromDevTools: true }\n /**\n * Override the global equality check for this bloc.\n * Return `true` to skip the emit (states considered equal).\n */\n | { equality: EqualityFn }\n /**\n * Override the default structural-hash identity key.\n * The function receives `args` and returns the instance key string.\n * Distinct return values → distinct instances; identical values → shared instance.\n * Non-identity fields can be excluded so they don't fork new instances.\n */\n | { key: (args: any) => string };\n\n/**\n * Decorator to configure StateContainer classes.\n *\n * @example Decorator syntax (requires experimentalDecorators or TC39 decorators)\n * ```ts\n * @blac({ keepAlive: true })\n * class AuthBloc extends Cubit<AuthState> {}\n *\n * @blac({ excludeFromDevTools: true })\n * class InternalBloc extends Cubit<InternalState> {}\n * ```\n *\n * @example Function syntax (no decorator support needed)\n * ```ts\n * const AuthBloc = blac({ keepAlive: true })(\n * class extends Cubit<AuthState> {}\n * );\n * ```\n */\nexport function blac(options: BlacOptions) {\n return function <T extends new (...args: any[]) => any>(\n target: T,\n _context?: ClassDecoratorContext,\n ): T {\n if ('keepAlive' in options && options.keepAlive) {\n (target as any)[BLAC_STATIC_PROPS.KEEP_ALIVE] = true;\n }\n if ('excludeFromDevTools' in options && options.excludeFromDevTools) {\n (target as any)[BLAC_STATIC_PROPS.EXCLUDE_FROM_DEVTOOLS] = true;\n }\n if ('equality' in options && typeof options.equality === 'function') {\n (target as any)[BLAC_STATIC_PROPS.EQUALITY] = options.equality;\n }\n if ('key' in options && typeof options.key === 'function') {\n (target as any)[BLAC_STATIC_PROPS.KEY] = options.key;\n }\n return target;\n };\n}\n"],"mappings":";;;;;;;;;;AAMA,SAAgB,QACd,WACA,aACA,OACA,MACiB;CACjB,OAAOA,eAAAA,aAAa,CAAC,QAAQ,WAAW,aAAa;EACnD,WAAW;EACX,UAAU;EACV;EACA;EACD,CAAC;;;;;;;;AASJ,SAAgB,mBACd,WACA,aACA,MACQ;CACR,OAAOA,eAAAA,aAAa,CAAC,WAAW,WAAW,aAAa,KAAK;;;;AC5B/D,SAAgB,OACd,WACA,aACiB;CACjB,OAAOC,eAAAA,aAAa,CAAC,OAAO,WAAW,YAAY;;AAGrD,SAAgB,WACd,WACA,aAG6C;CAC7C,OAAOA,eAAAA,aAAa,CAAC,WAAW,WAAW,YAAY;;;;ACbzD,SAAgB,QACd,WACA,aACA,eAAe,OACf,OACM;CACN,eAAA,aAAa,CAAC,QAAQ,WAAW,aAAa,cAAc,MAAM;;;;;;;;;;;;;;;;;;;;;;;ACmCpE,SAAgB,KAAK,SAAsB;CACzC,OAAO,SACL,QACA,UACG;EACH,IAAI,eAAe,WAAW,QAAQ,WACpC,OAAgBC,+BAAAA,kBAAkB,cAAc;EAElD,IAAI,yBAAyB,WAAW,QAAQ,qBAC9C,OAAgBA,+BAAAA,kBAAkB,yBAAyB;EAE7D,IAAI,cAAc,WAAW,OAAO,QAAQ,aAAa,YACvD,OAAgBA,+BAAAA,kBAAkB,YAAY,QAAQ;EAExD,IAAI,SAAS,WAAW,OAAO,QAAQ,QAAQ,YAC7C,OAAgBA,+BAAAA,kBAAkB,OAAO,QAAQ;EAEnD,OAAO"}
1
+ {"version":3,"file":"index.cjs","names":["getRegistry","getRegistry","BLAC_STATIC_PROPS"],"sources":["../src/registry/borrow.ts","../src/registry/release.ts","../src/decorators/blac.ts"],"sourcesContent":["import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n} from '../types/utilities';\n\n/**\n * How to identify the instance to borrow: the same `args` shape `useBloc`\n * accepts, resolved through the class's `static key(args)` so call sites use\n * the *same* shape they pass to `useBloc` instead of hand-deriving the key.\n *\n * `borrowSafe(ChannelBloc, { args: { channelId } })` and\n * `useBloc(ChannelBloc, { args: { channelId } })` therefore always agree.\n */\nexport type BorrowTarget<T extends StateContainerConstructor> = {\n args?: ExtractArgs<T>;\n};\n\nfunction resolveBorrowKey<T extends StateContainerConstructor>(\n BlocClass: T,\n target: BorrowTarget<T> | undefined,\n): string {\n return getRegistry().resolveKey(BlocClass, undefined, target?.args);\n}\n\nexport function borrow<T extends StateContainerConstructor>(\n BlocClass: T,\n target?: BorrowTarget<T>,\n): InstanceType<T> {\n return getRegistry().borrow(BlocClass, resolveBorrowKey(BlocClass, target));\n}\n\nexport function borrowSafe<T extends StateContainerConstructor>(\n BlocClass: T,\n target?: BorrowTarget<T>,\n):\n | { error: Error; instance: null }\n | { error: null; instance: InstanceType<T> } {\n return getRegistry().borrowSafe(\n BlocClass,\n resolveBorrowKey(BlocClass, target),\n );\n}\n","import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n} from '../types/utilities';\n\n/**\n * Release a reference to an instance. Instance identity is derived purely from\n * `args` (must match the `args` it was acquired with).\n *\n * @param opts.args - Construction/identity args; derives the instance key\n * @param opts.refId - The specific ref to drop; drops one arbitrary ref if omitted\n * @param opts.forceDispose - Force immediate disposal regardless of refs\n */\nexport function release<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T>; refId?: string; forceDispose?: boolean },\n): void {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n registry.release(BlocClass, key, opts?.forceDispose ?? false, opts?.refId);\n}\n","import { BLAC_STATIC_PROPS } from '../constants';\nimport type { EqualityFn } from '../config';\n\n/**\n * Configuration options for the @blac decorator.\n * Only one option can be specified at a time (union type).\n */\nexport type BlacOptions =\n /** Mark bloc to never be auto-disposed when ref count reaches 0 */\n | { keepAlive: true }\n /** Exclude bloc from DevTools tracking (prevents infinite loops) */\n | { excludeFromDevTools: true }\n /**\n * Override the global equality check for this bloc.\n * Return `true` to skip the emit (states considered equal).\n */\n | { equality: EqualityFn }\n /**\n * Override the default structural-hash identity key.\n * The function receives `args` and returns the instance key string.\n * Distinct return values → distinct instances; identical values → shared instance.\n * Non-identity fields can be excluded so they don't fork new instances.\n */\n | { key: (args: any) => string };\n\n/**\n * Decorator to configure StateContainer classes.\n *\n * @example Decorator syntax (requires experimentalDecorators or TC39 decorators)\n * ```ts\n * @blac({ keepAlive: true })\n * class AuthBloc extends Cubit<AuthState> {}\n *\n * @blac({ excludeFromDevTools: true })\n * class InternalBloc extends Cubit<InternalState> {}\n * ```\n *\n * @example Function syntax (no decorator support needed)\n * ```ts\n * const AuthBloc = blac({ keepAlive: true })(\n * class extends Cubit<AuthState> {}\n * );\n * ```\n */\nexport function blac(options: BlacOptions) {\n return function <T extends new (...args: any[]) => any>(\n target: T,\n _context?: ClassDecoratorContext,\n ): T {\n if ('keepAlive' in options && options.keepAlive) {\n (target as any)[BLAC_STATIC_PROPS.KEEP_ALIVE] = true;\n }\n if ('excludeFromDevTools' in options && options.excludeFromDevTools) {\n (target as any)[BLAC_STATIC_PROPS.EXCLUDE_FROM_DEVTOOLS] = true;\n }\n if ('equality' in options && typeof options.equality === 'function') {\n (target as any)[BLAC_STATIC_PROPS.EQUALITY] = options.equality;\n }\n if ('key' in options && typeof options.key === 'function') {\n (target as any)[BLAC_STATIC_PROPS.KEY] = options.key;\n }\n return target;\n };\n}\n"],"mappings":";;;;;;;;;;AAkBA,SAAS,iBACP,WACA,QACQ;CACR,OAAOA,eAAAA,YAAY,EAAE,WAAW,WAAW,KAAA,GAAW,QAAQ,IAAI;AACpE;AAEA,SAAgB,OACd,WACA,QACiB;CACjB,OAAOA,eAAAA,YAAY,EAAE,OAAO,WAAW,iBAAiB,WAAW,MAAM,CAAC;AAC5E;AAEA,SAAgB,WACd,WACA,QAG6C;CAC7C,OAAOA,eAAAA,YAAY,EAAE,WACnB,WACA,iBAAiB,WAAW,MAAM,CACpC;AACF;;;;;;;;;;;AC5BA,SAAgB,QACd,WACA,MACM;CACN,MAAM,WAAWC,eAAAA,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,SAAS,QAAQ,WAAW,KAAK,MAAM,gBAAgB,OAAO,MAAM,KAAK;AAC3E;;;;;;;;;;;;;;;;;;;;;;ACuBA,SAAgB,KAAK,SAAsB;CACzC,OAAO,SACL,QACA,UACG;EACH,IAAI,eAAe,WAAW,QAAQ,WACpC,OAAgBC,+BAAAA,kBAAkB,cAAc;EAElD,IAAI,yBAAyB,WAAW,QAAQ,qBAC9C,OAAgBA,+BAAAA,kBAAkB,yBAAyB;EAE7D,IAAI,cAAc,WAAW,OAAO,QAAQ,aAAa,YACvD,OAAgBA,+BAAAA,kBAAkB,YAAY,QAAQ;EAExD,IAAI,SAAS,WAAW,OAAO,QAAQ,QAAQ,YAC7C,OAAgBA,+BAAAA,kBAAkB,OAAO,QAAQ;EAEnD,OAAO;CACT;AACF"}
package/dist/index.d.cts CHANGED
@@ -14,10 +14,11 @@ export { EMIT, APPLY_DEPS, REMOVE_DEPS_OWNER } from './core/symbols';
14
14
  export { ALL_PATHS } from '@dirtytalk/structural';
15
15
  export type { PathSet } from '@dirtytalk/structural';
16
16
  export { acquire, resolveInstanceKey, borrow, borrowSafe, ensure, release, clear, clearAll, register, hasInstance, getRefCount, getRefIds, getAll, forEach, getRegistry, setRegistry, getStats, } from './registry';
17
+ export type { BorrowTarget } from './registry';
17
18
  export { globalRegistry, StateContainerRegistry, } from './core/StateContainerRegistry';
18
19
  export type { LifecycleEvent, LifecycleListener, InstanceEntry, } from './core/StateContainerRegistry';
19
20
  export { blac, type BlacOptions } from './decorators';
20
- export { isKeepAliveClass, isExcludedFromDevTools, isIsolatedClass, } from './utils/static-props';
21
+ export { isKeepAliveClass, isExcludedFromDevTools } from './utils/static-props';
21
22
  export { getPluginManager } from './core/StateContainerRegistry';
22
23
  export type { BlacPlugin, BlacPluginWithInit, PluginContext, PluginConfig, InstanceMetadata, } from './plugin/BlacPlugin';
23
24
  export { PluginManager } from './plugin/PluginManager';
package/dist/index.d.ts CHANGED
@@ -14,10 +14,11 @@ export { EMIT, APPLY_DEPS, REMOVE_DEPS_OWNER } from './core/symbols';
14
14
  export { ALL_PATHS } from '@dirtytalk/structural';
15
15
  export type { PathSet } from '@dirtytalk/structural';
16
16
  export { acquire, resolveInstanceKey, borrow, borrowSafe, ensure, release, clear, clearAll, register, hasInstance, getRefCount, getRefIds, getAll, forEach, getRegistry, setRegistry, getStats, } from './registry';
17
+ export type { BorrowTarget } from './registry';
17
18
  export { globalRegistry, StateContainerRegistry, } from './core/StateContainerRegistry';
18
19
  export type { LifecycleEvent, LifecycleListener, InstanceEntry, } from './core/StateContainerRegistry';
19
20
  export { blac, type BlacOptions } from './decorators';
20
- export { isKeepAliveClass, isExcludedFromDevTools, isIsolatedClass, } from './utils/static-props';
21
+ export { isKeepAliveClass, isExcludedFromDevTools } from './utils/static-props';
21
22
  export { getPluginManager } from './core/StateContainerRegistry';
22
23
  export type { BlacPlugin, BlacPluginWithInit, PluginContext, PluginConfig, InstanceMetadata, } from './plugin/BlacPlugin';
23
24
  export { PluginManager } from './plugin/PluginManager';
package/dist/index.js CHANGED
@@ -1,41 +1,35 @@
1
- import { a as isExcludedFromDevTools, c as PluginManager, d as configureBlac, f as getBlacConfig, m as shallowEqualState, n as getPluginManager, o as isIsolatedClass, p as resetBlacConfig, r as globalRegistry, s as isKeepAliveClass, t as StateContainerRegistry, u as BLAC_STATIC_PROPS } from "./StateContainerRegistry-DmmzYa7S.js";
2
- import { a as REMOVE_DEPS_OWNER, i as EMIT, n as StateContainer, r as APPLY_DEPS, t as Cubit } from "./Cubit-VJuu2tt9.js";
3
- import { n as getStats, r as setRegistry, t as getRegistry } from "./config-DoHx0Xsl.js";
4
- import { t as ensure } from "./ensure-mkL-3qh8.js";
5
- import { a as getAll, c as hasInstance, i as forEach, n as clearAll, o as getRefCount, r as register, s as getRefIds, t as clear } from "./management-H4m3ciJO.js";
6
- import { n as watch, t as instance } from "./watch-DWCqXllW.js";
7
- import { t as instanceId } from "./branded-DwtzSsg0.js";
1
+ import { a as isExcludedFromDevTools, c as PluginManager, d as resetBlacConfig, f as shallowEqualState, l as configureBlac, n as getPluginManager, o as isKeepAliveClass, r as globalRegistry, s as BLAC_STATIC_PROPS, t as StateContainerRegistry, u as getBlacConfig } from "./StateContainerRegistry-B_ViBLvJ.js";
2
+ import { a as EMIT, i as APPLY_DEPS, n as Cubit, o as REMOVE_DEPS_OWNER, r as StateContainer, t as ensure } from "./ensure-CPMiGvov.js";
3
+ import { n as getStats, r as setRegistry, t as getRegistry } from "./config-8pyOC5gv.js";
4
+ import { n as resolveInstanceKey, t as acquire } from "./acquire-Don7499S.js";
5
+ import { a as getAll, c as hasInstance, i as forEach, n as clearAll, o as getRefCount, r as register, s as getRefIds, t as clear } from "./management-7jLjVHJd.js";
6
+ import { n as watch, t as instance } from "./watch-BmC-Tyqg.js";
7
+ import { t as instanceId } from "./branded-DkbUzncc.js";
8
8
  import { ALL_PATHS } from "@dirtytalk/structural";
9
- //#region src/registry/acquire.ts
10
- function acquire(BlocClass, instanceKey, refId, args) {
11
- return getRegistry().acquire(BlocClass, instanceKey, {
12
- canCreate: true,
13
- countRef: true,
14
- refId,
15
- args
16
- });
17
- }
18
- /**
19
- * Resolve the storage key an instance would be acquired under, given an
20
- * (optional) explicit key and construction args. Callers that both acquire and
21
- * release (e.g. `@blac/react` `useBloc`) must use this once and pass the same
22
- * resolved key to both, so the ref is dropped under the key it was taken.
23
- */
24
- function resolveInstanceKey(BlocClass, instanceKey, args) {
25
- return getRegistry().resolveKey(BlocClass, instanceKey, args);
26
- }
27
- //#endregion
28
9
  //#region src/registry/borrow.ts
29
- function borrow(BlocClass, instanceKey) {
30
- return getRegistry().borrow(BlocClass, instanceKey);
10
+ function resolveBorrowKey(BlocClass, target) {
11
+ return getRegistry().resolveKey(BlocClass, void 0, target?.args);
31
12
  }
32
- function borrowSafe(BlocClass, instanceKey) {
33
- return getRegistry().borrowSafe(BlocClass, instanceKey);
13
+ function borrow(BlocClass, target) {
14
+ return getRegistry().borrow(BlocClass, resolveBorrowKey(BlocClass, target));
15
+ }
16
+ function borrowSafe(BlocClass, target) {
17
+ return getRegistry().borrowSafe(BlocClass, resolveBorrowKey(BlocClass, target));
34
18
  }
35
19
  //#endregion
36
20
  //#region src/registry/release.ts
37
- function release(BlocClass, instanceKey, forceDispose = false, refId) {
38
- getRegistry().release(BlocClass, instanceKey, forceDispose, refId);
21
+ /**
22
+ * Release a reference to an instance. Instance identity is derived purely from
23
+ * `args` (must match the `args` it was acquired with).
24
+ *
25
+ * @param opts.args - Construction/identity args; derives the instance key
26
+ * @param opts.refId - The specific ref to drop; drops one arbitrary ref if omitted
27
+ * @param opts.forceDispose - Force immediate disposal regardless of refs
28
+ */
29
+ function release(BlocClass, opts) {
30
+ const registry = getRegistry();
31
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
32
+ registry.release(BlocClass, key, opts?.forceDispose ?? false, opts?.refId);
39
33
  }
40
34
  //#endregion
41
35
  //#region src/decorators/blac.ts
@@ -68,6 +62,6 @@ function blac(options) {
68
62
  };
69
63
  }
70
64
  //#endregion
71
- export { ALL_PATHS, APPLY_DEPS, Cubit, EMIT, PluginManager, REMOVE_DEPS_OWNER, StateContainer, StateContainerRegistry, acquire, blac, borrow, borrowSafe, clear, clearAll, configureBlac, ensure, forEach, getAll, getBlacConfig, getPluginManager, getRefCount, getRefIds, getRegistry, getStats, globalRegistry, hasInstance, instance, instanceId, isExcludedFromDevTools, isIsolatedClass, isKeepAliveClass, register, release, resetBlacConfig, resolveInstanceKey, setRegistry, shallowEqualState, watch };
65
+ export { ALL_PATHS, APPLY_DEPS, Cubit, EMIT, PluginManager, REMOVE_DEPS_OWNER, StateContainer, StateContainerRegistry, acquire, blac, borrow, borrowSafe, clear, clearAll, configureBlac, ensure, forEach, getAll, getBlacConfig, getPluginManager, getRefCount, getRefIds, getRegistry, getStats, globalRegistry, hasInstance, instance, instanceId, isExcludedFromDevTools, isKeepAliveClass, register, release, resetBlacConfig, resolveInstanceKey, setRegistry, shallowEqualState, watch };
72
66
 
73
67
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/registry/acquire.ts","../src/registry/borrow.ts","../src/registry/release.ts","../src/decorators/blac.ts"],"sourcesContent":["import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n} from '../types/utilities';\n\nexport function acquire<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n refId?: string,\n args?: ExtractArgs<T>,\n): InstanceType<T> {\n return getRegistry().acquire(BlocClass, instanceKey, {\n canCreate: true,\n countRef: true,\n refId,\n args,\n });\n}\n\n/**\n * Resolve the storage key an instance would be acquired under, given an\n * (optional) explicit key and construction args. Callers that both acquire and\n * release (e.g. `@blac/react` `useBloc`) must use this once and pass the same\n * resolved key to both, so the ref is dropped under the key it was taken.\n */\nexport function resolveInstanceKey<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey: string | undefined,\n args?: ExtractArgs<T>,\n): string {\n return getRegistry().resolveKey(BlocClass, instanceKey, args);\n}\n","import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function borrow<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n): InstanceType<T> {\n return getRegistry().borrow(BlocClass, instanceKey);\n}\n\nexport function borrowSafe<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n):\n | { error: Error; instance: null }\n | { error: null; instance: InstanceType<T> } {\n return getRegistry().borrowSafe(BlocClass, instanceKey);\n}\n","import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function release<T extends StateContainerConstructor>(\n BlocClass: T,\n instanceKey?: string,\n forceDispose = false,\n refId?: string,\n): void {\n getRegistry().release(BlocClass, instanceKey, forceDispose, refId);\n}\n","import { BLAC_STATIC_PROPS } from '../constants';\nimport type { EqualityFn } from '../config';\n\n/**\n * Configuration options for the @blac decorator.\n * Only one option can be specified at a time (union type).\n */\nexport type BlacOptions =\n /** Mark bloc to never be auto-disposed when ref count reaches 0 */\n | { keepAlive: true }\n /** Exclude bloc from DevTools tracking (prevents infinite loops) */\n | { excludeFromDevTools: true }\n /**\n * Override the global equality check for this bloc.\n * Return `true` to skip the emit (states considered equal).\n */\n | { equality: EqualityFn }\n /**\n * Override the default structural-hash identity key.\n * The function receives `args` and returns the instance key string.\n * Distinct return values → distinct instances; identical values → shared instance.\n * Non-identity fields can be excluded so they don't fork new instances.\n */\n | { key: (args: any) => string };\n\n/**\n * Decorator to configure StateContainer classes.\n *\n * @example Decorator syntax (requires experimentalDecorators or TC39 decorators)\n * ```ts\n * @blac({ keepAlive: true })\n * class AuthBloc extends Cubit<AuthState> {}\n *\n * @blac({ excludeFromDevTools: true })\n * class InternalBloc extends Cubit<InternalState> {}\n * ```\n *\n * @example Function syntax (no decorator support needed)\n * ```ts\n * const AuthBloc = blac({ keepAlive: true })(\n * class extends Cubit<AuthState> {}\n * );\n * ```\n */\nexport function blac(options: BlacOptions) {\n return function <T extends new (...args: any[]) => any>(\n target: T,\n _context?: ClassDecoratorContext,\n ): T {\n if ('keepAlive' in options && options.keepAlive) {\n (target as any)[BLAC_STATIC_PROPS.KEEP_ALIVE] = true;\n }\n if ('excludeFromDevTools' in options && options.excludeFromDevTools) {\n (target as any)[BLAC_STATIC_PROPS.EXCLUDE_FROM_DEVTOOLS] = true;\n }\n if ('equality' in options && typeof options.equality === 'function') {\n (target as any)[BLAC_STATIC_PROPS.EQUALITY] = options.equality;\n }\n if ('key' in options && typeof options.key === 'function') {\n (target as any)[BLAC_STATIC_PROPS.KEY] = options.key;\n }\n return target;\n };\n}\n"],"mappings":";;;;;;;;;AAMA,SAAgB,QACd,WACA,aACA,OACA,MACiB;CACjB,OAAO,aAAa,CAAC,QAAQ,WAAW,aAAa;EACnD,WAAW;EACX,UAAU;EACV;EACA;EACD,CAAC;;;;;;;;AASJ,SAAgB,mBACd,WACA,aACA,MACQ;CACR,OAAO,aAAa,CAAC,WAAW,WAAW,aAAa,KAAK;;;;AC5B/D,SAAgB,OACd,WACA,aACiB;CACjB,OAAO,aAAa,CAAC,OAAO,WAAW,YAAY;;AAGrD,SAAgB,WACd,WACA,aAG6C;CAC7C,OAAO,aAAa,CAAC,WAAW,WAAW,YAAY;;;;ACbzD,SAAgB,QACd,WACA,aACA,eAAe,OACf,OACM;CACN,aAAa,CAAC,QAAQ,WAAW,aAAa,cAAc,MAAM;;;;;;;;;;;;;;;;;;;;;;;ACmCpE,SAAgB,KAAK,SAAsB;CACzC,OAAO,SACL,QACA,UACG;EACH,IAAI,eAAe,WAAW,QAAQ,WACpC,OAAgB,kBAAkB,cAAc;EAElD,IAAI,yBAAyB,WAAW,QAAQ,qBAC9C,OAAgB,kBAAkB,yBAAyB;EAE7D,IAAI,cAAc,WAAW,OAAO,QAAQ,aAAa,YACvD,OAAgB,kBAAkB,YAAY,QAAQ;EAExD,IAAI,SAAS,WAAW,OAAO,QAAQ,QAAQ,YAC7C,OAAgB,kBAAkB,OAAO,QAAQ;EAEnD,OAAO"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/registry/borrow.ts","../src/registry/release.ts","../src/decorators/blac.ts"],"sourcesContent":["import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n} from '../types/utilities';\n\n/**\n * How to identify the instance to borrow: the same `args` shape `useBloc`\n * accepts, resolved through the class's `static key(args)` so call sites use\n * the *same* shape they pass to `useBloc` instead of hand-deriving the key.\n *\n * `borrowSafe(ChannelBloc, { args: { channelId } })` and\n * `useBloc(ChannelBloc, { args: { channelId } })` therefore always agree.\n */\nexport type BorrowTarget<T extends StateContainerConstructor> = {\n args?: ExtractArgs<T>;\n};\n\nfunction resolveBorrowKey<T extends StateContainerConstructor>(\n BlocClass: T,\n target: BorrowTarget<T> | undefined,\n): string {\n return getRegistry().resolveKey(BlocClass, undefined, target?.args);\n}\n\nexport function borrow<T extends StateContainerConstructor>(\n BlocClass: T,\n target?: BorrowTarget<T>,\n): InstanceType<T> {\n return getRegistry().borrow(BlocClass, resolveBorrowKey(BlocClass, target));\n}\n\nexport function borrowSafe<T extends StateContainerConstructor>(\n BlocClass: T,\n target?: BorrowTarget<T>,\n):\n | { error: Error; instance: null }\n | { error: null; instance: InstanceType<T> } {\n return getRegistry().borrowSafe(\n BlocClass,\n resolveBorrowKey(BlocClass, target),\n );\n}\n","import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n} from '../types/utilities';\n\n/**\n * Release a reference to an instance. Instance identity is derived purely from\n * `args` (must match the `args` it was acquired with).\n *\n * @param opts.args - Construction/identity args; derives the instance key\n * @param opts.refId - The specific ref to drop; drops one arbitrary ref if omitted\n * @param opts.forceDispose - Force immediate disposal regardless of refs\n */\nexport function release<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T>; refId?: string; forceDispose?: boolean },\n): void {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n registry.release(BlocClass, key, opts?.forceDispose ?? false, opts?.refId);\n}\n","import { BLAC_STATIC_PROPS } from '../constants';\nimport type { EqualityFn } from '../config';\n\n/**\n * Configuration options for the @blac decorator.\n * Only one option can be specified at a time (union type).\n */\nexport type BlacOptions =\n /** Mark bloc to never be auto-disposed when ref count reaches 0 */\n | { keepAlive: true }\n /** Exclude bloc from DevTools tracking (prevents infinite loops) */\n | { excludeFromDevTools: true }\n /**\n * Override the global equality check for this bloc.\n * Return `true` to skip the emit (states considered equal).\n */\n | { equality: EqualityFn }\n /**\n * Override the default structural-hash identity key.\n * The function receives `args` and returns the instance key string.\n * Distinct return values → distinct instances; identical values → shared instance.\n * Non-identity fields can be excluded so they don't fork new instances.\n */\n | { key: (args: any) => string };\n\n/**\n * Decorator to configure StateContainer classes.\n *\n * @example Decorator syntax (requires experimentalDecorators or TC39 decorators)\n * ```ts\n * @blac({ keepAlive: true })\n * class AuthBloc extends Cubit<AuthState> {}\n *\n * @blac({ excludeFromDevTools: true })\n * class InternalBloc extends Cubit<InternalState> {}\n * ```\n *\n * @example Function syntax (no decorator support needed)\n * ```ts\n * const AuthBloc = blac({ keepAlive: true })(\n * class extends Cubit<AuthState> {}\n * );\n * ```\n */\nexport function blac(options: BlacOptions) {\n return function <T extends new (...args: any[]) => any>(\n target: T,\n _context?: ClassDecoratorContext,\n ): T {\n if ('keepAlive' in options && options.keepAlive) {\n (target as any)[BLAC_STATIC_PROPS.KEEP_ALIVE] = true;\n }\n if ('excludeFromDevTools' in options && options.excludeFromDevTools) {\n (target as any)[BLAC_STATIC_PROPS.EXCLUDE_FROM_DEVTOOLS] = true;\n }\n if ('equality' in options && typeof options.equality === 'function') {\n (target as any)[BLAC_STATIC_PROPS.EQUALITY] = options.equality;\n }\n if ('key' in options && typeof options.key === 'function') {\n (target as any)[BLAC_STATIC_PROPS.KEY] = options.key;\n }\n return target;\n };\n}\n"],"mappings":";;;;;;;;;AAkBA,SAAS,iBACP,WACA,QACQ;CACR,OAAO,YAAY,EAAE,WAAW,WAAW,KAAA,GAAW,QAAQ,IAAI;AACpE;AAEA,SAAgB,OACd,WACA,QACiB;CACjB,OAAO,YAAY,EAAE,OAAO,WAAW,iBAAiB,WAAW,MAAM,CAAC;AAC5E;AAEA,SAAgB,WACd,WACA,QAG6C;CAC7C,OAAO,YAAY,EAAE,WACnB,WACA,iBAAiB,WAAW,MAAM,CACpC;AACF;;;;;;;;;;;AC5BA,SAAgB,QACd,WACA,MACM;CACN,MAAM,WAAW,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,SAAS,QAAQ,WAAW,KAAK,MAAM,gBAAgB,OAAO,MAAM,KAAK;AAC3E;;;;;;;;;;;;;;;;;;;;;;ACuBA,SAAgB,KAAK,SAAsB;CACzC,OAAO,SACL,QACA,UACG;EACH,IAAI,eAAe,WAAW,QAAQ,WACpC,OAAgB,kBAAkB,cAAc;EAElD,IAAI,yBAAyB,WAAW,QAAQ,qBAC9C,OAAgB,kBAAkB,yBAAyB;EAE7D,IAAI,cAAc,WAAW,OAAO,QAAQ,aAAa,YACvD,OAAgB,kBAAkB,YAAY,QAAQ;EAExD,IAAI,SAAS,WAAW,OAAO,QAAQ,QAAQ,YAC7C,OAAgB,kBAAkB,OAAO,QAAQ;EAEnD,OAAO;CACT;AACF"}
@@ -0,0 +1,38 @@
1
+ import { t as getRegistry } from "./config-8pyOC5gv.js";
2
+ //#region src/registry/queries.ts
3
+ function hasInstance(BlocClass, opts) {
4
+ const registry = getRegistry();
5
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
6
+ return registry.hasInstance(BlocClass, key);
7
+ }
8
+ function getRefCount(BlocClass, opts) {
9
+ const registry = getRegistry();
10
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
11
+ return registry.getRefCount(BlocClass, key);
12
+ }
13
+ function getRefIds(BlocClass, opts) {
14
+ const registry = getRegistry();
15
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
16
+ return registry.getRefIds(BlocClass, key);
17
+ }
18
+ function getAll(BlocClass) {
19
+ return getRegistry().getAll(BlocClass);
20
+ }
21
+ function forEach(BlocClass, callback) {
22
+ getRegistry().forEach(BlocClass, callback);
23
+ }
24
+ //#endregion
25
+ //#region src/registry/management.ts
26
+ function clear(BlocClass) {
27
+ getRegistry().clear(BlocClass);
28
+ }
29
+ function clearAll() {
30
+ getRegistry().clearAll();
31
+ }
32
+ function register(BlocClass) {
33
+ getRegistry().register(BlocClass);
34
+ }
35
+ //#endregion
36
+ export { getAll as a, hasInstance as c, forEach as i, clearAll as n, getRefCount as o, register as r, getRefIds as s, clear as t };
37
+
38
+ //# sourceMappingURL=management-7jLjVHJd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"management-7jLjVHJd.js","names":[],"sources":["../src/registry/queries.ts","../src/registry/management.ts"],"sourcesContent":["import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n InstanceReadonlyState,\n} from '../types/utilities';\n\nexport function hasInstance<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): boolean {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.hasInstance(BlocClass, key);\n}\n\nexport function getRefCount<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): number {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.getRefCount(BlocClass, key);\n}\n\nexport function getRefIds<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): string[] {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.getRefIds(BlocClass, key);\n}\n\nexport function getAll<T extends StateContainerConstructor>(\n BlocClass: T,\n): InstanceReadonlyState<T>[] {\n return getRegistry().getAll(BlocClass);\n}\n\nexport function forEach<T extends StateContainerConstructor>(\n BlocClass: T,\n callback: (instance: InstanceReadonlyState<T>) => void,\n): void {\n getRegistry().forEach(BlocClass, callback);\n}\n","import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function clear<T extends StateContainerConstructor>(BlocClass: T): void {\n getRegistry().clear(BlocClass);\n}\n\nexport function clearAll(): void {\n getRegistry().clearAll();\n}\n\nexport function register<T extends StateContainerConstructor>(\n BlocClass: T,\n): void {\n getRegistry().register(BlocClass);\n}\n"],"mappings":";;AAOA,SAAgB,YACd,WACA,MACS;CACT,MAAM,WAAW,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,YAAY,WAAW,GAAG;AAC5C;AAEA,SAAgB,YACd,WACA,MACQ;CACR,MAAM,WAAW,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,YAAY,WAAW,GAAG;AAC5C;AAEA,SAAgB,UACd,WACA,MACU;CACV,MAAM,WAAW,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,UAAU,WAAW,GAAG;AAC1C;AAEA,SAAgB,OACd,WAC4B;CAC5B,OAAO,YAAY,EAAE,OAAO,SAAS;AACvC;AAEA,SAAgB,QACd,WACA,UACM;CACN,YAAY,EAAE,QAAQ,WAAW,QAAQ;AAC3C;;;AC1CA,SAAgB,MAA2C,WAAoB;CAC7E,YAAY,EAAE,MAAM,SAAS;AAC/B;AAEA,SAAgB,WAAiB;CAC/B,YAAY,EAAE,SAAS;AACzB;AAEA,SAAgB,SACd,WACM;CACN,YAAY,EAAE,SAAS,SAAS;AAClC"}
@@ -1,13 +1,19 @@
1
- const require_config = require("./config-B_4xXpvK.cjs");
1
+ const require_config = require("./config-DVMnlHLv.cjs");
2
2
  //#region src/registry/queries.ts
3
- function hasInstance(BlocClass, instanceKey) {
4
- return require_config.getRegistry().hasInstance(BlocClass, instanceKey);
3
+ function hasInstance(BlocClass, opts) {
4
+ const registry = require_config.getRegistry();
5
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
6
+ return registry.hasInstance(BlocClass, key);
5
7
  }
6
- function getRefCount(BlocClass, instanceKey) {
7
- return require_config.getRegistry().getRefCount(BlocClass, instanceKey);
8
+ function getRefCount(BlocClass, opts) {
9
+ const registry = require_config.getRegistry();
10
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
11
+ return registry.getRefCount(BlocClass, key);
8
12
  }
9
- function getRefIds(BlocClass, instanceKey) {
10
- return require_config.getRegistry().getRefIds(BlocClass, instanceKey);
13
+ function getRefIds(BlocClass, opts) {
14
+ const registry = require_config.getRegistry();
15
+ const key = registry.resolveKey(BlocClass, void 0, opts?.args);
16
+ return registry.getRefIds(BlocClass, key);
11
17
  }
12
18
  function getAll(BlocClass) {
13
19
  return require_config.getRegistry().getAll(BlocClass);
@@ -76,4 +82,4 @@ Object.defineProperty(exports, "register", {
76
82
  }
77
83
  });
78
84
 
79
- //# sourceMappingURL=management-DTzcC6aD.cjs.map
85
+ //# sourceMappingURL=management-GcnNJjnm.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"management-GcnNJjnm.cjs","names":["getRegistry"],"sources":["../src/registry/queries.ts","../src/registry/management.ts"],"sourcesContent":["import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n InstanceReadonlyState,\n} from '../types/utilities';\n\nexport function hasInstance<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): boolean {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.hasInstance(BlocClass, key);\n}\n\nexport function getRefCount<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): number {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.getRefCount(BlocClass, key);\n}\n\nexport function getRefIds<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T> },\n): string[] {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.getRefIds(BlocClass, key);\n}\n\nexport function getAll<T extends StateContainerConstructor>(\n BlocClass: T,\n): InstanceReadonlyState<T>[] {\n return getRegistry().getAll(BlocClass);\n}\n\nexport function forEach<T extends StateContainerConstructor>(\n BlocClass: T,\n callback: (instance: InstanceReadonlyState<T>) => void,\n): void {\n getRegistry().forEach(BlocClass, callback);\n}\n","import { getRegistry } from './config';\nimport type { StateContainerConstructor } from '../types/utilities';\n\nexport function clear<T extends StateContainerConstructor>(BlocClass: T): void {\n getRegistry().clear(BlocClass);\n}\n\nexport function clearAll(): void {\n getRegistry().clearAll();\n}\n\nexport function register<T extends StateContainerConstructor>(\n BlocClass: T,\n): void {\n getRegistry().register(BlocClass);\n}\n"],"mappings":";;AAOA,SAAgB,YACd,WACA,MACS;CACT,MAAM,WAAWA,eAAAA,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,YAAY,WAAW,GAAG;AAC5C;AAEA,SAAgB,YACd,WACA,MACQ;CACR,MAAM,WAAWA,eAAAA,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,YAAY,WAAW,GAAG;AAC5C;AAEA,SAAgB,UACd,WACA,MACU;CACV,MAAM,WAAWA,eAAAA,YAAY;CAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,KAAA,GAAW,MAAM,IAAI;CAChE,OAAO,SAAS,UAAU,WAAW,GAAG;AAC1C;AAEA,SAAgB,OACd,WAC4B;CAC5B,OAAOA,eAAAA,YAAY,EAAE,OAAO,SAAS;AACvC;AAEA,SAAgB,QACd,WACA,UACM;CACN,eAAA,YAAY,EAAE,QAAQ,WAAW,QAAQ;AAC3C;;;AC1CA,SAAgB,MAA2C,WAAoB;CAC7E,eAAA,YAAY,EAAE,MAAM,SAAS;AAC/B;AAEA,SAAgB,WAAiB;CAC/B,eAAA,YAAY,EAAE,SAAS;AACzB;AAEA,SAAgB,SACd,WACM;CACN,eAAA,YAAY,EAAE,SAAS,SAAS;AAClC"}