@blac/core 2.1.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -29
- package/dist/StateContainer-BUyuxKb3.cjs +667 -0
- package/dist/StateContainer-BUyuxKb3.cjs.map +1 -0
- package/dist/StateContainer-B_7UHc3I.js +632 -0
- package/dist/StateContainer-B_7UHc3I.js.map +1 -0
- package/dist/StateContainer-Bh2ipNYj.js +632 -0
- package/dist/StateContainer-Bh2ipNYj.js.map +1 -0
- package/dist/StateContainer-ClzwKnQZ.cjs +667 -0
- package/dist/StateContainer-ClzwKnQZ.cjs.map +1 -0
- package/dist/StateContainer-DiQATvZh.js +632 -0
- package/dist/StateContainer-DiQATvZh.js.map +1 -0
- package/dist/StateContainer-j16zciex.cjs +667 -0
- package/dist/StateContainer-j16zciex.cjs.map +1 -0
- package/dist/{StateContainerRegistry-CSNm2Ws5.cjs → StateContainerRegistry-141uHhtF.cjs} +300 -397
- package/dist/StateContainerRegistry-141uHhtF.cjs.map +1 -0
- package/dist/{StateContainerRegistry-DVIBTxGZ.js → StateContainerRegistry-BH7aOMWV.js} +299 -406
- package/dist/StateContainerRegistry-BH7aOMWV.js.map +1 -0
- package/dist/StateContainerRegistry-BX-DlHXO.js +747 -0
- package/dist/StateContainerRegistry-BX-DlHXO.js.map +1 -0
- package/dist/StateContainerRegistry-Bf5VuVjm.js +747 -0
- package/dist/StateContainerRegistry-Bf5VuVjm.js.map +1 -0
- package/dist/{StateContainerRegistry-Dj77cok9.js → StateContainerRegistry-BsH_s0pJ.js} +303 -413
- package/dist/StateContainerRegistry-BsH_s0pJ.js.map +1 -0
- package/dist/StateContainerRegistry-BvSRfhKv.cjs +866 -0
- package/dist/StateContainerRegistry-BvSRfhKv.cjs.map +1 -0
- package/dist/StateContainerRegistry-C8jxrcqk.cjs +866 -0
- package/dist/StateContainerRegistry-C8jxrcqk.cjs.map +1 -0
- package/dist/{StateContainerRegistry-lIwo-0m3.cjs → StateContainerRegistry-CBLeHObO.cjs} +326 -418
- package/dist/StateContainerRegistry-CBLeHObO.cjs.map +1 -0
- package/dist/StateContainerRegistry-DjQQtlCW.cjs +870 -0
- package/dist/StateContainerRegistry-DjQQtlCW.cjs.map +1 -0
- package/dist/{StateContainerRegistry-D9BIRjwv.cjs → StateContainerRegistry-MkT0W4C2.cjs} +322 -411
- package/dist/StateContainerRegistry-MkT0W4C2.cjs.map +1 -0
- package/dist/StateContainerRegistry-gQbEutkN.js +751 -0
- package/dist/StateContainerRegistry-gQbEutkN.js.map +1 -0
- package/dist/{StateContainerRegistry-CvBOhAT2.js → StateContainerRegistry-vWgsD-RP.js} +277 -392
- package/dist/StateContainerRegistry-vWgsD-RP.js.map +1 -0
- package/dist/config.d.cts +8 -8
- package/dist/config.d.ts +8 -8
- package/dist/constants.d.cts +18 -28
- package/dist/constants.d.ts +18 -28
- package/dist/core/Cubit.d.ts +14 -10
- package/dist/core/StateContainer.d.ts +83 -62
- package/dist/core/StateContainerRegistry.d.ts +87 -166
- package/dist/core/meta.d.ts +34 -47
- package/dist/core/symbols.d.ts +21 -1
- package/dist/decorators/blac.d.ts +31 -28
- package/dist/{acquire-B1LYXSGj.js → ensure-Bi_yXk6f.js} +16 -5
- package/dist/ensure-Bi_yXk6f.js.map +1 -0
- package/dist/{ensure-r1C_7K6_.cjs → ensure-BjhbDW8Z.cjs} +203 -160
- package/dist/ensure-BjhbDW8Z.cjs.map +1 -0
- package/dist/{ensure-BSJHkUNX.js → ensure-BnVyd6s4.js} +297 -122
- package/dist/ensure-BnVyd6s4.js.map +1 -0
- package/dist/{acquire-BZIs6tpN.cjs → ensure-Bx41d-il.cjs} +23 -6
- package/dist/ensure-Bx41d-il.cjs.map +1 -0
- package/dist/{acquire-BRIJVJaA.js → ensure-C7UQ_mKM.js} +16 -5
- package/dist/ensure-C7UQ_mKM.js.map +1 -0
- package/dist/{ensure-B59ri8oo.js → ensure-CneMkpbI.js} +298 -122
- package/dist/ensure-CneMkpbI.js.map +1 -0
- package/dist/{ensure-B2DYCbbI.cjs → ensure-D15vGnk5.cjs} +328 -123
- package/dist/ensure-D15vGnk5.cjs.map +1 -0
- package/dist/{acquire-B1Wuqla6.cjs → ensure-D1D4WjYf.cjs} +23 -6
- package/dist/ensure-D1D4WjYf.cjs.map +1 -0
- package/dist/{ensure-BKdq5xsY.cjs → ensure-D3w6YGp9.cjs} +329 -123
- package/dist/ensure-D3w6YGp9.cjs.map +1 -0
- package/dist/{acquire-BJ3xUEmh.cjs → ensure-DBnuRJ0R.cjs} +23 -6
- package/dist/ensure-DBnuRJ0R.cjs.map +1 -0
- package/dist/{acquire-BdsVZBSe.js → ensure-NTB9nnnj.js} +16 -5
- package/dist/ensure-NTB9nnnj.js.map +1 -0
- package/dist/{ensure-D3WWWwMo.cjs → ensure-ORVw-WRE.cjs} +194 -155
- package/dist/ensure-ORVw-WRE.cjs.map +1 -0
- package/dist/{ensure-BEeY5Ab7.js → ensure-dsqWhIuO.js} +182 -147
- package/dist/ensure-dsqWhIuO.js.map +1 -0
- package/dist/{ensure-11-asM1e.js → ensure-k-6q7O25.js} +173 -150
- package/dist/ensure-k-6q7O25.js.map +1 -0
- package/dist/index.cjs +234 -87
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -13
- package/dist/index.d.ts +5 -13
- package/dist/index.js +211 -52
- package/dist/index.js.map +1 -1
- package/dist/internal.cjs +10 -0
- package/dist/internal.d.cts +8 -0
- package/dist/internal.d.ts +8 -0
- package/dist/internal.js +3 -0
- package/dist/plugin/BlacPlugin.d.ts +22 -24
- package/dist/plugin/PluginManager.d.ts +47 -60
- package/dist/plugins.cjs +383 -3
- package/dist/plugins.cjs.map +1 -0
- package/dist/plugins.d.cts +10 -5
- package/dist/plugins.d.ts +10 -5
- package/dist/plugins.js +381 -1
- package/dist/plugins.js.map +1 -0
- package/dist/registry/acquire.d.ts +2 -2
- package/dist/registry/config.d.ts +12 -0
- package/dist/registry/index.d.ts +1 -1
- package/dist/registry/management.d.ts +3 -0
- package/dist/registry/queries.d.ts +15 -0
- package/dist/registry/release.d.ts +4 -20
- package/dist/testing.cjs +38 -38
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +5 -11
- package/dist/testing.d.ts +5 -11
- package/dist/testing.js +28 -28
- package/dist/testing.js.map +1 -1
- package/dist/types/branded.d.ts +6 -13
- package/dist/types/utilities.d.ts +40 -31
- package/dist/utils/idGenerator.d.ts +6 -13
- package/dist/utils/static-props.d.ts +22 -29
- package/dist/utils/structural-key.d.ts +0 -22
- package/dist/watch/index.d.ts +1 -2
- package/dist/watch/watch.d.ts +17 -3
- package/package.json +28 -54
- package/dist/StateContainerRegistry-4Ljd9EJx.js +0 -1018
- package/dist/StateContainerRegistry-4Ljd9EJx.js.map +0 -1
- package/dist/StateContainerRegistry-8zNFMAf7.js +0 -1067
- package/dist/StateContainerRegistry-8zNFMAf7.js.map +0 -1
- package/dist/StateContainerRegistry-B1GYx9Xo.js +0 -975
- package/dist/StateContainerRegistry-B1GYx9Xo.js.map +0 -1
- package/dist/StateContainerRegistry-B_ViBLvJ.js +0 -975
- package/dist/StateContainerRegistry-B_ViBLvJ.js.map +0 -1
- package/dist/StateContainerRegistry-Bx2ly-ba.cjs +0 -1162
- package/dist/StateContainerRegistry-Bx2ly-ba.cjs.map +0 -1
- package/dist/StateContainerRegistry-C0dCNlTF.js +0 -1005
- package/dist/StateContainerRegistry-C0dCNlTF.js.map +0 -1
- package/dist/StateContainerRegistry-C75QpeaO.cjs +0 -1260
- package/dist/StateContainerRegistry-C75QpeaO.cjs.map +0 -1
- package/dist/StateContainerRegistry-CEWpc1bj.cjs +0 -1113
- package/dist/StateContainerRegistry-CEWpc1bj.cjs.map +0 -1
- package/dist/StateContainerRegistry-CS18y4au.cjs +0 -1163
- package/dist/StateContainerRegistry-CS18y4au.cjs.map +0 -1
- package/dist/StateContainerRegistry-CSNm2Ws5.cjs.map +0 -1
- package/dist/StateContainerRegistry-CchRjnjX.cjs +0 -1094
- package/dist/StateContainerRegistry-CchRjnjX.cjs.map +0 -1
- package/dist/StateContainerRegistry-CvBOhAT2.js.map +0 -1
- package/dist/StateContainerRegistry-D8nu7Z0T.js +0 -1068
- package/dist/StateContainerRegistry-D8nu7Z0T.js.map +0 -1
- package/dist/StateContainerRegistry-D9BIRjwv.cjs.map +0 -1
- package/dist/StateContainerRegistry-DJQqLrli.cjs +0 -1046
- package/dist/StateContainerRegistry-DJQqLrli.cjs.map +0 -1
- package/dist/StateContainerRegistry-DL5Ai7wh.js +0 -1153
- package/dist/StateContainerRegistry-DL5Ai7wh.js.map +0 -1
- package/dist/StateContainerRegistry-DVIBTxGZ.js.map +0 -1
- package/dist/StateContainerRegistry-DWOzx7Gd.js +0 -1154
- package/dist/StateContainerRegistry-DWOzx7Gd.js.map +0 -1
- package/dist/StateContainerRegistry-Dj77cok9.js.map +0 -1
- package/dist/StateContainerRegistry-FWKzPfS-.cjs +0 -1046
- package/dist/StateContainerRegistry-FWKzPfS-.cjs.map +0 -1
- package/dist/StateContainerRegistry-G81GcCRm.cjs +0 -1261
- package/dist/StateContainerRegistry-G81GcCRm.cjs.map +0 -1
- package/dist/StateContainerRegistry-lIwo-0m3.cjs.map +0 -1
- package/dist/acquire-B1LYXSGj.js.map +0 -1
- package/dist/acquire-B1Wuqla6.cjs.map +0 -1
- package/dist/acquire-BJ3xUEmh.cjs.map +0 -1
- package/dist/acquire-BP-ZfUH2.js +0 -35
- package/dist/acquire-BP-ZfUH2.js.map +0 -1
- package/dist/acquire-BRIJVJaA.js.map +0 -1
- package/dist/acquire-BZIs6tpN.cjs.map +0 -1
- package/dist/acquire-B_p1fNEh.cjs +0 -46
- package/dist/acquire-B_p1fNEh.cjs.map +0 -1
- package/dist/acquire-BdsVZBSe.js.map +0 -1
- package/dist/acquire-C3nOb3XR.cjs +0 -46
- package/dist/acquire-C3nOb3XR.cjs.map +0 -1
- package/dist/acquire-C4WAS13G.cjs +0 -46
- package/dist/acquire-C4WAS13G.cjs.map +0 -1
- package/dist/acquire-C7beGI55.cjs +0 -46
- package/dist/acquire-C7beGI55.cjs.map +0 -1
- package/dist/acquire-CE0uq0Dx.cjs +0 -46
- package/dist/acquire-CE0uq0Dx.cjs.map +0 -1
- package/dist/acquire-CU0u8BMn.js +0 -35
- package/dist/acquire-CU0u8BMn.js.map +0 -1
- package/dist/acquire-CbMz7gWs.cjs +0 -46
- package/dist/acquire-CbMz7gWs.cjs.map +0 -1
- package/dist/acquire-CkgLJ8WL.cjs +0 -46
- package/dist/acquire-CkgLJ8WL.cjs.map +0 -1
- package/dist/acquire-CwB083au.js +0 -35
- package/dist/acquire-CwB083au.js.map +0 -1
- package/dist/acquire-DHEOEVcj.cjs +0 -46
- package/dist/acquire-DHEOEVcj.cjs.map +0 -1
- package/dist/acquire-DTvfYJ0y.js +0 -35
- package/dist/acquire-DTvfYJ0y.js.map +0 -1
- package/dist/acquire-DXEQDZGr.js +0 -35
- package/dist/acquire-DXEQDZGr.js.map +0 -1
- package/dist/acquire-Dg-uXwjF.js +0 -35
- package/dist/acquire-Dg-uXwjF.js.map +0 -1
- package/dist/acquire-Don7499S.js +0 -35
- package/dist/acquire-Don7499S.js.map +0 -1
- package/dist/acquire-G8aB3GAx.js +0 -35
- package/dist/acquire-G8aB3GAx.js.map +0 -1
- package/dist/branded-BybA0_xw.cjs +0 -18
- package/dist/branded-BybA0_xw.cjs.map +0 -1
- package/dist/branded-DkbUzncc.js +0 -13
- package/dist/branded-DkbUzncc.js.map +0 -1
- package/dist/config-8pyOC5gv.js +0 -16
- package/dist/config-8pyOC5gv.js.map +0 -1
- package/dist/config-B1l8ZGlU.cjs +0 -32
- package/dist/config-B1l8ZGlU.cjs.map +0 -1
- package/dist/config-C1T6Jw7n.cjs +0 -32
- package/dist/config-C1T6Jw7n.cjs.map +0 -1
- package/dist/config-C7Ktkjh2.cjs +0 -32
- package/dist/config-C7Ktkjh2.cjs.map +0 -1
- package/dist/config-COT4Xkbc.js +0 -16
- package/dist/config-COT4Xkbc.js.map +0 -1
- package/dist/config-CzcoAvBo.js +0 -16
- package/dist/config-CzcoAvBo.js.map +0 -1
- package/dist/config-D2A8ZYRM.js +0 -16
- package/dist/config-D2A8ZYRM.js.map +0 -1
- package/dist/config-D34BkraU.cjs +0 -32
- package/dist/config-D34BkraU.cjs.map +0 -1
- package/dist/config-D6BoWWPv.js +0 -16
- package/dist/config-D6BoWWPv.js.map +0 -1
- package/dist/config-DOO82lbZ.js +0 -16
- package/dist/config-DOO82lbZ.js.map +0 -1
- package/dist/config-DVM_ESQt.js +0 -16
- package/dist/config-DVM_ESQt.js.map +0 -1
- package/dist/config-DVMnlHLv.cjs +0 -32
- package/dist/config-DVMnlHLv.cjs.map +0 -1
- package/dist/config-DWUq7zEQ.cjs +0 -32
- package/dist/config-DWUq7zEQ.cjs.map +0 -1
- package/dist/config-DXI3kzmA.js +0 -16
- package/dist/config-DXI3kzmA.js.map +0 -1
- package/dist/config-Dk1FxfXj.js +0 -16
- package/dist/config-Dk1FxfXj.js.map +0 -1
- package/dist/config-ZVy_yFZ3.js +0 -16
- package/dist/config-ZVy_yFZ3.js.map +0 -1
- package/dist/config-b2z51Y_C.cjs +0 -32
- package/dist/config-b2z51Y_C.cjs.map +0 -1
- package/dist/config-buwpT7l3.js +0 -16
- package/dist/config-buwpT7l3.js.map +0 -1
- package/dist/config-cwaTn5oy.cjs +0 -32
- package/dist/config-cwaTn5oy.cjs.map +0 -1
- package/dist/config-d9_U58ef.cjs +0 -32
- package/dist/config-d9_U58ef.cjs.map +0 -1
- package/dist/config-hWTayX76.cjs +0 -32
- package/dist/config-hWTayX76.cjs.map +0 -1
- package/dist/config-sCPKPYxZ.cjs +0 -32
- package/dist/config-sCPKPYxZ.cjs.map +0 -1
- package/dist/debug.cjs +0 -14
- package/dist/debug.d.cts +0 -34
- package/dist/debug.d.ts +0 -34
- package/dist/debug.js +0 -4
- package/dist/ensure-11-asM1e.js.map +0 -1
- package/dist/ensure-B1dEDsZV.cjs +0 -559
- package/dist/ensure-B1dEDsZV.cjs.map +0 -1
- package/dist/ensure-B2DYCbbI.cjs.map +0 -1
- package/dist/ensure-B59ri8oo.js.map +0 -1
- package/dist/ensure-B9oOqpOB.cjs +0 -558
- package/dist/ensure-B9oOqpOB.cjs.map +0 -1
- package/dist/ensure-BEeY5Ab7.js.map +0 -1
- package/dist/ensure-BKdq5xsY.cjs.map +0 -1
- package/dist/ensure-BSJHkUNX.js.map +0 -1
- package/dist/ensure-BfYnvAsI.js +0 -709
- package/dist/ensure-BfYnvAsI.js.map +0 -1
- package/dist/ensure-Bm91o37h.js +0 -536
- package/dist/ensure-Bm91o37h.js.map +0 -1
- package/dist/ensure-C1a8IFWy.js +0 -535
- package/dist/ensure-C1a8IFWy.js.map +0 -1
- package/dist/ensure-CLQEx0Nn.cjs +0 -528
- package/dist/ensure-CLQEx0Nn.cjs.map +0 -1
- package/dist/ensure-CPMiGvov.js +0 -493
- package/dist/ensure-CPMiGvov.js.map +0 -1
- package/dist/ensure-CQimeD0I.cjs +0 -559
- package/dist/ensure-CQimeD0I.cjs.map +0 -1
- package/dist/ensure-D3WWWwMo.cjs.map +0 -1
- package/dist/ensure-DEXSmA-N.js +0 -526
- package/dist/ensure-DEXSmA-N.js.map +0 -1
- package/dist/ensure-DTTTd2h8.js +0 -536
- package/dist/ensure-DTTTd2h8.js.map +0 -1
- package/dist/ensure-Dx86f80B.cjs +0 -567
- package/dist/ensure-Dx86f80B.cjs.map +0 -1
- package/dist/ensure-DzqGej43.js +0 -526
- package/dist/ensure-DzqGej43.js.map +0 -1
- package/dist/ensure-VuiNPccZ.cjs +0 -559
- package/dist/ensure-VuiNPccZ.cjs.map +0 -1
- package/dist/ensure-_Oh8XPm4.cjs +0 -732
- package/dist/ensure-_Oh8XPm4.cjs.map +0 -1
- package/dist/ensure-fsQMjaQL.cjs +0 -567
- package/dist/ensure-fsQMjaQL.cjs.map +0 -1
- package/dist/ensure-r1C_7K6_.cjs.map +0 -1
- package/dist/ensure-vxAGa2v3.js +0 -536
- package/dist/ensure-vxAGa2v3.js.map +0 -1
- package/dist/events.d.cts +0 -42
- package/dist/events.d.ts +0 -42
- package/dist/management-14vsHr4t.cjs +0 -85
- package/dist/management-14vsHr4t.cjs.map +0 -1
- package/dist/management-444tdCBG.js +0 -38
- package/dist/management-444tdCBG.js.map +0 -1
- package/dist/management-7jLjVHJd.js +0 -38
- package/dist/management-7jLjVHJd.js.map +0 -1
- package/dist/management-8x1OVMi6.js +0 -38
- package/dist/management-8x1OVMi6.js.map +0 -1
- package/dist/management-AFuqQEwz.js +0 -38
- package/dist/management-AFuqQEwz.js.map +0 -1
- package/dist/management-BZgsi29F.js +0 -38
- package/dist/management-BZgsi29F.js.map +0 -1
- package/dist/management-BodVLAfJ.cjs +0 -85
- package/dist/management-BodVLAfJ.cjs.map +0 -1
- package/dist/management-BqGBdL01.js +0 -38
- package/dist/management-BqGBdL01.js.map +0 -1
- package/dist/management-BvUAjril.js +0 -38
- package/dist/management-BvUAjril.js.map +0 -1
- package/dist/management-C-WGcwPD.js +0 -38
- package/dist/management-C-WGcwPD.js.map +0 -1
- package/dist/management-C2wv4vGS.cjs +0 -85
- package/dist/management-C2wv4vGS.cjs.map +0 -1
- package/dist/management-D2pjr38g.js +0 -38
- package/dist/management-D2pjr38g.js.map +0 -1
- package/dist/management-D5WsZoTV.js +0 -38
- package/dist/management-D5WsZoTV.js.map +0 -1
- package/dist/management-DAV9sN-k.cjs +0 -85
- package/dist/management-DAV9sN-k.cjs.map +0 -1
- package/dist/management-Df7Y2sF1.cjs +0 -85
- package/dist/management-Df7Y2sF1.cjs.map +0 -1
- package/dist/management-Dg2SxUb6.cjs +0 -85
- package/dist/management-Dg2SxUb6.cjs.map +0 -1
- package/dist/management-DwO0nBzL.cjs +0 -85
- package/dist/management-DwO0nBzL.cjs.map +0 -1
- package/dist/management-GcnNJjnm.cjs +0 -85
- package/dist/management-GcnNJjnm.cjs.map +0 -1
- package/dist/management-P_Vi_cvw.js +0 -38
- package/dist/management-P_Vi_cvw.js.map +0 -1
- package/dist/management-QWLpbXlW.cjs +0 -85
- package/dist/management-QWLpbXlW.cjs.map +0 -1
- package/dist/management-hkY13log.cjs +0 -85
- package/dist/management-hkY13log.cjs.map +0 -1
- package/dist/management-iE4x6IQY.cjs +0 -85
- package/dist/management-iE4x6IQY.cjs.map +0 -1
- package/dist/types.cjs +0 -3
- package/dist/types.d.cts +0 -8
- package/dist/types.d.ts +0 -8
- package/dist/types.js +0 -2
- package/dist/watch/observe.d.ts +0 -13
- package/dist/watch-B0pUfh-v.cjs +0 -119
- package/dist/watch-B0pUfh-v.cjs.map +0 -1
- package/dist/watch-B91opmva.cjs +0 -70
- package/dist/watch-B91opmva.cjs.map +0 -1
- package/dist/watch-BDiwCPmb.js +0 -108
- package/dist/watch-BDiwCPmb.js.map +0 -1
- package/dist/watch-BHfCtbn1.cjs +0 -119
- package/dist/watch-BHfCtbn1.cjs.map +0 -1
- package/dist/watch-BW7gYiDf.js +0 -108
- package/dist/watch-BW7gYiDf.js.map +0 -1
- package/dist/watch-BmC-Tyqg.js +0 -59
- package/dist/watch-BmC-Tyqg.js.map +0 -1
- package/dist/watch-Bx0y-Kcc.js +0 -108
- package/dist/watch-Bx0y-Kcc.js.map +0 -1
- package/dist/watch-CKWt788i.cjs +0 -70
- package/dist/watch-CKWt788i.cjs.map +0 -1
- package/dist/watch-CfrSSrRY.js +0 -59
- package/dist/watch-CfrSSrRY.js.map +0 -1
- package/dist/watch-Cnh3PtQA.cjs +0 -70
- package/dist/watch-Cnh3PtQA.cjs.map +0 -1
- package/dist/watch-D01MdwKy.js +0 -108
- package/dist/watch-D01MdwKy.js.map +0 -1
- package/dist/watch-D8hwbFU1.js +0 -59
- package/dist/watch-D8hwbFU1.js.map +0 -1
- package/dist/watch-DPVUwPUY.js +0 -59
- package/dist/watch-DPVUwPUY.js.map +0 -1
- package/dist/watch-DVmvZBMD.cjs +0 -70
- package/dist/watch-DVmvZBMD.cjs.map +0 -1
- package/dist/watch-DkDGmGAx.cjs +0 -119
- package/dist/watch-DkDGmGAx.cjs.map +0 -1
- package/dist/watch-DttHqefn.js +0 -108
- package/dist/watch-DttHqefn.js.map +0 -1
- package/dist/watch-DxdIZjpt.cjs +0 -119
- package/dist/watch-DxdIZjpt.cjs.map +0 -1
- package/dist/watch-DztcJuUy.cjs +0 -119
- package/dist/watch-DztcJuUy.cjs.map +0 -1
- package/dist/watch-IrR8G28N.js +0 -108
- package/dist/watch-IrR8G28N.js.map +0 -1
- package/dist/watch-aoNLQAXp.cjs +0 -119
- package/dist/watch-aoNLQAXp.cjs.map +0 -1
- package/dist/watch-entry.cjs +0 -4
- package/dist/watch-entry.d.cts +0 -24
- package/dist/watch-entry.d.ts +0 -24
- package/dist/watch-entry.js +0 -2
- package/dist/watch-hx0r92Zc.js +0 -108
- package/dist/watch-hx0r92Zc.js.map +0 -1
- package/dist/watch-lEco5Tbl.cjs +0 -119
- package/dist/watch-lEco5Tbl.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-k-6q7O25.js","names":[],"sources":["../src/utils/idGenerator.ts","../src/registry/config.ts","../src/core/meta.ts","../src/core/StateContainer.ts","../src/core/Cubit.ts","../src/registry/acquire.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/**\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","import {\n globalRegistry,\n StateContainerRegistry,\n} from '../core/StateContainerRegistry';\n\nlet _registry = globalRegistry;\n\n/**\n * @public\n */\nexport function getRegistry(): StateContainerRegistry {\n return _registry;\n}\n\n/**\n * @public\n */\nexport function setRegistry(registry: StateContainerRegistry): void {\n _registry = registry;\n}\n\n/**\n * @public\n */\nexport function getStats(): {\n registeredTypes: number;\n totalInstances: number;\n typeBreakdown: Record<string, number>;\n} {\n return _registry.getStats();\n}\n","/**\n * `$blac` meta namespace for `StateContainer`.\n *\n * Getters/methods here close over the *real* container instance captured at\n * `createMeta` time rather than reading a `this`-receiver. `buildTrackedProxy`\n * no longer uses a `this`-Proxy (getters run with `this` = the real instance),\n * so ES `#private` is safe here now; the closure style is kept because it also\n * keeps this own, frozen property independent of the proxy entirely.\n */\n\nimport type { HydrationStatus } from './StateContainer';\nimport type { StateContainerConstructor } from '../types/utilities';\n\n/**\n * Hydration sub-surface of {@link BlacMeta}. Exposes the container's\n * hydration state machine — the `begin`/`apply`/`finish`/`fail`/`wait`\n * methods and the `status`/`error`/`isHydrated`/`changedWhileHydrating`\n * getters — namespaced under `$blac`.\n */\nexport interface BlacHydration<S extends object> {\n readonly status: HydrationStatus;\n readonly error: Error | undefined;\n readonly isHydrated: boolean;\n readonly changedWhileHydrating: boolean;\n begin(): void;\n apply(next: S): boolean;\n finish(): void;\n fail(error: Error): void;\n wait(): Promise<void>;\n}\n\n/**\n * The reserved `$blac` instance member on every `StateContainer`. Gathers the\n * container's identity/lifecycle/hydration surface (`name`, `id`, `debug`,\n * `createdAt`, `disposed`, `dependencies`, and the hydration methods) under one\n * namespace, keeping the generic names free for userland blocs.\n *\n * The object is allocated once per container, frozen, branded, and exposes\n * live getters that read the container's current `_`-private fields — values\n * are never snapshotted.\n */\nexport interface BlacMeta<S extends object = any> {\n readonly name: string;\n readonly id: string;\n readonly debug: boolean;\n readonly createdAt: number;\n readonly disposed: boolean;\n readonly dependencies: ReadonlyMap<StateContainerConstructor, string>;\n readonly hydration: BlacHydration<S>;\n}\n\n/**\n * Non-enumerable brand carried on every `$blac` object produced by\n * {@link createMeta}. Used by the clobber guard in `StateContainer` to detect\n * a subclass class-field shadowing the base's own `$blac` property, and by the\n * meta tests. Intentionally NOT re-exported from the package barrel.\n */\nexport const META_BRAND = Symbol('blac.meta');\n\nconst EMPTY_DEPS: ReadonlyMap<StateContainerConstructor, string> = new Map();\n\n/**\n * Narrow view of the parts of `StateContainer` the meta getters read. The\n * container's fields are TS-private (compile-time only), so they are not\n * reachable cross-module by name; `createMeta` performs a single internal cast\n * to this shape. This is purely a typing bridge — zero runtime indirection.\n *\n * The `$blac.hydration` surface delegates to these `_`-private methods, so the\n * container has a single source of truth for the hydration state machine.\n */\ninterface MetaInternals<S extends object> {\n _name: string;\n _instanceId: string;\n _debug: boolean;\n _createdAt: number;\n _disposed: boolean;\n _hydrationStatus: HydrationStatus;\n _hydrationError: Error | undefined;\n _changedWhileHydrating: boolean;\n _dependencies: Map<StateContainerConstructor, string> | null;\n _beginHydration(): void;\n _applyHydratedState(next: S): boolean;\n _finishHydration(): void;\n _failHydration(error: Error): void;\n _waitForHydration(): Promise<void>;\n}\n\n/**\n * Build the frozen, branded `$blac` meta object for a container.\n *\n * Called from a `StateContainer` field initializer (`$blac = createMeta(this)`).\n * Only the back-reference is captured at this point; every getter/method reads\n * the container's `_`-private fields lazily on access, so field-initializer\n * ordering relative to those private fields is irrelevant.\n *\n * The getters close over `container` (the real instance), never over a\n * `this`-receiver — this is what keeps `$blac` reads safe through\n * `buildTrackedProxy`.\n */\nexport function createMeta<S extends object>(container: object): BlacMeta<S> {\n const c = container as unknown as MetaInternals<S>;\n\n const hydration: BlacHydration<S> = Object.freeze({\n get status() {\n return c._hydrationStatus;\n },\n get error() {\n return c._hydrationError;\n },\n get isHydrated() {\n return c._hydrationStatus === 'hydrated';\n },\n get changedWhileHydrating() {\n return c._changedWhileHydrating;\n },\n begin() {\n c._beginHydration();\n },\n apply(next: S) {\n return c._applyHydratedState(next);\n },\n finish() {\n c._finishHydration();\n },\n fail(error: Error) {\n c._failHydration(error);\n },\n wait() {\n return c._waitForHydration();\n },\n });\n\n const meta: BlacMeta<S> = {\n get name() {\n return c._name;\n },\n get id() {\n return c._instanceId;\n },\n get debug() {\n return c._debug;\n },\n get createdAt() {\n return c._createdAt;\n },\n get disposed() {\n return c._disposed;\n },\n get dependencies() {\n return c._dependencies ?? EMPTY_DEPS;\n },\n hydration,\n };\n\n Object.defineProperty(meta, META_BRAND, {\n value: true,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n\n return Object.freeze(meta);\n}\n","import {\n ALL_PATHS,\n StructuralContainer,\n type DeepPartial,\n type StructuralContainerOptions,\n} from '@dirtytalk/structural';\nimport { generateSimpleId } from '../utils/idGenerator';\nimport { IS_DEV } from '../constants';\nimport { getRegistry } from '../registry/config';\nimport type {\n ExtractArgs,\n ExtractState,\n StateContainerConstructor,\n} from '../types/utilities';\nimport {\n APPLY_DEPS,\n INIT_CONFIG,\n ON_DISPOSE,\n REMOVE_DEPS_OWNER,\n SET_ACTIVE,\n WITH_TRACKED_STATE,\n} from './symbols';\nimport { type EqualityFn, getBlacConfig } from '../config';\nimport { getClassEquality, getBlacName } from '../utils/static-props';\nimport { type BlacMeta, createMeta, META_BRAND } from './meta';\n\n/**\n * Brand symbol carried (non-enumerable) on every handle returned by\n * `depend()`. Framework adapters (`@blac/react`) use this to detect handles\n * inside a tracked-proxy and swap in a session-bound wrapper.\n *\n * @internal — exported for `@blac/react`; not part of the public API.\n */\nexport const DEP_BRAND = Symbol('blac.depHandle');\n\n/**\n * Per-access options for a {@link DepHandle}. `args` resolves the specific dep\n * instance for this call; omit it to fall back to the default args passed to\n * `depend()`. Args resolve at call time so they can derive from current state.\n */\nexport interface DepAccessOptions<T extends StateContainerConstructor> {\n args?: ExtractArgs<T>;\n}\n\n/**\n * Branded handle returned by `StateContainer.depend()`. Two intention-revealing\n * accessors, no callable surface:\n *\n * - `handle.track(options?)` — base impl: returns `[instance.state, instance]`\n * live with no subscription. The React layer replaces `.track()` per-consumer\n * so that cross-bloc state changes trigger re-renders of the reading component.\n * - `handle.untracked(options?)` — returns the live dep instance with no\n * tracking. Use for imperative calls (`.untracked().doThing()`) and one-off\n * state reads that should not subscribe the reader.\n * - `handle[DEP_BRAND]` — carries `{ Type, defaultArgs }` for framework use.\n */\nexport interface DepHandle<T extends StateContainerConstructor> {\n track(options?: DepAccessOptions<T>): [ExtractState<T>, InstanceType<T>];\n untracked(options?: DepAccessOptions<T>): InstanceType<T>;\n readonly [DEP_BRAND]: { Type: T; defaultArgs?: ExtractArgs<T> };\n}\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\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\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 / lifecycle / hydration (exposed via `$blac: BlacMeta`)\n * - cross-bloc deps (`depend()`, `$blac.dependencies`)\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 * - `onSystemEvent('stateChanged' | 'dispose' | 'hydrationChanged', cb)` —\n * coarse lifecycle events.\n * - `this.channel.subscribe(interest, cb)` — path-scoped.\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 // Framework adapters wire these per consumer:\n // `@blac/react/src/useBloc.ts` reads APPLY_DEPS / REMOVE_DEPS_OWNER.\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 (IS_DEV) {\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 /**\n * @internal Subscribe to this instance's own disposal. Delegates to the\n * per-instance `'dispose'` system event — used by `watch()` in place of\n * filtering the global registry `'disposed'` event.\n */\n [ON_DISPOSE](handler: () => void): () => void {\n return this.onSystemEvent('dispose', handler);\n }\n\n /**\n * @internal Drive the 0↔1 ownership transition. Idempotent: repeated calls\n * with the same value are no-ops, so the registry can call it from every\n * acquire/release without tracking edges itself.\n *\n * Returns which real transition (if any) just happened, so the registry can\n * emit the matching `activated`/`deactivated` plugin event without exposing\n * `_activation` itself — `'none'` for an idempotent no-op call.\n */\n [SET_ACTIVE](\n active: boolean,\n ): { kind: 'activated'; signal: AbortSignal } | 'deactivated' | 'none' {\n if (this._disposed) return 'none';\n if (active === (this._activation !== null)) return 'none';\n if (active) {\n this._activation = new AbortController();\n this.onActivate(this._activation.signal);\n return { kind: 'activated', signal: this._activation.signal };\n }\n this._abortActivation();\n this.onDeactivate();\n return 'deactivated';\n }\n\n private _abortActivation(): void {\n this._activation?.abort();\n this._activation = null;\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 private _activation: AbortController | null = null;\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 // 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).\n private _pendingChange: { prev: S; next: S } | null = null;\n\n // Unsubscribe from the internal bridge that turns channel flushes into\n // 'stateChanged' system events.\n private _bridgeUnsub: (() => void) | null = null;\n\n private _registry = getRegistry();\n private _equalityFn: EqualityFn = getBlacConfig().equality;\n\n // Identity fields. The `$blac` meta getters close over these.\n private _name: string = getBlacName(\n this.constructor as StateContainerConstructor,\n );\n private _debug: boolean = false;\n private _instanceId: string = generateSimpleId(\n getBlacName(this.constructor as StateContainerConstructor),\n 'main',\n );\n private _createdAt: number = Date.now();\n\n /**\n * Reserved meta namespace: identity (`name`/`id`/`debug`/`createdAt`),\n * lifecycle (`disposed`/`dependencies`), and the `hydration` sub-surface.\n * Own, frozen, branded data property — `buildTrackedProxy` only intercepts\n * prototype getters, so this own property and its closure-based getters are\n * proxy-safe. See `createMeta`.\n */\n readonly $blac: BlacMeta<S> = createMeta<S>(this);\n\n /**\n * Both set only for the duration of a `[WITH_TRACKED_STATE]` call. TS-private\n * so they stay out of the public surface.\n */\n private _stateOverride: S | undefined;\n private _depHandleHook: ((handle: object) => unknown) | undefined;\n\n override get state(): S {\n return this._stateOverride ?? super.state;\n }\n\n /**\n * @internal Run `fn` with `state` reporting `tracked`, and with dep handles\n * read off `this` routed through `onDepHandle`. Restored in `finally`, and\n * nestable — getters reading other getters stay in tracked context.\n *\n * The dep hook lives here rather than in the adapter's proxy because getters\n * now run with `this` = the real instance (so ES `#private` works), which\n * means a `this.someDep` read never passes through the proxy's trap.\n */\n [WITH_TRACKED_STATE]<R>(\n tracked: S,\n fn: () => R,\n onDepHandle?: (handle: object) => unknown,\n ): R {\n const prevState = this._stateOverride;\n const prevHook = this._depHandleHook;\n this._stateOverride = tracked;\n this._depHandleHook = onDepHandle;\n try {\n return fn();\n } finally {\n this._stateOverride = prevState;\n this._depHandleHook = prevHook;\n }\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 branded handle with two\n * accessors — the dep instance is resolved against the registry on each call,\n * which keeps the surface immune to dep-instance churn:\n *\n * - `handle.track(options?)` — reactive read. Returns `[state, instance]`.\n * Inside a getter reached through the React proxy this subscribes the\n * reading component to the dep's changes (base impl: live, no subscription).\n * - `handle.untracked(options?)` — returns the live instance with no tracking,\n * for imperative method calls and one-off reads.\n *\n * `defaultArgs` resolves the dep instance when an accessor is called without\n * its own `args`; per-call `options.args` overrides it and can derive from\n * current state. This does NOT auto-resubscribe outside the React proxy;\n * non-React consumers needing updates should subscribe explicitly.\n */\n protected depend<T extends StateContainerConstructor>(\n Type: T,\n defaultArgs?: ExtractArgs<T>,\n ): DepHandle<T> {\n if (!this._dependencies) {\n this._dependencies = new Map();\n }\n this._dependencies.set(\n Type,\n this._registry.resolveKey(Type, undefined, defaultArgs),\n );\n\n const resolve = (args?: ExtractArgs<T>): InstanceType<T> => {\n const effectiveArgs = args ?? defaultArgs;\n const key = this._registry.resolveKey(Type, undefined, effectiveArgs);\n // Same no-ref semantics as `ensure()`, but records `this` as a\n // dependent edge on the resolved entry so the registry can sweep it\n // on `this`'s disposal (see StateContainerRegistry._releaseDependent).\n return this._registry.acquire(Type, key, {\n canCreate: true,\n countRef: false,\n args: effectiveArgs,\n dependent: this,\n }) as InstanceType<T>;\n };\n\n const handle = {\n track: (\n options?: DepAccessOptions<T>,\n ): [ExtractState<T>, InstanceType<T>] => {\n // While a consumer is rendering, `.track()` must go through its\n // session-bound wrapper so the read subscribes that consumer. The\n // wrapper is only reachable via the hook, since `this.<dep>` is read\n // straight off the real instance.\n const wrapped = this._depHandleHook?.(handle) as\n | DepHandle<T>\n | undefined;\n if (wrapped !== undefined && wrapped !== handle) {\n return wrapped.track(options);\n }\n const instance = resolve(options?.args);\n return [instance.state as ExtractState<T>, instance];\n },\n untracked: (options?: DepAccessOptions<T>): InstanceType<T> =>\n resolve(options?.args),\n } as DepHandle<T>;\n\n Object.defineProperty(handle, DEP_BRAND, {\n value: { Type, defaultArgs },\n enumerable: false,\n writable: false,\n configurable: false,\n });\n\n return handle;\n }\n\n constructor(initialState: S, options?: StructuralContainerOptions) {\n super(initialState, options);\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 /**\n * Called when this instance goes from unowned to owned (first ref or first\n * `depend()` dependent). Override to start work that should only run while\n * something is actually using the instance — fetches, timers, listeners.\n *\n * `signal` aborts on the matching {@link onDeactivate} and on dispose, so\n * async work started here can be cancelled without extra bookkeeping.\n *\n * Runs before the first `useBlocDeps` slice is applied, so `this.deps` is\n * empty on first activation — use `onDepsChanged` for deps-driven work.\n */\n protected onActivate(_signal: AbortSignal): void {}\n\n /**\n * Called when this instance goes from owned back to unowned while surviving\n * in the registry (i.e. `keepAlive`). A disposed instance does NOT get this\n * callback — `dispose()` is the teardown path for that case.\n */\n protected onDeactivate(): void {}\n\n /**\n * @internal Framework-only configuration entry point (registry + testing\n * helpers). Writes the `_`-private identity fields directly, resolves\n * per-class equality, emits the registry `created` event, and runs `init()`\n * once. See {@link INIT_CONFIG}.\n */\n [INIT_CONFIG](config: StateContainerConfig): void {\n this._config = { ...config };\n this._name =\n this._config.name ||\n getBlacName(this.constructor as StateContainerConstructor);\n this._debug = this._config.debug ?? false;\n this._instanceId = generateSimpleId(\n getBlacName(this.constructor as StateContainerConstructor),\n this._config.instanceId,\n );\n const perClass = getClassEquality(\n this.constructor as StateContainerConstructor,\n );\n this._equalityFn = perClass ?? getBlacConfig().equality;\n // `created` fires AFTER init() so plugins observe a fully initialised\n // instance. Emitting it first let a plugin start hydration, which init()'s\n // seeding emits then cancelled — silently discarding persisted state.\n if (!this._initCalled) {\n this._initCalled = true;\n this.init(this._config.args as Args);\n }\n this._registry.emit('created', this);\n\n // Clobber guard: a subclass class-field `$blac = ...` initializes after\n // `super()` and would overwrite the base's own meta property. Dev-only.\n if (IS_DEV) {\n if (!(this.$blac as unknown as Record<symbol, unknown>)?.[META_BRAND]) {\n console.warn(\n `[blac] ${this.constructor.name} appears to declare its own \\`$blac\\` ` +\n `member, which shadows the reserved meta namespace. \\`$blac\\` is ` +\n `reserved by StateContainer — remove the subclass field.`,\n );\n }\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 // Dispose is the teardown path for an active instance: the signal aborts\n // but `onDeactivate` does NOT fire, so a container has exactly one teardown\n // callback per lifecycle rather than two.\n this._abortActivation();\n\n this._systemEventHandlers.clear();\n this._pendingChange = null;\n\n this._registry.emit('disposed', this);\n\n // Tear down the channel itself (cancels any scheduled flush).\n super.dispose();\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 // '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 protected 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 `stateChanged`\n * system events see the merged prev/next), and the registry-level\n * `stateChanged` notification. We still call\n * `super.patch` so path-marking semantics (the whole point of patch) are\n * preserved.\n */\n protected override patch(partial: DeepPartial<S>): void {\n if (this._disposed) {\n this._warnDisposedMutation('patch');\n return;\n }\n const prev = this.state;\n\n super.patch(partial);\n\n // `super.patch` returns `prev` by reference when the merge changed\n // nothing, so identity is the no-op test — no pre-scan needed.\n const next = this.state;\n if (Object.is(prev, next)) return;\n\n if (IS_DEV) {\n this._checkEmitRate();\n }\n\n if (this._hydrationStatus === 'hydrating') {\n this._changedWhileHydrating = true;\n }\n\n if (this._bridgeUnsub !== null) {\n if (this._pendingChange) {\n this._pendingChange.next = next;\n } else {\n this._pendingChange = { prev, next };\n }\n }\n\n if (this._registry.hasStateChangedListeners) {\n this._registry.notifyStateChanged(this, prev, next);\n }\n }\n\n private applyState(next: S, source: 'default' | 'hydration'): void {\n if (this._disposed) {\n this._warnDisposedMutation('emit');\n return;\n }\n\n const prev = this.state;\n if (prev === next) return;\n if (this._equalityFn(prev, next)) return;\n\n if (IS_DEV) {\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 // Only tracked when the bridge is attached; nothing reads it otherwise.\n if (this._bridgeUnsub !== null) {\n if (this._pendingChange) {\n this._pendingChange.next = next;\n } else {\n this._pendingChange = { prev, next };\n }\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 the 'stateChanged' system event.\n * 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 handler that subscribes a\n // new handler mid-drain does not get the late one called in this flush.\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(\n `[${this._name}] Error in system event handler:`,\n error,\n );\n }\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Hydration\n // ---------------------------------------------------------------------------\n\n // The hydration state machine lives in these `_`-private impls. The\n // `$blac.hydration` surface delegates here, so there is a single source\n // of truth for the hydration state machine.\n\n private _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 private _warnDisposedMutation(op: 'emit' | 'patch'): void {\n if (IS_DEV) {\n console.warn(\n `[blac] ${this._name}: ${op}() after dispose ignored. This usually ` +\n `means an async method resolved after the last consumer unmounted. ` +\n `Guard with \\`if (this.$blac.disposed) return\\` after each \\`await\\`, ` +\n `or abort the work from \\`onSystemEvent('dispose', ...)\\`.`,\n );\n }\n }\n\n private _applyHydratedState(next: S): boolean {\n if (this._disposed) {\n return false;\n }\n\n if (this._hydrationStatus !== 'hydrating' || this._changedWhileHydrating) {\n if (IS_DEV && this._changedWhileHydrating) {\n console.warn(\n `[blac] ${this._name}: persisted state discarded because the ` +\n `container emitted while hydrating.`,\n );\n }\n return false;\n }\n\n this.applyState(next, 'hydration');\n return true;\n }\n\n private _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 private _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 private _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 this._registry.emit('hydrationChanged', this, status, previousStatus);\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 // The channel bridge only exists to feed 'stateChanged'. Subscribe on the\n // first such handler so instances nobody observes stay off the channel.\n if (event === 'stateChanged' && this._bridgeUnsub === null) {\n this._bridgeUnsub = this.channel.subscribe(\n () => ALL_PATHS,\n () => this._drainPending(),\n );\n }\n\n return () => {\n handlers?.delete(handler as SystemEventHandler<S, any>);\n if (event === 'stateChanged' && handlers?.size === 0) {\n this._bridgeUnsub?.();\n this._bridgeUnsub = null;\n this._pendingChange = null;\n }\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';\nimport type { DeepPartial } from '@dirtytalk/structural';\n\n/**\n * `Cubit<S>` is a `StateContainer<S>` that exposes mutation publicly.\n *\n * That is the whole difference, and it is a real one: on `StateContainer`\n * `emit` / `patch` / `update` are `protected`, so a container mutates itself\n * from its own methods and callers go through the API it chooses to publish.\n * `Cubit` re-declares the three as `public` for the cases where a caller\n * legitimately drives state from outside — test helpers, devtools\n * time-travel, benchmarks.\n *\n * Reach for `StateContainer` when business logic should live in the class,\n * and `Cubit` when the caller owns the transitions.\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 override emit(next: S): void {\n super.emit(next);\n }\n\n override patch(partial: DeepPartial<S>): void {\n super.patch(partial);\n }\n\n override update(fn: (state: S) => S): void {\n super.update(fn);\n }\n}\n","import { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n} from '../types/utilities';\n\n/**\n * Acquire an instance with ref tracking (ownership semantics). Instance\n * identity is derived purely from `args` (via the class's `static key(args)`,\n * a structural hash of `args`, or the default sentinel when there are none).\n *\n * @param BlocClass - The StateContainer class constructor\n * @param opts - `args` derives the instance key; `refId` names the reference\n * for debugging and is auto-generated when omitted.\n */\nexport function acquire<T extends StateContainerConstructor>(\n BlocClass: T,\n opts?: { args?: ExtractArgs<T>; refId?: string },\n): InstanceType<T> {\n const registry = getRegistry();\n const key = registry.resolveKey(BlocClass, undefined, opts?.args);\n return registry.acquire(BlocClass, key, {\n canCreate: true,\n countRef: true,\n refId: opts?.refId,\n args: opts?.args,\n });\n}\n\n/**\n * Resolve the storage key an instance would be acquired under, given its\n * construction `args`. This is the canonical key-computation path. Callers that\n * both acquire and release against the `@internal` registry tier (e.g.\n * `@blac/react` `useBloc`) must use this once and pass the same resolved key to\n * both, so the ref is dropped under the key it was taken.\n */\nexport function resolveInstanceKey<T extends StateContainerConstructor>(\n BlocClass: T,\n args?: ExtractArgs<T>,\n): string {\n return getRegistry().resolveKey(BlocClass, undefined, args);\n}\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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"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,21 +1,43 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_StateContainerRegistry = require("./StateContainerRegistry-
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const require_acquire = require("./acquire-CkgLJ8WL.cjs");
|
|
6
|
-
const require_management = require("./management-hkY13log.cjs");
|
|
7
|
-
const require_watch = require("./watch-lEco5Tbl.cjs");
|
|
8
|
-
const require_branded = require("./branded-BybA0_xw.cjs");
|
|
2
|
+
const require_StateContainerRegistry = require("./StateContainerRegistry-DjQQtlCW.cjs");
|
|
3
|
+
const require_StateContainer = require("./StateContainer-BUyuxKb3.cjs");
|
|
4
|
+
const require_ensure = require("./ensure-DBnuRJ0R.cjs");
|
|
9
5
|
let _dirtytalk_structural = require("@dirtytalk/structural");
|
|
6
|
+
//#region src/core/Cubit.ts
|
|
7
|
+
/**
|
|
8
|
+
* `Cubit<S>` is a `StateContainer<S>` that exposes mutation publicly.
|
|
9
|
+
*
|
|
10
|
+
* That is the whole difference, and it is a real one: on `StateContainer`
|
|
11
|
+
* `emit` / `patch` / `update` are `protected`, so a container mutates itself
|
|
12
|
+
* from its own methods and callers go through the API it chooses to publish.
|
|
13
|
+
* `Cubit` re-declares the three as `public` for the cases where a caller
|
|
14
|
+
* legitimately drives state from outside — test helpers, devtools
|
|
15
|
+
* time-travel, benchmarks.
|
|
16
|
+
*
|
|
17
|
+
* Reach for `StateContainer` when business logic should live in the class,
|
|
18
|
+
* and `Cubit` when the caller owns the transitions.
|
|
19
|
+
*/
|
|
20
|
+
var Cubit = class extends require_StateContainer.StateContainer {
|
|
21
|
+
emit(next) {
|
|
22
|
+
super.emit(next);
|
|
23
|
+
}
|
|
24
|
+
patch(partial) {
|
|
25
|
+
super.patch(partial);
|
|
26
|
+
}
|
|
27
|
+
update(fn) {
|
|
28
|
+
super.update(fn);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
//#endregion
|
|
10
32
|
//#region src/registry/borrow.ts
|
|
11
33
|
function resolveBorrowKey(BlocClass, target) {
|
|
12
|
-
return
|
|
34
|
+
return require_StateContainer.getRegistry().resolveKey(BlocClass, void 0, target?.args);
|
|
13
35
|
}
|
|
14
36
|
function borrow(BlocClass, target) {
|
|
15
|
-
return
|
|
37
|
+
return require_StateContainer.getRegistry().borrow(BlocClass, resolveBorrowKey(BlocClass, target));
|
|
16
38
|
}
|
|
17
39
|
function borrowSafe(BlocClass, target) {
|
|
18
|
-
return
|
|
40
|
+
return require_StateContainer.getRegistry().borrowSafe(BlocClass, resolveBorrowKey(BlocClass, target));
|
|
19
41
|
}
|
|
20
42
|
//#endregion
|
|
21
43
|
//#region src/registry/release.ts
|
|
@@ -23,33 +45,66 @@ function borrowSafe(BlocClass, target) {
|
|
|
23
45
|
* Release a reference to an instance. Instance identity is derived purely from
|
|
24
46
|
* `args` (must match the `args` it was acquired with).
|
|
25
47
|
*
|
|
26
|
-
* @param opts
|
|
27
|
-
*
|
|
28
|
-
*
|
|
48
|
+
* @param opts - `args` derives the instance key (must match acquire);
|
|
49
|
+
* `refId` picks the ref to drop, otherwise one arbitrary ref goes;
|
|
50
|
+
* `forceDispose` disposes immediately regardless of remaining refs.
|
|
29
51
|
*/
|
|
30
52
|
function release(BlocClass, opts) {
|
|
31
|
-
const registry =
|
|
53
|
+
const registry = require_StateContainer.getRegistry();
|
|
32
54
|
const key = registry.resolveKey(BlocClass, void 0, opts?.args);
|
|
33
55
|
registry.release(BlocClass, key, opts?.forceDispose ?? false, opts?.refId);
|
|
34
56
|
}
|
|
57
|
+
//#endregion
|
|
58
|
+
//#region src/registry/queries.ts
|
|
35
59
|
/**
|
|
36
|
-
*
|
|
37
|
-
* hold a container but not the `args` it was acquired with (teardown loops).
|
|
38
|
-
*
|
|
39
|
-
* Never throws — safe on an unknown, transient, already-disposed, or
|
|
40
|
-
* non-registry instance, and idempotent. Teardown loops depend on this.
|
|
41
|
-
*
|
|
42
|
-
* Idempotence is structural, not guarded here: once the instance is gone from
|
|
43
|
-
* the registry `registry.release` returns early on its own missing-entry check
|
|
44
|
-
* (`StateContainerRegistry.ts:636`), so a second call is a no-op. Do not add a
|
|
45
|
-
* redundant guard.
|
|
60
|
+
* @public
|
|
46
61
|
*/
|
|
47
|
-
function
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
62
|
+
function hasInstance(BlocClass, opts) {
|
|
63
|
+
const registry = require_StateContainer.getRegistry();
|
|
64
|
+
const key = registry.resolveKey(BlocClass, void 0, opts?.args);
|
|
65
|
+
return registry.hasInstance(BlocClass, key);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* @public
|
|
69
|
+
*/
|
|
70
|
+
function getRefCount(BlocClass, opts) {
|
|
71
|
+
const registry = require_StateContainer.getRegistry();
|
|
72
|
+
const key = registry.resolveKey(BlocClass, void 0, opts?.args);
|
|
73
|
+
return registry.getRefCount(BlocClass, key);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* @public
|
|
77
|
+
*/
|
|
78
|
+
function getRefIds(BlocClass, opts) {
|
|
79
|
+
const registry = require_StateContainer.getRegistry();
|
|
80
|
+
const key = registry.resolveKey(BlocClass, void 0, opts?.args);
|
|
81
|
+
return registry.getRefIds(BlocClass, key);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* @public
|
|
85
|
+
*/
|
|
86
|
+
function getAll(BlocClass) {
|
|
87
|
+
return require_StateContainer.getRegistry().getAll(BlocClass);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* @public
|
|
91
|
+
*/
|
|
92
|
+
function forEach(BlocClass, callback) {
|
|
93
|
+
require_StateContainer.getRegistry().forEach(BlocClass, callback);
|
|
94
|
+
}
|
|
95
|
+
//#endregion
|
|
96
|
+
//#region src/registry/management.ts
|
|
97
|
+
function clear(BlocClass) {
|
|
98
|
+
require_StateContainer.getRegistry().clear(BlocClass);
|
|
99
|
+
}
|
|
100
|
+
function clearAll() {
|
|
101
|
+
require_StateContainer.getRegistry().clearAll();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* @public
|
|
105
|
+
*/
|
|
106
|
+
function register(BlocClass) {
|
|
107
|
+
require_StateContainer.getRegistry().register(BlocClass);
|
|
53
108
|
}
|
|
54
109
|
//#endregion
|
|
55
110
|
//#region src/decorators/blac.ts
|
|
@@ -63,6 +118,9 @@ function releaseInstance(instance, opts) {
|
|
|
63
118
|
*
|
|
64
119
|
* @blac({ excludeFromDevTools: true })
|
|
65
120
|
* class InternalBloc extends Cubit<InternalState> {}
|
|
121
|
+
*
|
|
122
|
+
* @blac({ keepAlive: true, key: (args) => args.userId })
|
|
123
|
+
* class UserBloc extends Cubit<UserState> {}
|
|
66
124
|
* ```
|
|
67
125
|
*
|
|
68
126
|
* @example Function syntax (no decorator support needed)
|
|
@@ -74,41 +132,142 @@ function releaseInstance(instance, opts) {
|
|
|
74
132
|
*/
|
|
75
133
|
function blac(options) {
|
|
76
134
|
return function(target, _context) {
|
|
77
|
-
if (
|
|
78
|
-
if (
|
|
79
|
-
if (
|
|
80
|
-
if (
|
|
135
|
+
if (options.keepAlive !== void 0) target[require_StateContainerRegistry.BLAC_STATIC_PROPS.KEEP_ALIVE] = options.keepAlive;
|
|
136
|
+
if (options.excludeFromDevTools) target[require_StateContainerRegistry.BLAC_STATIC_PROPS.EXCLUDE_FROM_DEVTOOLS] = true;
|
|
137
|
+
if (typeof options.equality === "function") target[require_StateContainerRegistry.BLAC_STATIC_PROPS.EQUALITY] = options.equality;
|
|
138
|
+
if (typeof options.key === "function") target[require_StateContainerRegistry.BLAC_STATIC_PROPS.KEY] = options.key;
|
|
139
|
+
if (typeof options.name === "string") target[require_StateContainerRegistry.BLAC_STATIC_PROPS.BLAC_NAME] = options.name;
|
|
81
140
|
return target;
|
|
82
141
|
};
|
|
83
142
|
}
|
|
84
143
|
//#endregion
|
|
85
|
-
//#region src/watch/
|
|
144
|
+
//#region src/watch/watch.ts
|
|
145
|
+
const STOP = Symbol("watch.STOP");
|
|
146
|
+
const BLOC_REF_MARKER = Symbol("BlocRef");
|
|
86
147
|
/**
|
|
87
|
-
*
|
|
88
|
-
*
|
|
148
|
+
* Create a reference to a specific bloc instance, identified by its `args`.
|
|
149
|
+
* The key is derived the same way `useBloc`/`acquire` derive it.
|
|
89
150
|
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```ts
|
|
153
|
+
* watch(instance(UserBloc, { userId: 'user-123' }), (userBloc) => {
|
|
154
|
+
* console.log(userBloc.state.name);
|
|
155
|
+
* });
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
function instance(BlocClass, args) {
|
|
159
|
+
return {
|
|
160
|
+
[BLOC_REF_MARKER]: true,
|
|
161
|
+
blocClass: BlocClass,
|
|
162
|
+
instanceId: require_ensure.resolveInstanceKey(BlocClass, args),
|
|
163
|
+
args
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function isBlocRef(input) {
|
|
167
|
+
return typeof input === "object" && input !== null && BLOC_REF_MARKER in input;
|
|
168
|
+
}
|
|
169
|
+
function toWatchTarget(registry, input) {
|
|
170
|
+
if (isBlocRef(input)) return {
|
|
171
|
+
blocClass: input.blocClass,
|
|
172
|
+
key: input.instanceId,
|
|
173
|
+
args: input.args
|
|
174
|
+
};
|
|
175
|
+
return {
|
|
176
|
+
blocClass: input,
|
|
177
|
+
key: registry.resolveKey(input, void 0, void 0),
|
|
178
|
+
args: void 0
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
let watchRefSeq = 0;
|
|
182
|
+
/**
|
|
183
|
+
* Acquire a real ref (countRef: true) for the target, carrying its `args`
|
|
184
|
+
* through so a not-yet-created instance is initialized correctly. The
|
|
185
|
+
* caller is responsible for releasing `refId` in cleanup.
|
|
96
186
|
*/
|
|
97
|
-
function
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
listener(instance.state);
|
|
187
|
+
function resolveBloc(registry, target, refId) {
|
|
188
|
+
return registry.acquire(target.blocClass, target.key, {
|
|
189
|
+
countRef: true,
|
|
190
|
+
refId,
|
|
191
|
+
args: target.args
|
|
103
192
|
});
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Passive lookup for `{ create: false }`: never creates the instance and
|
|
196
|
+
* never takes a ref. Returns `undefined` when no instance currently exists.
|
|
197
|
+
*/
|
|
198
|
+
function resolveBlocPassive(registry, target) {
|
|
199
|
+
try {
|
|
200
|
+
return registry.acquire(target.blocClass, target.key, {
|
|
201
|
+
canCreate: false,
|
|
202
|
+
countRef: false,
|
|
203
|
+
args: target.args
|
|
204
|
+
});
|
|
205
|
+
} catch {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function isArray(input) {
|
|
210
|
+
return Array.isArray(input);
|
|
211
|
+
}
|
|
212
|
+
function watchImpl(blocsOrBloc, callback, options) {
|
|
213
|
+
const isSingle = !isArray(blocsOrBloc);
|
|
214
|
+
const inputs = isSingle ? [blocsOrBloc] : blocsOrBloc;
|
|
215
|
+
const registry = require_StateContainer.getRegistry();
|
|
216
|
+
const create = options?.create ?? true;
|
|
217
|
+
const targets = inputs.map((input) => toWatchTarget(registry, input));
|
|
218
|
+
const refIds = targets.map(() => `_watch_${watchRefSeq++}`);
|
|
219
|
+
const resolveAt = (index) => create ? resolveBloc(registry, targets[index], refIds[index]) : resolveBlocPassive(registry, targets[index]);
|
|
220
|
+
let disposed = false;
|
|
221
|
+
const instances = [];
|
|
222
|
+
const channelUnsubs = [];
|
|
223
|
+
const disposedUnsubs = [];
|
|
224
|
+
const cleanup = () => {
|
|
225
|
+
if (disposed) return;
|
|
226
|
+
disposed = true;
|
|
227
|
+
for (const unsub of channelUnsubs) unsub?.();
|
|
228
|
+
for (const unsub of disposedUnsubs) unsub?.();
|
|
229
|
+
channelUnsubs.length = 0;
|
|
230
|
+
disposedUnsubs.length = 0;
|
|
231
|
+
if (create) for (let i = 0; i < instances.length; i++) registry.release(targets[i].blocClass, targets[i].key, false, refIds[i]);
|
|
232
|
+
};
|
|
233
|
+
const runCallback = () => {
|
|
234
|
+
if (disposed) return;
|
|
235
|
+
if (instances.some((i) => i === void 0)) return;
|
|
236
|
+
if (callback(isSingle ? instances[0] : instances) === STOP) cleanup();
|
|
237
|
+
};
|
|
238
|
+
const subscribeAt = (index) => {
|
|
239
|
+
channelUnsubs[index] = instances[index]?.channel.subscribe(() => _dirtytalk_structural.ALL_PATHS, runCallback);
|
|
240
|
+
};
|
|
241
|
+
const resubscribeAt = (index) => {
|
|
242
|
+
if (disposed) return;
|
|
243
|
+
instances[index] = resolveAt(index);
|
|
244
|
+
subscribeAt(index);
|
|
245
|
+
subscribeDisposeAt(index);
|
|
246
|
+
runCallback();
|
|
247
|
+
};
|
|
248
|
+
const subscribeDisposeAt = (index) => {
|
|
249
|
+
disposedUnsubs[index] = instances[index]?.[require_StateContainerRegistry.ON_DISPOSE](() => {
|
|
250
|
+
channelUnsubs[index]?.();
|
|
251
|
+
channelUnsubs[index] = void 0;
|
|
252
|
+
queueMicrotask(() => resubscribeAt(index));
|
|
253
|
+
});
|
|
254
|
+
};
|
|
255
|
+
try {
|
|
256
|
+
for (let i = 0; i < targets.length; i++) instances.push(resolveAt(i));
|
|
257
|
+
for (let i = 0; i < instances.length; i++) subscribeAt(i);
|
|
258
|
+
for (let i = 0; i < instances.length; i++) subscribeDisposeAt(i);
|
|
259
|
+
runCallback();
|
|
260
|
+
} catch (error) {
|
|
261
|
+
cleanup();
|
|
262
|
+
throw error;
|
|
109
263
|
}
|
|
110
|
-
|
|
111
|
-
|
|
264
|
+
return cleanup;
|
|
265
|
+
}
|
|
266
|
+
const watch = Object.assign(watchImpl, { STOP });
|
|
267
|
+
//#endregion
|
|
268
|
+
//#region src/types/branded.ts
|
|
269
|
+
function instanceId(id) {
|
|
270
|
+
return id;
|
|
112
271
|
}
|
|
113
272
|
//#endregion
|
|
114
273
|
Object.defineProperty(exports, "ALL_PATHS", {
|
|
@@ -117,49 +276,37 @@ Object.defineProperty(exports, "ALL_PATHS", {
|
|
|
117
276
|
return _dirtytalk_structural.ALL_PATHS;
|
|
118
277
|
}
|
|
119
278
|
});
|
|
120
|
-
exports.
|
|
121
|
-
exports.
|
|
122
|
-
exports.DEP_BRAND = require_ensure.DEP_BRAND;
|
|
123
|
-
exports.INIT_CONFIG = require_StateContainerRegistry.INIT_CONFIG;
|
|
124
|
-
exports.ON_DISPOSE = require_StateContainerRegistry.ON_DISPOSE;
|
|
125
|
-
exports.PluginManager = require_StateContainerRegistry.PluginManager;
|
|
126
|
-
exports.REMOVE_DEPS_OWNER = require_StateContainerRegistry.REMOVE_DEPS_OWNER;
|
|
127
|
-
exports.StateContainer = require_ensure.StateContainer;
|
|
279
|
+
exports.Cubit = Cubit;
|
|
280
|
+
exports.StateContainer = require_StateContainer.StateContainer;
|
|
128
281
|
exports.StateContainerRegistry = require_StateContainerRegistry.StateContainerRegistry;
|
|
129
|
-
exports.acquire =
|
|
282
|
+
exports.acquire = require_ensure.acquire;
|
|
130
283
|
exports.blac = blac;
|
|
131
284
|
exports.borrow = borrow;
|
|
132
285
|
exports.borrowSafe = borrowSafe;
|
|
133
|
-
exports.clear =
|
|
134
|
-
exports.clearAll =
|
|
286
|
+
exports.clear = clear;
|
|
287
|
+
exports.clearAll = clearAll;
|
|
135
288
|
exports.configureBlac = require_StateContainerRegistry.configureBlac;
|
|
136
|
-
exports.defineEvent = require_ensure.defineEvent;
|
|
137
|
-
exports.emitEvent = require_ensure.emitEvent;
|
|
138
289
|
exports.ensure = require_ensure.ensure;
|
|
139
|
-
exports.forEach =
|
|
140
|
-
exports.getAll =
|
|
290
|
+
exports.forEach = forEach;
|
|
291
|
+
exports.getAll = getAll;
|
|
141
292
|
exports.getBlacConfig = require_StateContainerRegistry.getBlacConfig;
|
|
142
|
-
exports.
|
|
143
|
-
exports.getRefCount =
|
|
144
|
-
exports.getRefIds =
|
|
145
|
-
exports.getRegistry =
|
|
146
|
-
exports.getStats =
|
|
293
|
+
exports.getBlacName = require_StateContainerRegistry.getBlacName;
|
|
294
|
+
exports.getRefCount = getRefCount;
|
|
295
|
+
exports.getRefIds = getRefIds;
|
|
296
|
+
exports.getRegistry = require_StateContainer.getRegistry;
|
|
297
|
+
exports.getStats = require_StateContainer.getStats;
|
|
147
298
|
exports.globalRegistry = require_StateContainerRegistry.globalRegistry;
|
|
148
|
-
exports.hasInstance =
|
|
149
|
-
exports.instance =
|
|
150
|
-
exports.instanceId =
|
|
299
|
+
exports.hasInstance = hasInstance;
|
|
300
|
+
exports.instance = instance;
|
|
301
|
+
exports.instanceId = instanceId;
|
|
151
302
|
exports.isExcludedFromDevTools = require_StateContainerRegistry.isExcludedFromDevTools;
|
|
152
|
-
exports.isIsolatedClass = require_StateContainerRegistry.isIsolatedClass;
|
|
153
303
|
exports.isKeepAliveClass = require_StateContainerRegistry.isKeepAliveClass;
|
|
154
|
-
exports.
|
|
155
|
-
exports.onEvent = require_ensure.onEvent;
|
|
156
|
-
exports.register = require_management.register;
|
|
304
|
+
exports.register = register;
|
|
157
305
|
exports.release = release;
|
|
158
|
-
exports.releaseInstance = releaseInstance;
|
|
159
306
|
exports.resetBlacConfig = require_StateContainerRegistry.resetBlacConfig;
|
|
160
|
-
exports.resolveInstanceKey =
|
|
161
|
-
exports.setRegistry =
|
|
307
|
+
exports.resolveInstanceKey = require_ensure.resolveInstanceKey;
|
|
308
|
+
exports.setRegistry = require_StateContainer.setRegistry;
|
|
162
309
|
exports.shallowEqualState = require_StateContainerRegistry.shallowEqualState;
|
|
163
|
-
exports.watch =
|
|
310
|
+
exports.watch = watch;
|
|
164
311
|
|
|
165
312
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["getRegistry","getRegistry","BLAC_STATIC_PROPS","ALL_PATHS","ON_DISPOSE"],"sources":["../src/registry/borrow.ts","../src/registry/release.ts","../src/decorators/blac.ts","../src/watch/observe.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 StateContainerInstance,\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\n/**\n * Release a reference using the INSTANCE as the identity, for callers that\n * hold a container but not the `args` it was acquired with (teardown loops).\n *\n * Never throws — safe on an unknown, transient, already-disposed, or\n * non-registry instance, and idempotent. Teardown loops depend on this.\n *\n * Idempotence is structural, not guarded here: once the instance is gone from\n * the registry `registry.release` returns early on its own missing-entry check\n * (`StateContainerRegistry.ts:636`), so a second call is a no-op. Do not add a\n * redundant guard.\n */\nexport function releaseInstance(\n instance: StateContainerInstance,\n opts?: { forceDispose?: boolean; refId?: string },\n): void {\n if (!instance) return;\n const registry = getRegistry();\n const key = registry.keyOf(instance);\n if (key === undefined) return;\n registry.release(\n instance.constructor as StateContainerConstructor,\n key,\n opts?.forceDispose ?? false,\n opts?.refId,\n );\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 * Applies to `emit`/`update` only — `patch` does not consult this fn; it\n * still skips structural no-ops on its own.\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","import { ALL_PATHS } from '@dirtytalk/structural';\nimport { ON_DISPOSE } from '../core/symbols';\nimport type { StateContainer } from '../core/StateContainer';\n\n/**\n * Subscribe to every state change of a LIVE container instance, without the\n * immediate first call and without taking a registry ref.\n *\n * Contrast with `watch`: `watch` fires once on subscribe AND holds a ref that\n * keeps the instance alive. `observe` does neither — it is for hand-managed\n * subscriptions against an instance you already hold.\n *\n * Delivery is microtask-coalesced by the container's channel scheduler: several\n * `emit`s in one tick deliver ONE call carrying the latest state.\n */\nexport function observe<S extends object>(\n instance: StateContainer<S, any, any>,\n listener: (state: Readonly<S>) => void,\n): () => void {\n if (!instance || instance.$blac.disposed) return () => {};\n let stopped = false;\n const unsub = instance.subscribe(\n () => ALL_PATHS,\n () => {\n if (stopped) return;\n listener(instance.state as Readonly<S>);\n },\n );\n // A hoisted function declaration, so it can be handed to `[ON_DISPOSE]`\n // below while still referencing the `offDispose` const that call returns.\n // `[ON_DISPOSE]` only registers the handler (it never invokes it inline), so\n // by the time `stop` can actually run, `offDispose` is initialized.\n function stop(): void {\n if (stopped) return;\n stopped = true;\n unsub();\n offDispose();\n }\n // Same closure on both teardown paths (caller-invoked and dispose-driven), so\n // the `stopped` flag guarantees teardown runs exactly once.\n const offDispose = instance[ON_DISPOSE](stop);\n return stop;\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;;;;;;;;;;;AC3BA,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;;;;;;;;;;;;;AAcA,SAAgB,gBACd,UACA,MACM;CACN,IAAI,CAAC,UAAU;CACf,MAAM,WAAWA,eAAAA,YAAY;CAC7B,MAAM,MAAM,SAAS,MAAM,QAAQ;CACnC,IAAI,QAAQ,KAAA,GAAW;CACvB,SAAS,QACP,SAAS,aACT,KACA,MAAM,gBAAgB,OACtB,MAAM,KACR;AACF;;;;;;;;;;;;;;;;;;;;;;ACJA,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;;;;;;;;;;;;;;AClDA,SAAgB,QACd,UACA,UACY;CACZ,IAAI,CAAC,YAAY,SAAS,MAAM,UAAU,aAAa,CAAC;CACxD,IAAI,UAAU;CACd,MAAM,QAAQ,SAAS,gBACfC,sBAAAA,iBACA;EACJ,IAAI,SAAS;EACb,SAAS,SAAS,KAAoB;CACxC,CACF;CAKA,SAAS,OAAa;EACpB,IAAI,SAAS;EACb,UAAU;EACV,MAAM;EACN,WAAW;CACb;CAGA,MAAM,aAAa,SAASC,+BAAAA,YAAY,IAAI;CAC5C,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["StateContainer","getRegistry","getRegistry","getRegistry","BLAC_STATIC_PROPS","resolveInstanceKey","getRegistry","ALL_PATHS","ON_DISPOSE"],"sources":["../src/core/Cubit.ts","../src/registry/borrow.ts","../src/registry/release.ts","../src/registry/queries.ts","../src/registry/management.ts","../src/decorators/blac.ts","../src/watch/watch.ts","../src/types/branded.ts"],"sourcesContent":["import { StateContainer } from './StateContainer';\nimport type { DeepPartial } from '@dirtytalk/structural';\n\n/**\n * `Cubit<S>` is a `StateContainer<S>` that exposes mutation publicly.\n *\n * That is the whole difference, and it is a real one: on `StateContainer`\n * `emit` / `patch` / `update` are `protected`, so a container mutates itself\n * from its own methods and callers go through the API it chooses to publish.\n * `Cubit` re-declares the three as `public` for the cases where a caller\n * legitimately drives state from outside — test helpers, devtools\n * time-travel, benchmarks.\n *\n * Reach for `StateContainer` when business logic should live in the class,\n * and `Cubit` when the caller owns the transitions.\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 override emit(next: S): void {\n super.emit(next);\n }\n\n override patch(partial: DeepPartial<S>): void {\n super.patch(partial);\n }\n\n override update(fn: (state: S) => S): void {\n super.update(fn);\n }\n}\n","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` derives the instance key (must match acquire);\n * `refId` picks the ref to drop, otherwise one arbitrary ref goes;\n * `forceDispose` disposes immediately regardless of remaining 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 { getRegistry } from './config';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n InstanceReadonlyState,\n} from '../types/utilities';\n\n/**\n * @public\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\n/**\n * @public\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\n/**\n * @public\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\n/**\n * @public\n */\nexport function getAll<T extends StateContainerConstructor>(\n BlocClass: T,\n): InstanceReadonlyState<T>[] {\n return getRegistry().getAll(BlocClass);\n}\n\n/**\n * @public\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\n/**\n * @public\n */\nexport function register<T extends StateContainerConstructor>(\n BlocClass: T,\n): void {\n getRegistry().register(BlocClass);\n}\n","import { BLAC_STATIC_PROPS } from '../constants';\nimport type { EqualityFn } from '../config';\n\n/**\n * Configuration options for the `@blac` decorator. Any combination may be\n * given at once.\n */\nexport interface BlacOptions {\n /**\n * Keep the bloc alive when its ref count reaches 0. `false` turns off a\n * `keepAlive` inherited from a base class.\n */\n keepAlive?: boolean;\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 * Explicit, minification-safe identity for this bloc class. Falls back to\n * `constructor.name` when unset, which collides across classes once a\n * minifier shortens class names.\n */\n name?: string;\n}\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 * @blac({ keepAlive: true, key: (args) => args.userId })\n * class UserBloc extends Cubit<UserState> {}\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 (options.keepAlive !== undefined) {\n (target as any)[BLAC_STATIC_PROPS.KEEP_ALIVE] = options.keepAlive;\n }\n if (options.excludeFromDevTools) {\n (target as any)[BLAC_STATIC_PROPS.EXCLUDE_FROM_DEVTOOLS] = true;\n }\n if (typeof options.equality === 'function') {\n (target as any)[BLAC_STATIC_PROPS.EQUALITY] = options.equality;\n }\n if (typeof options.key === 'function') {\n (target as any)[BLAC_STATIC_PROPS.KEY] = options.key;\n }\n if (typeof options.name === 'string') {\n (target as any)[BLAC_STATIC_PROPS.BLAC_NAME] = options.name;\n }\n return target;\n };\n}\n","import { ALL_PATHS } from '@dirtytalk/structural';\nimport { ON_DISPOSE } from '../core/symbols';\nimport { getRegistry } from '../registry';\nimport { resolveInstanceKey } from '../registry/acquire';\nimport type { StateContainerRegistry } from '../core/StateContainerRegistry';\nimport type {\n ExtractArgs,\n StateContainerConstructor,\n StateContainerInstance,\n} from '../types/utilities';\n\nconst STOP: unique symbol = Symbol('watch.STOP');\ntype StopSymbol = typeof STOP;\n\nconst BLOC_REF_MARKER = Symbol('BlocRef');\n\n/**\n * Reference to a specific bloc instance, identified by class + the resolved\n * key derived from its `args`.\n */\nexport interface BlocRef<T extends StateContainerConstructor> {\n [BLOC_REF_MARKER]: true;\n blocClass: T;\n /** @internal The resolved instance key (derived from `args`). */\n instanceId: string;\n /**\n * @internal The `args` used to derive `instanceId`. Forwarded to\n * `registry.acquire` so a not-yet-created instance is initialized with\n * these args instead of `undefined`.\n */\n args?: unknown;\n}\n\n/**\n * Create a reference to a specific bloc instance, identified by its `args`.\n * The key is derived the same way `useBloc`/`acquire` derive it.\n *\n * @example\n * ```ts\n * watch(instance(UserBloc, { userId: 'user-123' }), (userBloc) => {\n * console.log(userBloc.state.name);\n * });\n * ```\n */\nexport function instance<T extends StateContainerConstructor>(\n BlocClass: T,\n args?: ExtractArgs<T>,\n): BlocRef<T> {\n return {\n [BLOC_REF_MARKER]: true,\n blocClass: BlocClass,\n instanceId: resolveInstanceKey(BlocClass, args),\n args,\n };\n}\n\nfunction isBlocRef(\n input: unknown,\n): input is BlocRef<StateContainerConstructor> {\n return (\n typeof input === 'object' && input !== null && BLOC_REF_MARKER in input\n );\n}\n\ntype BlocInput = StateContainerConstructor | BlocRef<StateContainerConstructor>;\n\n/**\n * Options for `watch`.\n */\nexport interface WatchOptions {\n /**\n * When `false`, `watch` observes passively: it neither creates a missing\n * instance nor takes a real ownership ref on an existing one. If the\n * instance does not exist yet, the callback simply never fires — `watch`\n * does not poll; call it again once the instance exists.\n *\n * Defaults to `true`.\n */\n create?: boolean;\n}\n\ntype ExtractInstance<T> =\n T extends BlocRef<infer C>\n ? InstanceType<C>\n : T extends StateContainerConstructor\n ? InstanceType<T>\n : never;\n\ntype ExtractInstances<T extends readonly BlocInput[]> = {\n [K in keyof T]: ExtractInstance<T[K]>;\n};\n\n/**\n * Watch function signature for single bloc.\n */\nexport interface WatchSingleFn {\n <T extends StateContainerConstructor>(\n bloc: T | BlocRef<T>,\n callback: (bloc: InstanceType<T>) => void | StopSymbol,\n options?: WatchOptions,\n ): () => void;\n\n STOP: StopSymbol;\n}\n\n/**\n * Watch function signature for multiple blocs.\n */\nexport interface WatchMultipleFn {\n <T extends readonly BlocInput[]>(\n blocs: T,\n callback: (blocs: ExtractInstances<T>) => void | StopSymbol,\n options?: WatchOptions,\n ): () => void;\n\n STOP: StopSymbol;\n}\n\n/**\n * Combined watch function type.\n */\nexport interface WatchFn extends WatchSingleFn {\n <T extends readonly BlocInput[]>(\n blocs: T,\n callback: (blocs: ExtractInstances<T>) => void | StopSymbol,\n options?: WatchOptions,\n ): () => void;\n}\n\n/**\n * Class + resolved key + args needed to (re-)acquire a specific instance.\n * `watch` keeps this around per input so it can re-acquire the same logical\n * instance if the underlying container is disposed elsewhere.\n */\ninterface WatchTarget {\n blocClass: StateContainerConstructor;\n key: string;\n args: unknown;\n}\n\nfunction toWatchTarget(\n registry: StateContainerRegistry,\n input: BlocInput,\n): WatchTarget {\n if (isBlocRef(input)) {\n return {\n blocClass: input.blocClass,\n key: input.instanceId,\n args: input.args,\n };\n }\n return {\n blocClass: input,\n key: registry.resolveKey(input, undefined, undefined),\n args: undefined,\n };\n}\n\nlet watchRefSeq = 0;\n\n/**\n * Acquire a real ref (countRef: true) for the target, carrying its `args`\n * through so a not-yet-created instance is initialized correctly. The\n * caller is responsible for releasing `refId` in cleanup.\n */\nfunction resolveBloc(\n registry: StateContainerRegistry,\n target: WatchTarget,\n refId: string,\n): StateContainerInstance {\n return registry.acquire(target.blocClass, target.key, {\n countRef: true,\n refId,\n args: target.args,\n });\n}\n\n/**\n * Passive lookup for `{ create: false }`: never creates the instance and\n * never takes a ref. Returns `undefined` when no instance currently exists.\n */\nfunction resolveBlocPassive(\n registry: StateContainerRegistry,\n target: WatchTarget,\n): StateContainerInstance | undefined {\n try {\n return registry.acquire(target.blocClass, target.key, {\n canCreate: false,\n countRef: false,\n args: target.args,\n });\n } catch {\n return undefined;\n }\n}\n\nfunction isArray(input: unknown): input is readonly BlocInput[] {\n return Array.isArray(input);\n}\n\n/**\n * Watch one or more blocs for state changes.\n *\n * Thin wrapper around `container.channel.subscribe(ALL_PATHS, ...)`. The\n * callback fires once immediately, then on every state change of any of the\n * passed blocs. Returning `watch.STOP` from the callback tears down all\n * subscriptions. Subscriptions are microtask-deferred, so callbacks land\n * asynchronously after `emit()`.\n *\n * By default `watch` creates the instance if it does not exist and holds a\n * real ownership ref until `unwatch`, matching `acquire`. Pass\n * `{ create: false }` to observe passively instead — see `WatchOptions`.\n *\n * @example Single bloc\n * ```ts\n * const unwatch = watch(UserBloc, (userBloc) => {\n * console.log(userBloc.state.name);\n * });\n * ```\n *\n * @example Multiple blocs\n * ```ts\n * const unwatch = watch(\n * [UserBloc, SettingsBloc] as const,\n * ([userBloc, settingsBloc]) => {\n * console.log(userBloc.state.name, settingsBloc.state.theme);\n * }\n * );\n * ```\n *\n * @example With specific instance\n * ```ts\n * const unwatch = watch(\n * instance(UserBloc, { userId: 'user-123' }),\n * (userBloc) => {\n * console.log(userBloc.state.name);\n * }\n * );\n * ```\n *\n * @example Stop watching from callback\n * ```ts\n * const unwatch = watch(UserBloc, (userBloc) => {\n * if (userBloc.state.done) {\n * return watch.STOP;\n * }\n * });\n * ```\n */\nfunction watchImpl<T extends StateContainerConstructor>(\n bloc: T | BlocRef<T>,\n callback: (bloc: InstanceType<T>) => void | StopSymbol,\n options?: WatchOptions,\n): () => void;\n\nfunction watchImpl<T extends readonly BlocInput[]>(\n blocs: T,\n callback: (blocs: ExtractInstances<T>) => void | StopSymbol,\n options?: WatchOptions,\n): () => void;\n\nfunction watchImpl(\n blocsOrBloc: BlocInput | readonly BlocInput[],\n callback: (blocsOrBloc: any) => void | StopSymbol,\n options?: WatchOptions,\n): () => void {\n const isSingle = !isArray(blocsOrBloc);\n const inputs = isSingle ? [blocsOrBloc] : blocsOrBloc;\n const registry = getRegistry();\n const create = options?.create ?? true;\n\n const targets = inputs.map((input) => toWatchTarget(registry, input));\n const refIds = targets.map(() => `_watch_${watchRefSeq++}`);\n const resolveAt = (index: number) =>\n create\n ? resolveBloc(registry, targets[index], refIds[index])\n : resolveBlocPassive(registry, targets[index]);\n\n let disposed = false;\n const instances: Array<StateContainerInstance | undefined> = [];\n const channelUnsubs: Array<(() => void) | undefined> = [];\n const disposedUnsubs: Array<(() => void) | undefined> = [];\n\n const cleanup = () => {\n if (disposed) return;\n disposed = true;\n for (const unsub of channelUnsubs) unsub?.();\n for (const unsub of disposedUnsubs) unsub?.();\n channelUnsubs.length = 0;\n disposedUnsubs.length = 0;\n if (create) {\n for (let i = 0; i < instances.length; i++) {\n registry.release(\n targets[i].blocClass,\n targets[i].key,\n false,\n refIds[i],\n );\n }\n }\n };\n\n const runCallback = () => {\n if (disposed) return;\n if (instances.some((i) => i === undefined)) return;\n const arg = isSingle ? instances[0] : instances;\n const result = callback(arg);\n if (result === STOP) cleanup();\n };\n\n const subscribeAt = (index: number) => {\n channelUnsubs[index] = instances[index]?.channel.subscribe(\n () => ALL_PATHS,\n runCallback,\n );\n };\n\n // On external dispose, tear down the stale subscription and re-acquire +\n // resubscribe (microtask-deferred, so it never runs mid-mutation of the\n // registry that triggered the dispose, e.g. `clearAll()`), then notify.\n const resubscribeAt = (index: number) => {\n if (disposed) return;\n instances[index] = resolveAt(index);\n subscribeAt(index);\n subscribeDisposeAt(index);\n runCallback();\n };\n\n const subscribeDisposeAt = (index: number) => {\n disposedUnsubs[index] = instances[index]?.[ON_DISPOSE](() => {\n channelUnsubs[index]?.();\n channelUnsubs[index] = undefined;\n queueMicrotask(() => resubscribeAt(index));\n });\n };\n\n try {\n for (let i = 0; i < targets.length; i++) instances.push(resolveAt(i));\n for (let i = 0; i < instances.length; i++) subscribeAt(i);\n for (let i = 0; i < instances.length; i++) subscribeDisposeAt(i);\n // Fire once immediately so the consumer sees the current state.\n runCallback();\n } catch (error) {\n cleanup();\n throw error;\n }\n\n return cleanup;\n}\n\nexport const watch: WatchFn = Object.assign(watchImpl, { STOP }) as WatchFn;\n","declare const brand: unique symbol;\n\n/**\n * Nominal type helper, preventing accidental confusion between similar\n * primitive types.\n * @typeParam T - The base type\n * @typeParam B - The brand identifier\n */\nexport type Brand<T, B> = T & { [brand]: B };\n\n/**\n * Branded string type for type-safe IDs.\n * @typeParam B - The brand identifier\n */\nexport type BrandedId<B> = Brand<string, B>;\n\n/** Branded string type for state container instance IDs. */\nexport type InstanceId = Brand<string, 'InstanceId'>;\n\nexport function instanceId(id: string): InstanceId {\n return id as InstanceId;\n}\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,26 +1,18 @@
|
|
|
1
1
|
export { configureBlac, getBlacConfig, resetBlacConfig, shallowEqualState, type BlacConfig, type EqualityFn, } from './config';
|
|
2
|
-
export { StateContainer
|
|
2
|
+
export { StateContainer } from './core/StateContainer';
|
|
3
3
|
export type { HydrationStatus, StateContainerConfig, SystemEvent, SystemEventPayloads, DepHandle, } from './core/StateContainer';
|
|
4
4
|
export { Cubit } from './core/Cubit';
|
|
5
|
-
/**
|
|
6
|
-
* @internal symbols — read by `@blac/react` (APPLY_DEPS / REMOVE_DEPS_OWNER),
|
|
7
|
-
* in-package tests (INIT_CONFIG), and `watch()` (ON_DISPOSE).
|
|
8
|
-
*/
|
|
9
|
-
export { APPLY_DEPS, REMOVE_DEPS_OWNER, INIT_CONFIG, ON_DISPOSE, } from './core/symbols';
|
|
10
5
|
export type { BlacMeta, BlacHydration } from './core/meta';
|
|
11
6
|
export { ALL_PATHS } from '@dirtytalk/structural';
|
|
12
7
|
export type { PathSet } from '@dirtytalk/structural';
|
|
13
|
-
export { acquire, resolveInstanceKey, borrow, borrowSafe, ensure, release,
|
|
8
|
+
export { acquire, resolveInstanceKey, borrow, borrowSafe, ensure, release, clear, clearAll, register, hasInstance, getRefCount, getRefIds, getAll, forEach, getRegistry, setRegistry, getStats, } from './registry';
|
|
14
9
|
export type { BorrowTarget } from './registry';
|
|
15
10
|
export { globalRegistry, StateContainerRegistry, } from './core/StateContainerRegistry';
|
|
16
11
|
export type { LifecycleEvent, LifecycleListener, InstanceEntry, } from './core/StateContainerRegistry';
|
|
17
12
|
export { blac, type BlacOptions } from './decorators';
|
|
18
|
-
export { isKeepAliveClass, isExcludedFromDevTools,
|
|
19
|
-
export { getPluginManager } from './core/StateContainerRegistry';
|
|
13
|
+
export { isKeepAliveClass, isExcludedFromDevTools, getBlacName, } from './utils/static-props';
|
|
20
14
|
export type { BlacPlugin, BlacPluginWithInit, PluginContext, PluginConfig, InstanceMetadata, } from './plugin/BlacPlugin';
|
|
21
|
-
export {
|
|
22
|
-
export {
|
|
23
|
-
export { defineEvent, emitEvent, onEvent, type EventToken } from './events';
|
|
24
|
-
export type { StateContainerConstructor, ExtractState, ExtractStateMutable, ExtractConstructorArgs, ExtractArgs, ExtractDeps, BlocInstanceType, BlocConstructor, InstanceReadonlyState, InstanceState, StateContainerInstance, } from './types/utilities';
|
|
15
|
+
export { watch, instance, type WatchFn, type WatchOptions, type BlocRef, } from './watch';
|
|
16
|
+
export type { StateContainerConstructor, DeepReadonly, ExtractState, ExtractStateMutable, ExtractArgs, ExtractDeps, InstanceReadonlyState, WithState, InstanceState, StateContainerInstance, } from './types/utilities';
|
|
25
17
|
export type { Brand, BrandedId, InstanceId } from './types/branded';
|
|
26
18
|
export { instanceId } from './types/branded';
|