@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
|
@@ -3,24 +3,16 @@ import type { BlacPlugin, PluginConfig } from './BlacPlugin';
|
|
|
3
3
|
/**
|
|
4
4
|
* Manages plugin lifecycle for the BlaC state management system.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* Hooks into registry lifecycle events (synchronous) and per-container
|
|
7
|
+
* channel flushes (microtask-coalesced): while at least one installed
|
|
8
|
+
* plugin implements `onStateChange`, the manager subscribes each container
|
|
9
|
+
* with `ALL_PATHS` interest and dispatches
|
|
10
|
+
* `onStateChange(ctx, prev, next, paths)` on every flush.
|
|
7
11
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* container, the manager subscribes once at create-time with
|
|
13
|
-
* `ALL_PATHS` interest and stashes `prevState`. On every flush it
|
|
14
|
-
* captures the new state + the changed `PathSet` and dispatches
|
|
15
|
-
* `onStateChange(ctx, prev, next, paths)` to every enabled plugin.
|
|
16
|
-
*
|
|
17
|
-
* The `ALL_PATHS` subscription cost: plugins counted as a consumer with
|
|
18
|
-
* `ALL_PATHS` interest will defeat the single-consumer-skip optimization
|
|
19
|
-
* in `StructuralContainer`. This is the intended trade-off — devtools /
|
|
20
|
-
* persist plugins genuinely want every change, and stateful plugins
|
|
21
|
-
* (logging) can decode `paths` via `container.interner.lookup(id)` to log
|
|
22
|
-
* only relevant fields. Plugins that want low overhead should remain
|
|
23
|
-
* uninstalled or environment-gated.
|
|
12
|
+
* `ALL_PATHS` interest defeats the single-consumer-skip optimization in
|
|
13
|
+
* `StructuralContainer` — an intended trade-off for plugins that genuinely
|
|
14
|
+
* want every change (devtools/persist). Plugins that want low overhead
|
|
15
|
+
* should remain uninstalled or environment-gated.
|
|
24
16
|
*
|
|
25
17
|
* @example
|
|
26
18
|
* ```ts
|
|
@@ -33,11 +25,20 @@ export declare class PluginManager {
|
|
|
33
25
|
private registry;
|
|
34
26
|
private lifecycleUnsubscribers;
|
|
35
27
|
/**
|
|
36
|
-
* Per-container channel-bridge bookkeeping
|
|
37
|
-
* torn down at `disposed`. Holds the rolling `prevState`
|
|
38
|
-
*
|
|
28
|
+
* Per-container channel-bridge bookkeeping, subscribed at `created` and
|
|
29
|
+
* torn down at `disposed`/`destroy()`. Holds the rolling `prevState`
|
|
30
|
+
* snapshot handed to plugins on each flush.
|
|
31
|
+
*
|
|
32
|
+
* Strong, not a `WeakMap`, because `destroy()` must enumerate live bridges
|
|
33
|
+
* to unsubscribe them; entries are removed on `disposed`, so this never
|
|
34
|
+
* outlives the registry's own reference.
|
|
39
35
|
*/
|
|
40
36
|
private containerBridges;
|
|
37
|
+
/**
|
|
38
|
+
* One `PluginContext` per container, safe to reuse since it closes only
|
|
39
|
+
* over `registry`/`container`, both stable for the container's lifetime.
|
|
40
|
+
*/
|
|
41
|
+
private contextCache;
|
|
41
42
|
/**
|
|
42
43
|
* Create a new PluginManager
|
|
43
44
|
* @param registry - The StateContainerRegistry to monitor for lifecycle events
|
|
@@ -81,69 +82,55 @@ export declare class PluginManager {
|
|
|
81
82
|
/**
|
|
82
83
|
* Wire registry lifecycle events into plugin dispatch.
|
|
83
84
|
*
|
|
84
|
-
* `onStateChange` is
|
|
85
|
-
* that event lacks the `PathSet` payload. Instead
|
|
86
|
-
*
|
|
87
|
-
* `(
|
|
85
|
+
* `onStateChange` is not wired through `registry.on('stateChanged', …)` —
|
|
86
|
+
* that event lacks the `PathSet` payload. Instead each `created` subscribes
|
|
87
|
+
* to the container's channel directly for `paths`, pairing it with
|
|
88
|
+
* `(prev, next)` from the per-container snapshot.
|
|
88
89
|
*/
|
|
89
90
|
private setupLifecycleHooks;
|
|
90
91
|
/**
|
|
91
|
-
* Subscribe to the container's channel with `ALL_PATHS` interest
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
* Per-container bookkeeping is stored in a `WeakMap` keyed by the
|
|
97
|
-
* container itself, so a disposed/GC'd container drops cleanly.
|
|
92
|
+
* Subscribe to the container's channel with `ALL_PATHS` interest so it
|
|
93
|
+
* fires on every flush. `prev` is the snapshot from the previous flush (or
|
|
94
|
+
* create-time for the first); the channel's `paths` is passed straight
|
|
95
|
+
* through to plugins.
|
|
98
96
|
*/
|
|
99
97
|
private attachStateBridge;
|
|
100
98
|
private detachStateBridge;
|
|
99
|
+
private hasStateChangePlugin;
|
|
100
|
+
private detachAllStateBridges;
|
|
101
101
|
/**
|
|
102
|
-
* Backfill a newly-installed plugin with
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
* `attachStateBridge`) and, if the plugin implements `onCreated`, invoking
|
|
107
|
-
* it directly for each instance. Scoped to this single plugin only — the
|
|
108
|
-
* broadcast `notifyPlugins` would re-notify *every* plugin of *every*
|
|
109
|
-
* instance, which is wrong here.
|
|
102
|
+
* Backfill a newly-installed plugin with existing instances: attach the
|
|
103
|
+
* state bridge (idempotent) if it implements `onStateChange`, and invoke
|
|
104
|
+
* `onCreated` for each. Scoped to this plugin only — `notifyPlugins` would
|
|
105
|
+
* wrongly re-notify every plugin of every instance.
|
|
110
106
|
*/
|
|
111
107
|
private backfillPlugin;
|
|
112
108
|
/**
|
|
113
|
-
* Channel-flush callback.
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
* Note: `prev` is captured once and reused across plugins — every
|
|
118
|
-
* plugin sees the same `prev`/`next`/`paths` regardless of dispatch
|
|
119
|
-
* order, matching the "snapshot prev once per flush" invariant.
|
|
109
|
+
* Channel-flush callback. Hands `(prev, next, paths)` to every enabled
|
|
110
|
+
* plugin's `onStateChange`, then updates `prevState` for the next flush.
|
|
111
|
+
* `prev` is captured once and reused across plugins, so every plugin sees
|
|
112
|
+
* the same values regardless of dispatch order.
|
|
120
113
|
*/
|
|
121
114
|
private dispatchStateChange;
|
|
122
115
|
/**
|
|
123
|
-
* Notify all plugins of a lifecycle event.
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* `ctx.container`), so plugins can reach the focal bloc through
|
|
127
|
-
* `ctx.container`. The context is built lazily on the first matching
|
|
128
|
-
* hook and reused for every other plugin in this dispatch — zero
|
|
129
|
-
* builds if no enabled plugin implements `hookName`.
|
|
116
|
+
* Notify all plugins of a lifecycle event. Builds a `PluginContext` lazily
|
|
117
|
+
* on the first matching hook and reuses it for the rest of this dispatch —
|
|
118
|
+
* zero builds if no enabled plugin implements `hookName`.
|
|
130
119
|
*/
|
|
131
120
|
private notifyPlugins;
|
|
132
121
|
/**
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
* This sidesteps the lifetime question of "when do we evict a cached
|
|
137
|
-
* context?" and keeps `paths`-vs-`container` lifetimes cleanly
|
|
138
|
-
* separated.
|
|
122
|
+
* Get the `PluginContext` for a focal container, building it once and
|
|
123
|
+
* reusing it thereafter (evicted via the `WeakMap` when the container
|
|
124
|
+
* dies). `undefined` (install-time) is never cached.
|
|
139
125
|
*/
|
|
140
126
|
private buildContext;
|
|
127
|
+
private createContext;
|
|
141
128
|
/**
|
|
142
129
|
* Check if plugin should be enabled based on environment
|
|
143
130
|
*/
|
|
144
131
|
private shouldEnablePlugin;
|
|
145
132
|
/**
|
|
146
|
-
*
|
|
133
|
+
* Same rule as `IS_DEV`: an unknown environment counts as production.
|
|
147
134
|
*/
|
|
148
135
|
private getCurrentEnvironment;
|
|
149
136
|
}
|
package/dist/plugins.cjs
CHANGED
|
@@ -1,4 +1,384 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_StateContainerRegistry = require("./StateContainerRegistry-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
const require_StateContainerRegistry = require("./StateContainerRegistry-DjQQtlCW.cjs");
|
|
3
|
+
let _dirtytalk_structural = require("@dirtytalk/structural");
|
|
4
|
+
//#region src/plugin/PluginManager.ts
|
|
5
|
+
/**
|
|
6
|
+
* Manages plugin lifecycle for the BlaC state management system.
|
|
7
|
+
*
|
|
8
|
+
* Hooks into registry lifecycle events (synchronous) and per-container
|
|
9
|
+
* channel flushes (microtask-coalesced): while at least one installed
|
|
10
|
+
* plugin implements `onStateChange`, the manager subscribes each container
|
|
11
|
+
* with `ALL_PATHS` interest and dispatches
|
|
12
|
+
* `onStateChange(ctx, prev, next, paths)` on every flush.
|
|
13
|
+
*
|
|
14
|
+
* `ALL_PATHS` interest defeats the single-consumer-skip optimization in
|
|
15
|
+
* `StructuralContainer` — an intended trade-off for plugins that genuinely
|
|
16
|
+
* want every change (devtools/persist). Plugins that want low overhead
|
|
17
|
+
* should remain uninstalled or environment-gated.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const manager = createPluginManager(registry);
|
|
22
|
+
* manager.install(myPlugin, { environment: 'development' });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
var PluginManager = class {
|
|
26
|
+
/**
|
|
27
|
+
* Create a new PluginManager
|
|
28
|
+
* @param registry - The StateContainerRegistry to monitor for lifecycle events
|
|
29
|
+
*/
|
|
30
|
+
constructor(registry) {
|
|
31
|
+
this.plugins = /* @__PURE__ */ new Map();
|
|
32
|
+
this.lifecycleUnsubscribers = [];
|
|
33
|
+
this.containerBridges = /* @__PURE__ */ new Map();
|
|
34
|
+
this.contextCache = /* @__PURE__ */ new WeakMap();
|
|
35
|
+
this.registry = registry;
|
|
36
|
+
this.setupLifecycleHooks();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Install a plugin with optional configuration
|
|
40
|
+
* @param plugin - The plugin to install
|
|
41
|
+
* @param config - Optional plugin configuration
|
|
42
|
+
* @throws Error if plugin is already installed
|
|
43
|
+
*/
|
|
44
|
+
install(plugin, config = {}) {
|
|
45
|
+
const effectiveConfig = {
|
|
46
|
+
enabled: true,
|
|
47
|
+
environment: "all",
|
|
48
|
+
...config
|
|
49
|
+
};
|
|
50
|
+
if (!this.shouldEnablePlugin(effectiveConfig)) {
|
|
51
|
+
if (require_StateContainerRegistry.IS_DEV) console.log(`[BlaC] Plugin "${plugin.name}" skipped (environment mismatch)`);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (this.plugins.has(plugin.name)) throw new Error(`Plugin "${plugin.name}" is already installed`);
|
|
55
|
+
const installContext = this.buildContext(void 0);
|
|
56
|
+
if (plugin.onInstall) try {
|
|
57
|
+
plugin.onInstall(installContext);
|
|
58
|
+
} catch (error) {
|
|
59
|
+
console.error(`[BlaC] Error installing plugin "${plugin.name}":`, error);
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
this.plugins.set(plugin.name, {
|
|
63
|
+
plugin,
|
|
64
|
+
config: effectiveConfig,
|
|
65
|
+
installContext
|
|
66
|
+
});
|
|
67
|
+
this.backfillPlugin(plugin);
|
|
68
|
+
if (require_StateContainerRegistry.IS_DEV) console.log(`[BlaC] Plugin "${plugin.name}" v${plugin.version} installed`);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Uninstall a plugin by name
|
|
72
|
+
* @param pluginName - The name of the plugin to uninstall
|
|
73
|
+
* @throws Error if plugin is not installed
|
|
74
|
+
*/
|
|
75
|
+
uninstall(pluginName) {
|
|
76
|
+
const installed = this.plugins.get(pluginName);
|
|
77
|
+
if (!installed) throw new Error(`Plugin "${pluginName}" is not installed`);
|
|
78
|
+
if (installed.plugin.onUninstall) try {
|
|
79
|
+
installed.plugin.onUninstall();
|
|
80
|
+
} catch (error) {
|
|
81
|
+
console.error(`[BlaC] Error uninstalling plugin "${pluginName}":`, error);
|
|
82
|
+
}
|
|
83
|
+
this.plugins.delete(pluginName);
|
|
84
|
+
if (!this.hasStateChangePlugin()) this.detachAllStateBridges();
|
|
85
|
+
if (require_StateContainerRegistry.IS_DEV) console.log(`[BlaC] Plugin "${pluginName}" uninstalled`);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get an installed plugin by name
|
|
89
|
+
* @param pluginName - The name of the plugin to retrieve
|
|
90
|
+
* @returns The plugin instance or undefined if not found
|
|
91
|
+
*/
|
|
92
|
+
getPlugin(pluginName) {
|
|
93
|
+
return this.plugins.get(pluginName)?.plugin;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get all installed plugins
|
|
97
|
+
* @returns Array of all installed plugins
|
|
98
|
+
*/
|
|
99
|
+
getAllPlugins() {
|
|
100
|
+
return Array.from(this.plugins.values()).map((p) => p.plugin);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if a plugin is installed
|
|
104
|
+
* @param pluginName - The name of the plugin to check
|
|
105
|
+
* @returns true if the plugin is installed
|
|
106
|
+
*/
|
|
107
|
+
hasPlugin(pluginName) {
|
|
108
|
+
return this.plugins.has(pluginName);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Uninstall all plugins
|
|
112
|
+
*/
|
|
113
|
+
clear() {
|
|
114
|
+
for (const name of this.plugins.keys()) this.uninstall(name);
|
|
115
|
+
}
|
|
116
|
+
destroy() {
|
|
117
|
+
this.clear();
|
|
118
|
+
for (const unsub of this.lifecycleUnsubscribers) unsub();
|
|
119
|
+
this.lifecycleUnsubscribers = [];
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Wire registry lifecycle events into plugin dispatch.
|
|
123
|
+
*
|
|
124
|
+
* `onStateChange` is not wired through `registry.on('stateChanged', …)` —
|
|
125
|
+
* that event lacks the `PathSet` payload. Instead each `created` subscribes
|
|
126
|
+
* to the container's channel directly for `paths`, pairing it with
|
|
127
|
+
* `(prev, next)` from the per-container snapshot.
|
|
128
|
+
*/
|
|
129
|
+
setupLifecycleHooks() {
|
|
130
|
+
this.lifecycleUnsubscribers = [
|
|
131
|
+
this.registry.on("created", (instance) => {
|
|
132
|
+
if (this.hasStateChangePlugin()) this.attachStateBridge(instance);
|
|
133
|
+
this.notifyPlugins("onCreated", instance);
|
|
134
|
+
}),
|
|
135
|
+
this.registry.on("disposed", (instance) => {
|
|
136
|
+
this.notifyPlugins("onDestroyed", instance);
|
|
137
|
+
this.detachStateBridge(instance);
|
|
138
|
+
}),
|
|
139
|
+
this.registry.on("refAcquired", (instance, refId) => {
|
|
140
|
+
this.notifyPlugins("onRefAcquired", instance, refId);
|
|
141
|
+
}),
|
|
142
|
+
this.registry.on("refReleased", (instance, refId) => {
|
|
143
|
+
this.notifyPlugins("onRefReleased", instance, refId);
|
|
144
|
+
}),
|
|
145
|
+
this.registry.on("depsChanged", (instance, previousDeps, currentDeps) => {
|
|
146
|
+
this.notifyPlugins("onDepsChanged", instance, previousDeps, currentDeps);
|
|
147
|
+
}),
|
|
148
|
+
this.registry.on("hydrationChanged", (instance, status, previousStatus) => {
|
|
149
|
+
this.notifyPlugins("onHydrationChange", instance, status, previousStatus);
|
|
150
|
+
}),
|
|
151
|
+
this.registry.on("activated", (instance, signal) => {
|
|
152
|
+
this.notifyPlugins("onActivate", instance, signal);
|
|
153
|
+
}),
|
|
154
|
+
this.registry.on("deactivated", (instance) => {
|
|
155
|
+
this.notifyPlugins("onDeactivate", instance);
|
|
156
|
+
})
|
|
157
|
+
];
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Subscribe to the container's channel with `ALL_PATHS` interest so it
|
|
161
|
+
* fires on every flush. `prev` is the snapshot from the previous flush (or
|
|
162
|
+
* create-time for the first); the channel's `paths` is passed straight
|
|
163
|
+
* through to plugins.
|
|
164
|
+
*/
|
|
165
|
+
attachStateBridge(container) {
|
|
166
|
+
if (this.containerBridges.has(container)) return;
|
|
167
|
+
const bridge = {
|
|
168
|
+
unsub: () => {},
|
|
169
|
+
prevState: container.state
|
|
170
|
+
};
|
|
171
|
+
this.containerBridges.set(container, bridge);
|
|
172
|
+
bridge.unsub = container.channel.subscribe(() => _dirtytalk_structural.ALL_PATHS, (paths) => this.dispatchStateChange(container, paths));
|
|
173
|
+
}
|
|
174
|
+
detachStateBridge(container) {
|
|
175
|
+
const bridge = this.containerBridges.get(container);
|
|
176
|
+
if (!bridge) return;
|
|
177
|
+
bridge.unsub();
|
|
178
|
+
this.containerBridges.delete(container);
|
|
179
|
+
}
|
|
180
|
+
hasStateChangePlugin() {
|
|
181
|
+
for (const { plugin } of this.plugins.values()) if (plugin.onStateChange) return true;
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
detachAllStateBridges() {
|
|
185
|
+
for (const bridge of this.containerBridges.values()) bridge.unsub();
|
|
186
|
+
this.containerBridges.clear();
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Backfill a newly-installed plugin with existing instances: attach the
|
|
190
|
+
* state bridge (idempotent) if it implements `onStateChange`, and invoke
|
|
191
|
+
* `onCreated` for each. Scoped to this plugin only — `notifyPlugins` would
|
|
192
|
+
* wrongly re-notify every plugin of every instance.
|
|
193
|
+
*/
|
|
194
|
+
backfillPlugin(plugin) {
|
|
195
|
+
if (!plugin.onStateChange && !plugin.onCreated) return;
|
|
196
|
+
for (const Type of this.registry.getTypes()) for (const instance of this.registry.getAll(Type)) {
|
|
197
|
+
const container = instance;
|
|
198
|
+
if (plugin.onStateChange) this.attachStateBridge(container);
|
|
199
|
+
if (!plugin.onCreated) continue;
|
|
200
|
+
try {
|
|
201
|
+
plugin.onCreated(this.buildContext(container));
|
|
202
|
+
} catch (error) {
|
|
203
|
+
console.error(`[BlaC] Error in plugin "${plugin.name}" onCreated (backfill):`, error);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Channel-flush callback. Hands `(prev, next, paths)` to every enabled
|
|
209
|
+
* plugin's `onStateChange`, then updates `prevState` for the next flush.
|
|
210
|
+
* `prev` is captured once and reused across plugins, so every plugin sees
|
|
211
|
+
* the same values regardless of dispatch order.
|
|
212
|
+
*/
|
|
213
|
+
dispatchStateChange(container, paths) {
|
|
214
|
+
const bridge = this.containerBridges.get(container);
|
|
215
|
+
if (!bridge) return;
|
|
216
|
+
const prev = bridge.prevState;
|
|
217
|
+
const next = container.state;
|
|
218
|
+
bridge.prevState = next;
|
|
219
|
+
let ctx;
|
|
220
|
+
for (const { plugin, config } of this.plugins.values()) {
|
|
221
|
+
if (!config.enabled) continue;
|
|
222
|
+
const hook = plugin.onStateChange;
|
|
223
|
+
if (typeof hook !== "function") continue;
|
|
224
|
+
try {
|
|
225
|
+
ctx ??= this.buildContext(container);
|
|
226
|
+
hook.call(plugin, ctx, prev, next, paths);
|
|
227
|
+
} catch (error) {
|
|
228
|
+
console.error(`[BlaC] Error in plugin "${plugin.name}" onStateChange:`, error);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Notify all plugins of a lifecycle event. Builds a `PluginContext` lazily
|
|
234
|
+
* on the first matching hook and reuses it for the rest of this dispatch —
|
|
235
|
+
* zero builds if no enabled plugin implements `hookName`.
|
|
236
|
+
*/
|
|
237
|
+
notifyPlugins(hookName, instance, ...extraArgs) {
|
|
238
|
+
let ctx;
|
|
239
|
+
for (const { plugin, config } of this.plugins.values()) {
|
|
240
|
+
if (!config.enabled) continue;
|
|
241
|
+
const hook = plugin[hookName];
|
|
242
|
+
if (typeof hook !== "function") continue;
|
|
243
|
+
try {
|
|
244
|
+
ctx ??= this.buildContext(instance);
|
|
245
|
+
hook.call(plugin, ctx, ...extraArgs);
|
|
246
|
+
} catch (error) {
|
|
247
|
+
console.error(`[BlaC] Error in plugin "${plugin.name}" ${hookName}:`, error);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get the `PluginContext` for a focal container, building it once and
|
|
253
|
+
* reusing it thereafter (evicted via the `WeakMap` when the container
|
|
254
|
+
* dies). `undefined` (install-time) is never cached.
|
|
255
|
+
*/
|
|
256
|
+
buildContext(container) {
|
|
257
|
+
if (container !== void 0) {
|
|
258
|
+
const cached = this.contextCache.get(container);
|
|
259
|
+
if (cached) return cached;
|
|
260
|
+
}
|
|
261
|
+
const context = this.createContext(container);
|
|
262
|
+
if (container !== void 0) this.contextCache.set(container, context);
|
|
263
|
+
return context;
|
|
264
|
+
}
|
|
265
|
+
createContext(container) {
|
|
266
|
+
const registry = this.registry;
|
|
267
|
+
return {
|
|
268
|
+
container,
|
|
269
|
+
getInstanceMetadata: (instance) => {
|
|
270
|
+
return {
|
|
271
|
+
id: instance.$blac.id,
|
|
272
|
+
className: require_StateContainerRegistry.getBlacName(instance.constructor),
|
|
273
|
+
isDisposed: instance.$blac.disposed,
|
|
274
|
+
name: instance.$blac.name,
|
|
275
|
+
createdAt: instance.$blac.createdAt,
|
|
276
|
+
state: instance.state,
|
|
277
|
+
hydrationStatus: instance.$blac.hydration.status,
|
|
278
|
+
isHydrated: instance.$blac.hydration.isHydrated,
|
|
279
|
+
hydrationError: instance.$blac.hydration.error,
|
|
280
|
+
changedWhileHydrating: instance.$blac.hydration.changedWhileHydrating,
|
|
281
|
+
args: instance.args
|
|
282
|
+
};
|
|
283
|
+
},
|
|
284
|
+
getState: (instance) => {
|
|
285
|
+
return instance.state;
|
|
286
|
+
},
|
|
287
|
+
getHydrationStatus: (instance) => {
|
|
288
|
+
return instance.$blac.hydration.status;
|
|
289
|
+
},
|
|
290
|
+
startHydration: (instance) => {
|
|
291
|
+
instance.$blac.hydration.begin();
|
|
292
|
+
},
|
|
293
|
+
applyHydratedState: (instance, state) => {
|
|
294
|
+
return instance.$blac.hydration.apply(state);
|
|
295
|
+
},
|
|
296
|
+
finishHydration: (instance) => {
|
|
297
|
+
instance.$blac.hydration.finish();
|
|
298
|
+
},
|
|
299
|
+
failHydration: (instance, error) => {
|
|
300
|
+
instance.$blac.hydration.fail(error);
|
|
301
|
+
},
|
|
302
|
+
waitForHydration: (instance) => {
|
|
303
|
+
return instance.$blac.hydration.wait();
|
|
304
|
+
},
|
|
305
|
+
queryInstances: (typeClass) => {
|
|
306
|
+
return registry.getAll(typeClass);
|
|
307
|
+
},
|
|
308
|
+
getAllTypes: () => {
|
|
309
|
+
return registry.getTypes();
|
|
310
|
+
},
|
|
311
|
+
getStats: () => {
|
|
312
|
+
return registry.getStats();
|
|
313
|
+
},
|
|
314
|
+
getRefIds: (instanceId) => {
|
|
315
|
+
return registry.getRefIdsById(instanceId);
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Check if plugin should be enabled based on environment
|
|
321
|
+
*/
|
|
322
|
+
shouldEnablePlugin(config) {
|
|
323
|
+
if (!config.enabled) return false;
|
|
324
|
+
if (config.environment === "all") return true;
|
|
325
|
+
return this.getCurrentEnvironment() === config.environment;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Same rule as `IS_DEV`: an unknown environment counts as production.
|
|
329
|
+
*/
|
|
330
|
+
getCurrentEnvironment() {
|
|
331
|
+
const env = require_StateContainerRegistry.readNodeEnv();
|
|
332
|
+
if (env === void 0 || env === "production") return "production";
|
|
333
|
+
return env === "test" ? "test" : "development";
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
/**
|
|
337
|
+
* Create a plugin manager instance
|
|
338
|
+
* @param registry - The StateContainerRegistry to monitor for lifecycle events
|
|
339
|
+
* @returns A new PluginManager instance
|
|
340
|
+
*/
|
|
341
|
+
function createPluginManager(registry) {
|
|
342
|
+
return new PluginManager(registry);
|
|
343
|
+
}
|
|
344
|
+
//#endregion
|
|
345
|
+
//#region src/plugins.ts
|
|
346
|
+
/**
|
|
347
|
+
* Plugin system utilities for extending BlaC functionality.
|
|
348
|
+
* Import from `@blac/core/plugins`.
|
|
349
|
+
*
|
|
350
|
+
* @example
|
|
351
|
+
* ```typescript
|
|
352
|
+
* import { PluginManager, getPluginManager, type BlacPlugin } from '@blac/core/plugins';
|
|
353
|
+
*
|
|
354
|
+
* const myPlugin: BlacPlugin = {
|
|
355
|
+
* name: 'my-plugin',
|
|
356
|
+
* onCreated(context) {
|
|
357
|
+
* console.log('Instance created:', context.container);
|
|
358
|
+
* },
|
|
359
|
+
* };
|
|
360
|
+
*
|
|
361
|
+
* getPluginManager().install(myPlugin);
|
|
362
|
+
* ```
|
|
363
|
+
*
|
|
364
|
+
* @packageDocumentation
|
|
365
|
+
*/
|
|
366
|
+
const pluginManagers = /* @__PURE__ */ new WeakMap();
|
|
367
|
+
/**
|
|
368
|
+
* Get the plugin manager for a registry (the global one by default). Plugins
|
|
369
|
+
* only observe the registry they are installed on, so install them again on
|
|
370
|
+
* a scoped registry (e.g. one passed to `RegistryProvider`).
|
|
371
|
+
*/
|
|
372
|
+
function getPluginManager(registry = require_StateContainerRegistry.globalRegistry) {
|
|
373
|
+
let manager = pluginManagers.get(registry);
|
|
374
|
+
if (!manager) {
|
|
375
|
+
manager = createPluginManager(registry);
|
|
376
|
+
pluginManagers.set(registry, manager);
|
|
377
|
+
}
|
|
378
|
+
return manager;
|
|
379
|
+
}
|
|
380
|
+
//#endregion
|
|
381
|
+
exports.PluginManager = PluginManager;
|
|
382
|
+
exports.getPluginManager = getPluginManager;
|
|
383
|
+
|
|
384
|
+
//# sourceMappingURL=plugins.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.cjs","names":["IS_DEV","ALL_PATHS","getBlacName","readNodeEnv","globalRegistry"],"sources":["../src/plugin/PluginManager.ts","../src/plugins.ts"],"sourcesContent":["import { ALL_PATHS, type PathSet } from '@dirtytalk/structural';\nimport type { StateContainer } from '../core/StateContainer';\nimport { IS_DEV, readNodeEnv } from '../constants';\nimport { getBlacName } from '../utils/static-props';\nimport type { StateContainerConstructor } from '../types/utilities';\nimport type { StateContainerRegistry } from '../core/StateContainerRegistry';\nimport type {\n BlacPlugin,\n PluginContext,\n PluginConfig,\n InstanceMetadata,\n} from './BlacPlugin';\n\n/**\n * Internal structure for tracking installed plugins.\n *\n * `installContext` is the context handed to `onInstall` — it has no\n * `container`. Per-container contexts are built on demand by\n * `buildContext()` so each event carries the right focal container\n * without mutating a shared object.\n * @internal\n */\ninterface InstalledPlugin {\n plugin: BlacPlugin;\n config: PluginConfig;\n installContext: PluginContext;\n}\n\n/**\n * Per-container bookkeeping for the channel-bridge plugin dispatcher.\n *\n * - `unsub` tears down the channel subscription on dispose.\n * - `prevState` is the state snapshot the manager will hand plugins as\n * `prev` on the next flush; it is updated to the post-flush state after\n * each dispatch.\n * @internal\n */\ninterface ContainerBridge {\n unsub: () => void;\n prevState: any;\n}\n\n/**\n * Manages plugin lifecycle for the BlaC state management system.\n *\n * Hooks into registry lifecycle events (synchronous) and per-container\n * channel flushes (microtask-coalesced): while at least one installed\n * plugin implements `onStateChange`, the manager subscribes each container\n * with `ALL_PATHS` interest and dispatches\n * `onStateChange(ctx, prev, next, paths)` on every flush.\n *\n * `ALL_PATHS` interest defeats the single-consumer-skip optimization in\n * `StructuralContainer` — an intended trade-off for plugins that genuinely\n * want every change (devtools/persist). Plugins that want low overhead\n * should remain uninstalled or environment-gated.\n *\n * @example\n * ```ts\n * const manager = createPluginManager(registry);\n * manager.install(myPlugin, { environment: 'development' });\n * ```\n */\nexport class PluginManager {\n private plugins = new Map<string, InstalledPlugin>();\n private registry: StateContainerRegistry;\n private lifecycleUnsubscribers: (() => void)[] = [];\n\n /**\n * Per-container channel-bridge bookkeeping, subscribed at `created` and\n * torn down at `disposed`/`destroy()`. Holds the rolling `prevState`\n * snapshot handed to plugins on each flush.\n *\n * Strong, not a `WeakMap`, because `destroy()` must enumerate live bridges\n * to unsubscribe them; entries are removed on `disposed`, so this never\n * outlives the registry's own reference.\n */\n private containerBridges = new Map<\n StateContainer<any, any, any>,\n ContainerBridge\n >();\n\n /**\n * One `PluginContext` per container, safe to reuse since it closes only\n * over `registry`/`container`, both stable for the container's lifetime.\n */\n private contextCache = new WeakMap<\n StateContainer<any, any, any>,\n PluginContext\n >();\n\n /**\n * Create a new PluginManager\n * @param registry - The StateContainerRegistry to monitor for lifecycle events\n */\n constructor(registry: StateContainerRegistry) {\n this.registry = registry;\n this.setupLifecycleHooks();\n }\n\n /**\n * Install a plugin with optional configuration\n * @param plugin - The plugin to install\n * @param config - Optional plugin configuration\n * @throws Error if plugin is already installed\n */\n install(plugin: BlacPlugin, config: PluginConfig = {}): void {\n const effectiveConfig: PluginConfig = {\n enabled: true,\n environment: 'all',\n ...config,\n };\n\n if (!this.shouldEnablePlugin(effectiveConfig)) {\n if (IS_DEV) {\n console.log(\n `[BlaC] Plugin \"${plugin.name}\" skipped (environment mismatch)`,\n );\n }\n return;\n }\n\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin \"${plugin.name}\" is already installed`);\n }\n\n const installContext = this.buildContext(undefined);\n\n if (plugin.onInstall) {\n try {\n plugin.onInstall(installContext);\n } catch (error) {\n console.error(\n `[BlaC] Error installing plugin \"${plugin.name}\":`,\n error,\n );\n throw error;\n }\n }\n\n this.plugins.set(plugin.name, {\n plugin,\n config: effectiveConfig,\n installContext,\n });\n this.backfillPlugin(plugin);\n\n if (IS_DEV) {\n console.log(\n `[BlaC] Plugin \"${plugin.name}\" v${plugin.version} installed`,\n );\n }\n }\n\n /**\n * Uninstall a plugin by name\n * @param pluginName - The name of the plugin to uninstall\n * @throws Error if plugin is not installed\n */\n uninstall(pluginName: string): void {\n const installed = this.plugins.get(pluginName);\n if (!installed) {\n throw new Error(`Plugin \"${pluginName}\" is not installed`);\n }\n\n if (installed.plugin.onUninstall) {\n try {\n installed.plugin.onUninstall();\n } catch (error) {\n console.error(\n `[BlaC] Error uninstalling plugin \"${pluginName}\":`,\n error,\n );\n }\n }\n\n this.plugins.delete(pluginName);\n if (!this.hasStateChangePlugin()) this.detachAllStateBridges();\n if (IS_DEV) {\n console.log(`[BlaC] Plugin \"${pluginName}\" uninstalled`);\n }\n }\n\n /**\n * Get an installed plugin by name\n * @param pluginName - The name of the plugin to retrieve\n * @returns The plugin instance or undefined if not found\n */\n getPlugin(pluginName: string): BlacPlugin | undefined {\n return this.plugins.get(pluginName)?.plugin;\n }\n\n /**\n * Get all installed plugins\n * @returns Array of all installed plugins\n */\n getAllPlugins(): BlacPlugin[] {\n return Array.from(this.plugins.values()).map((p) => p.plugin);\n }\n\n /**\n * Check if a plugin is installed\n * @param pluginName - The name of the plugin to check\n * @returns true if the plugin is installed\n */\n hasPlugin(pluginName: string): boolean {\n return this.plugins.has(pluginName);\n }\n\n /**\n * Uninstall all plugins\n */\n clear(): void {\n for (const name of this.plugins.keys()) {\n this.uninstall(name);\n }\n }\n\n destroy(): void {\n this.clear();\n for (const unsub of this.lifecycleUnsubscribers) {\n unsub();\n }\n this.lifecycleUnsubscribers = [];\n }\n\n /**\n * Wire registry lifecycle events into plugin dispatch.\n *\n * `onStateChange` is not wired through `registry.on('stateChanged', …)` —\n * that event lacks the `PathSet` payload. Instead each `created` subscribes\n * to the container's channel directly for `paths`, pairing it with\n * `(prev, next)` from the per-container snapshot.\n */\n private setupLifecycleHooks(): void {\n this.lifecycleUnsubscribers = [\n this.registry.on('created', (instance) => {\n if (this.hasStateChangePlugin()) this.attachStateBridge(instance);\n this.notifyPlugins('onCreated', instance);\n }),\n this.registry.on('disposed', (instance) => {\n this.notifyPlugins('onDestroyed', instance);\n this.detachStateBridge(instance);\n }),\n this.registry.on('refAcquired', (instance, refId) => {\n this.notifyPlugins('onRefAcquired', instance, refId);\n }),\n this.registry.on('refReleased', (instance, refId) => {\n this.notifyPlugins('onRefReleased', instance, refId);\n }),\n this.registry.on('depsChanged', (instance, previousDeps, currentDeps) => {\n this.notifyPlugins(\n 'onDepsChanged',\n instance,\n previousDeps,\n currentDeps,\n );\n }),\n this.registry.on(\n 'hydrationChanged',\n (instance, status, previousStatus) => {\n this.notifyPlugins(\n 'onHydrationChange',\n instance,\n status,\n previousStatus,\n );\n },\n ),\n this.registry.on('activated', (instance, signal) => {\n this.notifyPlugins('onActivate', instance, signal);\n }),\n this.registry.on('deactivated', (instance) => {\n this.notifyPlugins('onDeactivate', instance);\n }),\n ];\n }\n\n /**\n * Subscribe to the container's channel with `ALL_PATHS` interest so it\n * fires on every flush. `prev` is the snapshot from the previous flush (or\n * create-time for the first); the channel's `paths` is passed straight\n * through to plugins.\n */\n private attachStateBridge(container: StateContainer<any, any, any>): void {\n // Defensive: if a container is somehow created twice (it shouldn't be),\n // don't double-subscribe — the existing bridge is canonical.\n if (this.containerBridges.has(container)) return;\n\n const bridge: ContainerBridge = {\n unsub: () => {},\n prevState: container.state,\n };\n this.containerBridges.set(container, bridge);\n\n bridge.unsub = container.channel.subscribe(\n () => ALL_PATHS,\n (paths) => this.dispatchStateChange(container, paths),\n );\n }\n\n private detachStateBridge(container: StateContainer<any, any, any>): void {\n const bridge = this.containerBridges.get(container);\n if (!bridge) return;\n bridge.unsub();\n this.containerBridges.delete(container);\n }\n\n // Bridges cost every container its single-consumer skip, so they exist only\n // while some installed plugin implements `onStateChange`.\n private hasStateChangePlugin(): boolean {\n for (const { plugin } of this.plugins.values()) {\n if (plugin.onStateChange) return true;\n }\n return false;\n }\n\n private detachAllStateBridges(): void {\n for (const bridge of this.containerBridges.values()) {\n bridge.unsub();\n }\n this.containerBridges.clear();\n }\n\n /**\n * Backfill a newly-installed plugin with existing instances: attach the\n * state bridge (idempotent) if it implements `onStateChange`, and invoke\n * `onCreated` for each. Scoped to this plugin only — `notifyPlugins` would\n * wrongly re-notify every plugin of every instance.\n */\n private backfillPlugin(plugin: BlacPlugin): void {\n if (!plugin.onStateChange && !plugin.onCreated) return;\n for (const Type of this.registry.getTypes()) {\n for (const instance of this.registry.getAll(Type)) {\n // getAll returns the readonly public view; internal bridging needs the\n // real container (same friction the `as any` in queryInstances handles).\n const container = instance as StateContainer<any, any, any>;\n if (plugin.onStateChange) this.attachStateBridge(container);\n\n if (!plugin.onCreated) continue;\n try {\n plugin.onCreated(this.buildContext(container));\n } catch (error) {\n console.error(\n `[BlaC] Error in plugin \"${plugin.name}\" onCreated (backfill):`,\n error,\n );\n }\n }\n }\n }\n\n /**\n * Channel-flush callback. Hands `(prev, next, paths)` to every enabled\n * plugin's `onStateChange`, then updates `prevState` for the next flush.\n * `prev` is captured once and reused across plugins, so every plugin sees\n * the same values regardless of dispatch order.\n */\n private dispatchStateChange(\n container: StateContainer<any, any, any>,\n paths: PathSet,\n ): void {\n const bridge = this.containerBridges.get(container);\n if (!bridge) return;\n\n const prev = bridge.prevState;\n const next = container.state;\n bridge.prevState = next;\n\n let ctx: PluginContext | undefined;\n for (const { plugin, config } of this.plugins.values()) {\n if (!config.enabled) continue;\n // eslint-disable-next-line @typescript-eslint/unbound-method -- invoked via .call below\n const hook = plugin.onStateChange;\n if (typeof hook !== 'function') continue;\n\n try {\n ctx ??= this.buildContext(container);\n hook.call(plugin, ctx, prev, next, paths);\n } catch (error) {\n console.error(\n `[BlaC] Error in plugin \"${plugin.name}\" onStateChange:`,\n error,\n );\n }\n }\n }\n\n /**\n * Notify all plugins of a lifecycle event. Builds a `PluginContext` lazily\n * on the first matching hook and reuses it for the rest of this dispatch —\n * zero builds if no enabled plugin implements `hookName`.\n */\n private notifyPlugins(\n hookName: Exclude<keyof BlacPlugin, 'onStateChange'>,\n instance: StateContainer<any, any, any>,\n ...extraArgs: any[]\n ): void {\n let ctx: PluginContext | undefined;\n for (const { plugin, config } of this.plugins.values()) {\n if (!config.enabled) continue;\n\n const hook = plugin[hookName];\n if (typeof hook !== 'function') continue;\n\n try {\n ctx ??= this.buildContext(instance);\n (hook as any).call(plugin, ctx, ...extraArgs);\n } catch (error) {\n console.error(\n `[BlaC] Error in plugin \"${plugin.name}\" ${hookName}:`,\n error,\n );\n }\n }\n }\n\n /**\n * Get the `PluginContext` for a focal container, building it once and\n * reusing it thereafter (evicted via the `WeakMap` when the container\n * dies). `undefined` (install-time) is never cached.\n */\n private buildContext(\n container: StateContainer<any, any, any> | undefined,\n ): PluginContext {\n if (container !== undefined) {\n const cached = this.contextCache.get(container);\n if (cached) return cached;\n }\n const context = this.createContext(container);\n if (container !== undefined) this.contextCache.set(container, context);\n return context;\n }\n\n private createContext(\n container: StateContainer<any, any, any> | undefined,\n ): PluginContext {\n const registry = this.registry;\n return {\n container,\n\n getInstanceMetadata: (\n instance: StateContainer<any, any, any>,\n ): InstanceMetadata => {\n return {\n id: instance.$blac.id,\n className: getBlacName(\n instance.constructor as StateContainerConstructor,\n ),\n isDisposed: instance.$blac.disposed,\n name: instance.$blac.name,\n createdAt: instance.$blac.createdAt,\n state: instance.state,\n hydrationStatus: instance.$blac.hydration.status,\n isHydrated: instance.$blac.hydration.isHydrated,\n hydrationError: instance.$blac.hydration.error,\n changedWhileHydrating: instance.$blac.hydration.changedWhileHydrating,\n args: instance.args,\n };\n },\n\n getState: <S extends object = any>(instance: StateContainer<S>): S => {\n return instance.state;\n },\n\n getHydrationStatus: (instance: StateContainer<any, any, any>) => {\n return instance.$blac.hydration.status;\n },\n\n startHydration: (instance: StateContainer<any, any, any>) => {\n instance.$blac.hydration.begin();\n },\n\n applyHydratedState: <S extends object = any>(\n instance: StateContainer<S>,\n state: S,\n ): boolean => {\n return instance.$blac.hydration.apply(state);\n },\n\n finishHydration: (instance: StateContainer<any, any, any>) => {\n instance.$blac.hydration.finish();\n },\n\n failHydration: (\n instance: StateContainer<any, any, any>,\n error: Error,\n ) => {\n instance.$blac.hydration.fail(error);\n },\n\n waitForHydration: (instance: StateContainer<any, any, any>) => {\n return instance.$blac.hydration.wait();\n },\n\n queryInstances: <T extends StateContainer<any, any, any>>(\n typeClass: new (...args: any[]) => T,\n ): T[] => {\n return registry.getAll(typeClass as any);\n },\n\n getAllTypes: () => {\n return registry.getTypes();\n },\n\n getStats: () => {\n return registry.getStats();\n },\n\n getRefIds: (instanceId: string): string[] => {\n return registry.getRefIdsById(instanceId);\n },\n };\n }\n\n /**\n * Check if plugin should be enabled based on environment\n */\n private shouldEnablePlugin(config: PluginConfig): boolean {\n if (!config.enabled) return false;\n if (config.environment === 'all') return true;\n\n const currentEnv = this.getCurrentEnvironment();\n return currentEnv === config.environment;\n }\n\n /**\n * Same rule as `IS_DEV`: an unknown environment counts as production.\n */\n private getCurrentEnvironment(): 'development' | 'production' | 'test' {\n const env = readNodeEnv();\n if (env === undefined || env === 'production') return 'production';\n return env === 'test' ? 'test' : 'development';\n }\n}\n\n/**\n * Create a plugin manager instance\n * @param registry - The StateContainerRegistry to monitor for lifecycle events\n * @returns A new PluginManager instance\n */\nexport function createPluginManager(\n registry: StateContainerRegistry,\n): PluginManager {\n return new PluginManager(registry);\n}\n","/**\n * Plugin system utilities for extending BlaC functionality.\n * Import from `@blac/core/plugins`.\n *\n * @example\n * ```typescript\n * import { PluginManager, getPluginManager, type BlacPlugin } from '@blac/core/plugins';\n *\n * const myPlugin: BlacPlugin = {\n * name: 'my-plugin',\n * onCreated(context) {\n * console.log('Instance created:', context.container);\n * },\n * };\n *\n * getPluginManager().install(myPlugin);\n * ```\n *\n * @packageDocumentation\n */\n\nimport { createPluginManager, PluginManager } from './plugin/PluginManager';\nimport {\n globalRegistry,\n type StateContainerRegistry,\n} from './core/StateContainerRegistry';\n\nexport { PluginManager } from './plugin/PluginManager';\nexport type {\n BlacPlugin,\n BlacPluginWithInit,\n PluginContext,\n PluginConfig,\n InstanceMetadata,\n} from './plugin/BlacPlugin';\n\nconst pluginManagers = new WeakMap<StateContainerRegistry, PluginManager>();\n\n/**\n * Get the plugin manager for a registry (the global one by default). Plugins\n * only observe the registry they are installed on, so install them again on\n * a scoped registry (e.g. one passed to `RegistryProvider`).\n */\nexport function getPluginManager(\n registry: StateContainerRegistry = globalRegistry,\n): PluginManager {\n let manager = pluginManagers.get(registry);\n if (!manager) {\n manager = createPluginManager(registry);\n pluginManagers.set(registry, manager);\n }\n return manager;\n}\n"],"mappings":"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"}
|
package/dist/plugins.d.cts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Plugins Subpath Export
|
|
3
|
-
*
|
|
4
2
|
* Plugin system utilities for extending BlaC functionality.
|
|
5
|
-
* Import from
|
|
3
|
+
* Import from `@blac/core/plugins`.
|
|
6
4
|
*
|
|
7
5
|
* @example
|
|
8
6
|
* ```typescript
|
|
@@ -15,11 +13,18 @@
|
|
|
15
13
|
* },
|
|
16
14
|
* };
|
|
17
15
|
*
|
|
18
|
-
* getPluginManager().
|
|
16
|
+
* getPluginManager().install(myPlugin);
|
|
19
17
|
* ```
|
|
20
18
|
*
|
|
21
19
|
* @packageDocumentation
|
|
22
20
|
*/
|
|
21
|
+
import { PluginManager } from './plugin/PluginManager';
|
|
22
|
+
import { type StateContainerRegistry } from './core/StateContainerRegistry';
|
|
23
23
|
export { PluginManager } from './plugin/PluginManager';
|
|
24
24
|
export type { BlacPlugin, BlacPluginWithInit, PluginContext, PluginConfig, InstanceMetadata, } from './plugin/BlacPlugin';
|
|
25
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Get the plugin manager for a registry (the global one by default). Plugins
|
|
27
|
+
* only observe the registry they are installed on, so install them again on
|
|
28
|
+
* a scoped registry (e.g. one passed to `RegistryProvider`).
|
|
29
|
+
*/
|
|
30
|
+
export declare function getPluginManager(registry?: StateContainerRegistry): PluginManager;
|
package/dist/plugins.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Plugins Subpath Export
|
|
3
|
-
*
|
|
4
2
|
* Plugin system utilities for extending BlaC functionality.
|
|
5
|
-
* Import from
|
|
3
|
+
* Import from `@blac/core/plugins`.
|
|
6
4
|
*
|
|
7
5
|
* @example
|
|
8
6
|
* ```typescript
|
|
@@ -15,11 +13,18 @@
|
|
|
15
13
|
* },
|
|
16
14
|
* };
|
|
17
15
|
*
|
|
18
|
-
* getPluginManager().
|
|
16
|
+
* getPluginManager().install(myPlugin);
|
|
19
17
|
* ```
|
|
20
18
|
*
|
|
21
19
|
* @packageDocumentation
|
|
22
20
|
*/
|
|
21
|
+
import { PluginManager } from './plugin/PluginManager';
|
|
22
|
+
import { type StateContainerRegistry } from './core/StateContainerRegistry';
|
|
23
23
|
export { PluginManager } from './plugin/PluginManager';
|
|
24
24
|
export type { BlacPlugin, BlacPluginWithInit, PluginContext, PluginConfig, InstanceMetadata, } from './plugin/BlacPlugin';
|
|
25
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Get the plugin manager for a registry (the global one by default). Plugins
|
|
27
|
+
* only observe the registry they are installed on, so install them again on
|
|
28
|
+
* a scoped registry (e.g. one passed to `RegistryProvider`).
|
|
29
|
+
*/
|
|
30
|
+
export declare function getPluginManager(registry?: StateContainerRegistry): PluginManager;
|