@ngstato/core 0.2.0 → 0.3.0

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/store.ts","../src/types.ts","../src/http.ts","../src/helpers/abortable.ts","../src/helpers/debounced.ts","../src/helpers/throttled.ts","../src/helpers/retryable.ts","../src/helpers/from-stream.ts","../src/helpers/optimistic.ts","../src/helpers/with-persist.ts","../src/devtools.ts"],"names":[],"mappings":";;;AAgBA,IAAM,aAAN,MAAmC;AAAA;AAAA,EAGzB,MAAA;AAAA;AAAA,EAGA,YAAA,uBAAwD,GAAA,EAAI;AAAA;AAAA,EAG5D,WAAqC,EAAC;AAAA;AAAA,EAGtC,YAA2C,EAAC;AAAA,EAC5C,aAA4C,EAAC;AAAA;AAAA,EAG7C,YAA+B,EAAC;AAAA;AAAA,EAGhC,MAAA;AAAA,EACA,YAAA,GAAoB,IAAA;AAAA,EACpB,WAQH,EAAC;AAAA,EAEE,wBAAwB,EAAA,EAA6B;AAC3D,IAAA,IAAI,WAAA,GAAc,KAAA;AAClB,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,cAAwB,EAAC;AAC7B,IAAA,IAAI,gBAA2B,EAAC;AAEhC,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,WAAA,IAAe,YAAY,MAAA,EAAQ;AACrC,QAAA,MAAM,YAAY,WAAA,CAAY,KAAA;AAAA,UAAM,CAAC,GAAA,EAAK,KAAA,KACxC,MAAA,CAAO,EAAA,CAAI,IAAA,CAAK,MAAA,CAAe,GAAG,CAAA,EAAG,aAAA,CAAc,KAAK,CAAC;AAAA,SAC3D;AACA,QAAA,IAAI,WAAW,OAAO,YAAA;AAAA,MACxB;AAEA,MAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,MAAA,MAAM,aAAA,GAAgB,IAAI,KAAA,CAAM,IAAA,CAAK,MAAA,EAAe;AAAA,QAClD,GAAA,EAAK,CAAC,MAAA,EAAQ,IAAA,EAAM,QAAA,KAAa;AAC/B,UAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,IAAQ,MAAA,EAAQ;AAC9C,YAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AAAA,UAChB;AACA,UAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,QAC3C;AAAA,OACD,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,GAAG,aAAa,CAAA;AAE/B,MAAA,WAAA,GAAc,KAAA,CAAM,KAAK,KAAK,CAAA;AAC9B,MAAA,aAAA,GAAgB,YAAY,GAAA,CAAI,CAAC,QAAS,IAAA,CAAK,MAAA,CAAe,GAAG,CAAC,CAAA;AAClE,MAAA,YAAA,GAAe,MAAA;AACf,MAAA,WAAA,GAAc,IAAA;AAEd,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,EACF;AAAA,EAEA,YAAY,MAAA,EAA6B;AAEvC,IAAA,MAAM,EAAE,SAAS,QAAA,EAAU,SAAA,EAAW,SAAS,KAAA,EAAO,GAAG,cAAa,GAAI,MAAA;AAC1E,IAAA,IAAA,CAAK,MAAA,GAAU,YAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAU,SAAS,EAAC;AAGzB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,EAAE,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAChD,QAAA,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,GAAI,EAAA;AAAA,MACxB;AAAA,IACF;AAGA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,EAAE,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACjD,QAAA,IAAI,OAAO,OAAO,UAAA,EAAY;AAC5B,UAAA,IAAA,CAAK,UAAU,IAAI,CAAA,GAAI,MAAO,EAAA,CAAgB,KAAK,MAAM,CAAA;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,EAAE,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAClD,QAAA,IAAI,OAAO,OAAO,UAAA,EAAY;AAC5B,UAAA,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,GAAI,IAAA,CAAK,wBAAwB,EAAc,CAAA;AAAA,QACrE;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,MAAM,CAAC,IAAA,EAAM,GAAG,CAAA,GAAI,KAAA;AACpB,QAAA,IAAI,OAAO,IAAA,KAAS,UAAA,IAAc,OAAO,QAAQ,UAAA,EAAY;AAC3D,UAAA,IAAA,CAAK,SAAS,IAAA,CAAK;AAAA,YACjB,IAAA;AAAA,YACA,GAAA;AAAA,YACA,MAAA,EAAQ,KAAA;AAAA,YACR,OAAA,EAAS,KAAA;AAAA,YACT,cAAA,EAAgB;AAAA,WACjB,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,QAAA,GAAoC;AAClC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AAAA;AAAA,EAGQ,UAAU,OAAA,EAAiC;AAEjD,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,OAAA,EAAQ;AAC3C,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA,EAEQ,eAAe,KAAA,EAAuC;AAC5D,IAAA,OAAO,MAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAAA,EAC9C;AAAA,EAEQ,YAAA,CAAa,MAA6B,IAAA,EAA0B;AAC1E,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA;AACxC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,IAAI,CAAC,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,CAAC,GAAG,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,OAAO,IAAA;AAAA,IAC3C;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,WAAA,CAAY,QAAQ,KAAA,EAAO;AACjC,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,QAAA,EAAU;AAClC,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AACzC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA;AAC/C,MAAA,MAAM,YAAY,KAAA,IAAS,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,UAAU,SAAS,CAAA;AACvE,MAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,MAAA,MAAM,UAAU,YAAY;AAC1B,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,MAAA,CAAO,cAAA,GAAiB,IAAA;AACxB,UAAA;AAAA,QACF;AAEA,QAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,QAAA,MAAA,CAAO,cAAA,GAAiB,KAAA;AACxB,QAAA,MAAM,gBAAgB,MAAA,CAAO,QAAA;AAC7B,QAAA,MAAA,CAAO,QAAA,GAAW,SAAA;AAElB,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,OAAA,IAAU;AACjB,UAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW;AAAA,YAC/C,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,YACxB,OAAO,IAAA,CAAK,YAAA;AAAA,YACZ;AAAA,WACD,CAAA;AACD,UAAA,MAAA,CAAO,OAAA,GAAU,OAAO,YAAA,KAAiB,UAAA,GAAa,YAAA,GAAe,KAAA,CAAA;AACrE,UAAA,MAAA,CAAO,MAAA,GAAS,IAAA;AAAA,QAClB,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,KAAA,EAAgB,QAAQ,CAAA;AAAA,QAChD,CAAA,SAAE;AACA,UAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AACjB,UAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,YAAA,IAAA,CAAK,WAAA,EAAY;AAAA,UACnB;AAAA,QACF;AAAA,MACF,CAAA;AAEA,MAAA,KAAK,OAAA,EAAQ;AAAA,IACf;AAAA,EACF;AAAA;AAAA,EAGQ,OAAA,GAAU;AAChB,IAAA,KAAA,MAAW,UAAA,IAAc,KAAK,YAAA,EAAc;AAC1C,MAAA,UAAA,CAAW,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA,EAGA,UAAU,EAAA,EAAgD;AACxD,IAAA,IAAA,CAAK,YAAA,CAAa,IAAI,EAAE,CAAA;AAExB,IAAA,OAAO,MAAM,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,EAAE,CAAA;AAAA,EAC1C;AAAA;AAAA,EAGF,MAAM,QAAA,CAAS,UAAA,EAAA,GAAuB,IAAA,EAAiB;AACrD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA;AACvC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,UAAU,CAAA,aAAA,CAAe,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAA,CAAK,MAAA,CAAO,QAAA,GAAW,UAAA,EAAY,IAAI,CAAA;AAEvC,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,MAAM,SAAA,GAAY,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAEnC,IAAA,MAAM,aAAa,IAAI,KAAA,CAAM,EAAE,GAAG,IAAA,CAAK,QAAO,EAAU;AAAA,MACtD,GAAA,EAAK,CAAC,MAAA,EAAQ,GAAA,EAAK,KAAA,KAAU;AAC3B,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AACd,QAAA,IAAA,CAAK,UAAU,EAAE,CAAC,GAAG,GAAG,OAAc,CAAA;AACtC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACD,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,UAAA,EAAY,GAAG,IAAI,CAAA;AAGhC,MAAA,IAAA,CAAK,OAAO,YAAA,GAAe,UAAA,EAAY,IAAA,CAAK,GAAA,KAAQ,KAAK,CAAA;AAGzD,MAAA,IAAA,CAAK,OAAO,aAAA,GAAgB,SAAA,EAAkB,EAAE,GAAG,IAAA,CAAK,QAAe,CAAA;AAAA,IAEzE,SAAS,KAAA,EAAO;AAEd,MAAA,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,KAAA,EAAgB,UAAU,CAAA;AAChD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGE,YAAY,IAAA,EAAuB;AACjC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAC9B,IAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,aAAA,CAAe,CAAA;AACjE,IAAA,OAAO,EAAA,EAAG;AAAA,EACZ;AAAA,EAEA,YAAY,IAAA,EAAuB;AACjC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAC/B,IAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,aAAA,CAAe,CAAA;AACjE,IAAA,OAAO,EAAA,EAAG;AAAA,EACZ;AAAA;AAAA,EAGA,gBAAgB,EAAA,EAAgB;AAC9B,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,EACxB;AAAA,EAEA,QAAQ,OAAA,EAAiC;AACvC,IAAA,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EACxB;AAAA,EAEA,eAAe,WAAA,EAAkB;AAC/B,IAAA,IAAA,CAAK,YAAA,GAAe,WAAA;AACpB,IAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,EACvB;AAAA;AAAA,EAGA,KAAK,WAAA,EAAkB;AACrB,IAAA,IAAA,CAAK,YAAA,GAAe,WAAA;AACpB,IAAA,IAAA,CAAK,MAAA,CAAO,SAAS,WAAW,CAAA;AAChC,IAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,EACvB;AAAA,EAEA,QAAQ,WAAA,EAAkB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,YAAY,WAAW,CAAA;AACnC,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,QAAA,EAAU;AAClC,MAAA,MAAA,CAAO,OAAA,IAAU;AACjB,MAAA,MAAA,CAAO,OAAA,GAAU,MAAA;AAAA,IACnB;AAEA,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,SAAA,EAAW;AACpC,MAAA,OAAA,EAAQ;AAAA,IACV;AACA,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,EAC1B;AACF,CAAA;AAMO,SAAS,YAA8B,MAAA,EAAiC;AAG7E,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAc,MAA6B,CAAA;AAK7D,EAAA,MAAM,WAAA,GAAmB;AAAA;AAAA,IAEvB,SAAA,EAAW,KAAA;AAAA;AAAA,IAGX,SAAA,EAAW,KAAA,CAAM,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AAAA;AAAA,IAGrC,QAAA,EAAU,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAAA;AAAA,IAGnC,eAAA,EAAiB,KAAA,CAAM,eAAA,CAAgB,IAAA,CAAK,KAAK;AAAA,GACnD;AAGA,EAAA,MAAM,YAAA,GAAe,MAAM,QAAA,EAAS;AACpC,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,YAAsB,CAAA,EAAG;AACrD,IAAA,MAAA,CAAO,cAAA,CAAe,aAAa,GAAA,EAAK;AAAA,MACtC,GAAA,EAAK,MAAM,KAAA,CAAM,QAAA,GAAW,GAAgC,CAAA;AAAA,MAC5D,UAAA,EAAY,IAAA;AAAA,MACZ,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,SAAA,EAAU,GAAI,MAAA;AAEzC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACvC,MAAA,WAAA,CAAY,IAAI,IAAI,CAAA,GAAI,IAAA,KAAoB,MAAM,QAAA,CAAS,IAAA,EAAM,GAAG,IAAI,CAAA;AAAA,IAC1E;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAG;AACxC,MAAA,MAAA,CAAO,cAAA,CAAe,aAAa,IAAA,EAAM;AAAA,QACvC,GAAA,EAAK,MAAM,KAAA,CAAM,WAAA,CAAY,IAAI,CAAA;AAAA,QACjC,UAAA,EAAY,IAAA;AAAA,QACZ,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AACzC,MAAA,MAAA,CAAO,cAAA,CAAe,aAAa,IAAA,EAAM;AAAA,QACvC,GAAA,EAAK,MAAM,KAAA,CAAM,WAAA,CAAY,IAAI,CAAA;AAAA,QACjC,UAAA,EAAY,IAAA;AAAA,QACZ,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,eAAe,WAAW,CAAA;AAEhC,EAAA,OAAO,WAAA;AACT;;;ACvSO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EACxC,WAAA,CACS,QACA,IAAA,EACP;AACA,IAAA,KAAA,CAAM,CAAA,KAAA,EAAQ,MAAM,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAHxB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;;;ACvDO,IAAM,YAAN,MAAgB;AAAA,EAEb,OAAA;AAAA,EAER,WAAA,CAAY,MAAA,GAAsB,EAAC,EAAG;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA;AAAA,EAGA,GAAA,CAAiB,KAAa,OAAA,EAAsC;AAClE,IAAA,OAAO,IAAA,CAAK,QAAA,CAAY,KAAA,EAAO,GAAA,EAAK,QAAW,OAAO,CAAA;AAAA,EACxD;AAAA;AAAA,EAGA,IAAA,CAAkB,GAAA,EAAa,IAAA,EAAgB,OAAA,EAAsC;AACnF,IAAA,OAAO,IAAA,CAAK,QAAA,CAAY,MAAA,EAAQ,GAAA,EAAK,MAAM,OAAO,CAAA;AAAA,EACpD;AAAA;AAAA,EAGA,GAAA,CAAiB,GAAA,EAAa,IAAA,EAAgB,OAAA,EAAsC;AAClF,IAAA,OAAO,IAAA,CAAK,QAAA,CAAY,KAAA,EAAO,GAAA,EAAK,MAAM,OAAO,CAAA;AAAA,EACnD;AAAA;AAAA,EAGA,KAAA,CAAmB,GAAA,EAAa,IAAA,EAAgB,OAAA,EAAsC;AACpF,IAAA,OAAO,IAAA,CAAK,QAAA,CAAY,OAAA,EAAS,GAAA,EAAK,MAAM,OAAO,CAAA;AAAA,EACrD;AAAA;AAAA,EAGA,MAAA,CAAoB,KAAa,OAAA,EAAsC;AACrE,IAAA,OAAO,IAAA,CAAK,QAAA,CAAY,QAAA,EAAU,GAAA,EAAK,QAAW,OAAO,CAAA;AAAA,EAC3D;AAAA;AAAA,EAGA,MAAc,QAAA,CACZ,MAAA,EACA,GAAA,EACA,MACA,OAAA,EACY;AAGZ,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,SAAS,MAAM,CAAA;AAGnD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,IAAA,IAAO;AAGlC,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,GAAG,KAAK,OAAA,CAAQ,OAAA;AAAA,MAChB,GAAG,OAAA,EAAS,OAAA;AAAA,MACZ,GAAI,QAAQ,EAAE,aAAA,EAAe,UAAU,KAAK,CAAA,CAAA,KAAO;AAAC,KACtD;AAGA,IAAA,IAAI,SAAS,OAAA,EAAS,MAAA;AACtB,IAAA,IAAI,SAAA;AAEJ,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,CAAC,MAAA,EAAQ;AACnC,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAA,GAAY,UAAA,CAAW,MAAA;AACvB,MAAA,SAAA,GAAY,UAAA;AAAA,QACV,MAAM,WAAW,KAAA,EAAM;AAAA,QACvB,KAAK,OAAA,CAAQ;AAAA,OACf;AAAA,IACF;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAS;AAAA,QACpC,MAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA;AAAA,QACA,GAAI,IAAA,KAAS,KAAA,CAAA,GACT,EAAE,IAAA,EAAM,KAAK,SAAA,CAAU,IAAI,CAAA,EAAE,GAC7B;AAAC,OAEN,CAAA;AAGD,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,QAAA,MAAM,IAAI,cAAA,CAAe,QAAA,CAAS,MAAA,EAAQ,SAAS,CAAA;AAAA,MACrD;AAGA,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AACvD,MAAA,IACE,SAAS,MAAA,KAAW,GAAA,IACpB,CAAC,WAAA,EAAa,QAAA,CAAS,kBAAkB,CAAA,EACzC;AACA,QAAA,OAAO,KAAA,CAAA;AAAA,MACT;AAGA,MAAA,OAAO,SAAS,IAAA,EAAK;AAAA,IAEvB,CAAA,SAAE;AAEA,MAAA,IAAI,SAAA,eAAwB,SAAS,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA,EAGQ,SAAA,CACN,MACA,MAAA,EACQ;AAGR,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,GAC9B,IAAA,GACA,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA,EAAG,IAAI,CAAA,CAAA;AAGxC,IAAA,IAAI,CAAC,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,GAAA;AAExD,IAAA,MAAM,KAAK,IAAI,eAAA;AAAA,MACb,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAC;AAAA,MACrD,QAAA,EAAS;AAEX,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAAA,EACrB;AACF;AAMO,SAAS,UAAA,CAAW,MAAA,GAAsB,EAAC,EAAc;AAC9D,EAAA,OAAO,IAAI,UAAU,MAAM,CAAA;AAC7B;AAQA,IAAI,WAAA,GAAyB,IAAI,SAAA,EAAU;AAEpC,SAAS,cAAc,MAAA,EAA2B;AACvD,EAAA,WAAA,GAAc,IAAI,UAAU,MAAM,CAAA;AACpC;AAIO,IAAM,IAAA,GAAO;AAAA,EAClB,KAAQ,CAAI,GAAA,EAAa,YACf,WAAA,CAAY,GAAA,CAAO,KAAK,OAAO,CAAA;AAAA,EAEzC,IAAA,EAAQ,CAAI,GAAA,EAAa,IAAA,EAAgB,YAC/B,WAAA,CAAY,IAAA,CAAQ,GAAA,EAAK,IAAA,EAAM,OAAO,CAAA;AAAA,EAEhD,GAAA,EAAQ,CAAI,GAAA,EAAa,IAAA,EAAgB,YAC/B,WAAA,CAAY,GAAA,CAAO,GAAA,EAAK,IAAA,EAAM,OAAO,CAAA;AAAA,EAE/C,KAAA,EAAQ,CAAI,GAAA,EAAa,IAAA,EAAgB,YAC/B,WAAA,CAAY,KAAA,CAAS,GAAA,EAAK,IAAA,EAAM,OAAO,CAAA;AAAA,EAEjD,QAAQ,CAAI,GAAA,EAAa,YACf,WAAA,CAAY,MAAA,CAAU,KAAK,OAAO;AAC9C;;;AChLO,SAAS,UACd,EAAA,EACA;AACA,EAAA,IAAI,UAAA,GAAqC,IAAA;AAEzC,EAAA,OAAO,OAAO,UAAa,IAAA,KAA2B;AAEpD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB;AAGA,IAAA,UAAA,GAAa,IAAI,eAAA,EAAgB;AACjC,IAAA,MAAM,SAAS,UAAA,CAAW,MAAA;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,GAAG,KAAA,EAAO,GAAG,IAAA,EAAM,EAAE,QAAe,CAAA;AAAA,IAC5C,SAAS,KAAA,EAAY;AAEnB,MAAA,IAAI,KAAA,EAAO,SAAS,YAAA,EAAc;AAClC,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,UAAA,GAAa,IAAA;AAAA,IACf;AAAA,EACF,CAAA;AACF;;;AC7BO,SAAS,SAAA,CACd,EAAA,EACA,EAAA,GAAc,GAAA,EACd;AACA,EAAA,IAAI,KAAA,GAA8C,IAAA;AAElD,EAAA,OAAO,CAAC,UAAa,IAAA,KAA2B;AAE9C,IAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAG7B,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,KAAA,GAAQ,WAAW,YAAY;AAC7B,QAAA,IAAI;AACF,UAAA,MAAM,EAAA,CAAG,KAAA,EAAO,GAAG,IAAI,CAAA;AACvB,UAAA,OAAA,EAAQ;AAAA,QACV,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,KAAK,CAAA;AAAA,QACd,CAAA,SAAE;AACA,UAAA,KAAA,GAAQ,IAAA;AAAA,QACV;AAAA,MACF,GAAG,EAAE,CAAA;AAAA,IACP,CAAC,CAAA;AAAA,EACH,CAAA;AACF;;;ACxBO,SAAS,SAAA,CACd,EAAA,EACA,EAAA,GAAc,GAAA,EACd;AACA,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,KAAA,GAAiD,IAAA;AAErD,EAAA,OAAO,OAAO,UAAa,IAAA,KAA2B;AACpD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,SAAA,GAAY,MAAM,GAAA,GAAM,QAAA,CAAA;AAE9B,IAAA,IAAI,aAAa,CAAA,EAAG;AAElB,MAAA,QAAA,GAAW,GAAA;AACX,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV;AACA,MAAA,MAAM,EAAA,CAAG,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA,IACzB,CAAA,MAAO;AAEL,MAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAC7B,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,QAAA,KAAA,GAAQ,WAAW,YAAY;AAC7B,UAAA,QAAA,GAAW,KAAK,GAAA,EAAI;AACpB,UAAA,KAAA,GAAW,IAAA;AACX,UAAA,IAAI;AACF,YAAA,MAAM,EAAA,CAAG,KAAA,EAAO,GAAG,IAAI,CAAA;AACvB,YAAA,OAAA,EAAQ;AAAA,UACV,SAAS,KAAA,EAAO;AACd,YAAA,MAAA,CAAO,KAAK,CAAA;AAAA,UACd;AAAA,QACF,GAAG,SAAS,CAAA;AAAA,MACd,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AACF;;;AC7BO,SAAS,SAAA,CACd,IACA,OAAA,GAAwB;AAAA,EACtB,QAAA,EAAU,CAAA;AAAA,EACV,OAAA,EAAU,aAAA;AAAA,EACV,KAAA,EAAU;AACZ,CAAA,EACA;AACA,EAAA,OAAO,OAAO,UAAa,IAAA,KAA2B;AACpD,IAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAS,KAAA,GAAQ,GAAA,EAAM,SAAQ,GAAI,OAAA;AAErD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI;AACF,QAAA,MAAM,EAAA,CAAG,KAAA,EAAO,GAAG,IAAI,CAAA;AACvB,QAAA;AAAA,MAEF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,aAAA,GAAgB,MAAM,QAAA,GAAW,CAAA;AAGvC,QAAA,IAAI,eAAe,MAAM,KAAA;AAGzB,QAAA,MAAM,MAAA,GAAS,YAAY,aAAA,GACvB,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,GACrB,KAAA;AAGJ,QAAA,OAAA,GAAU,CAAA,GAAI,GAAG,KAAc,CAAA;AAG/B,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA,MAC1D;AAAA,IACF;AAAA,EACF,CAAA;AACF;;;ACxBO,SAAS,UAAA,CAEd,OAAA,EAEA,QAAA,EACA,OAAA,EACA;AACA,EAAA,OAAO,CAAC,KAAA,KAA2B;AAEjC,IAAA,MAAM,OAAA,GAAc,QAAQ,KAAK,CAAA;AACjC,IAAA,MAAM,YAAA,GAAe,QAAQ,SAAA,CAAU;AAAA,MAErC,IAAA,EAAM,CAAC,KAAA,KAAa;AAElB,QAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,MACvB,CAAA;AAAA,MAEA,KAAA,EAAO,CAAC,KAAA,KAAmB;AACzB,QAAA,OAAA,EAAS,UAAU,KAAK,CAAA;AAAA,MAC1B,CAAA;AAAA,MAEA,UAAU,MAAM;AACd,QAAA,OAAA,EAAS,UAAA,IAAa;AAAA,MACxB;AAAA,KACD,CAAA;AAID,IAAA,OAAO,MAAM,aAAa,WAAA,EAAY;AAAA,EACxC,CAAA;AACF;;;ACjDO,SAAS,UAAA,CAEd,WAEA,OAAA,EACA;AACA,EAAA,OAAO,OAAO,UAAa,IAAA,KAA2B;AAEpD,IAAA,MAAM,QAAA,GAAW,EAAE,GAAI,KAAA,EAAiB;AAGxC,IAAA,SAAA,CAAU,KAAA,EAAO,GAAG,IAAI,CAAA;AAExB,IAAA,IAAI;AAEF,MAAA,MAAM,OAAA,CAAQ,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA,IAG9B,SAAS,KAAA,EAAO;AAEd,MAAA,MAAA,CAAO,MAAA,CAAO,OAAiB,QAAQ,CAAA;AACvC,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA;AACF;;;ACPA,SAAS,eAAe,MAAA,EAAgD;AACtE,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAC1C,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,YAAA;AAAA,EAChB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,SAAA,CAA4B,OAAmB,IAAA,EAAoB;AAC1E,EAAA,IAAI,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAO,KAAA;AAC1B,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA,CAAM,GAAG,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,WAAA,CACd,QACA,OAAA,EACyB;AACzB,EAAA,MAAM;AAAA,IACJ,GAAA;AAAA,IACA,OAAA,GAAU,CAAA;AAAA,IACV,OAAA,EAAS,aAAA;AAAA,IACT,IAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,OAAA,GAAU,eAAe,aAAa,CAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,IAAS,EAAC;AAEnC,EAAA,MAAM,WAAA,GAA+B;AAAA,IACnC,GAAG,SAAA;AAAA,IACH,OAAO,KAAA,EAAY;AACjB,MAAA,IAAI;AACF,QAAA,IAAI,CAAC,OAAA,EAAS,OAAO,SAAA,CAAU,SAAS,KAAK,CAAA;AAC7C,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AAC/B,QAAA,IAAI,CAAC,GAAA,EAAK,OAAO,SAAA,CAAU,SAAS,KAAK,CAAA;AAEzC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,QAAA,MAAM,IAAA,GACJ,MAAA,CAAO,CAAA,KAAM,OAAA,GACT,MAAA,CAAO,IAAA,GACP,OAAA,GACE,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,CAAC,IAC7B,MAAA,CAAO,IAAA;AAEf,QAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,UAAA,KAAA,CAAM,SAAA,EAAW,UAAU,IAAI,CAAA;AAAA,QACjC;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,GAAU,KAAc,CAAA;AAAA,MAC1B;AACA,MAAA,OAAO,SAAA,CAAU,SAAS,KAAK,CAAA;AAAA,IACjC,CAAA;AAAA,IAEA,aAAA,CAAc,MAAW,IAAA,EAAW;AAClC,MAAA,IAAI;AACF,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,OAAA,GAA0C;AAAA,YAC9C,CAAA,EAAG,OAAA;AAAA,YACH,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,IAA2C;AAAA,WACnE;AACA,UAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,QAC9C;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,GAAU,KAAc,CAAA;AAAA,MAC1B;AACA,MAAA,SAAA,CAAU,aAAA,GAAgB,MAAM,IAAI,CAAA;AAAA,IACtC,CAAA;AAAA,IAEA,UAAU,KAAA,EAAY;AACpB,MAAA,OAAO,SAAA,CAAU,YAAY,KAAK,CAAA;AAAA,IACpC,CAAA;AAAA,IACA,QAAA,CAAS,MAAc,IAAA,EAAiB;AACtC,MAAA,OAAO,SAAA,CAAU,QAAA,GAAW,IAAA,EAAM,IAAI,CAAA;AAAA,IACxC,CAAA;AAAA,IACA,YAAA,CAAa,MAAc,QAAA,EAAkB;AAC3C,MAAA,OAAO,SAAA,CAAU,YAAA,GAAe,IAAA,EAAM,QAAQ,CAAA;AAAA,IAChD,CAAA;AAAA,IACA,OAAA,CAAQ,OAAc,UAAA,EAAoB;AACxC,MAAA,OAAO,SAAA,CAAU,OAAA,GAAU,KAAA,EAAO,UAAU,CAAA;AAAA,IAC9C;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,KAAA,EAAO;AAAA,GACT;AACF;;;AC9EO,SAAS,cAAA,CAAe,UAAU,EAAA,EAAsB;AAC7D,EAAA,IAAI,OAAA,GAAU,CAAA;AAEd,EAAA,MAAM,KAAA,GAAuB;AAAA,IAC3B,MAAS,EAAC;AAAA,IACV,MAAA,EAAS,KAAA;AAAA,IACT;AAAA,GACF;AAEA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoC;AAE1D,EAAA,SAAS,MAAA,GAAS;AAChB,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAA,EAAA,KAAM,EAAA,CAAG,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,CAAC,GAAG,KAAA,CAAM,IAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EACjE;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IAEA,UAAU,GAAA,EAAK;AACb,MAAA,MAAM,KAAA,GAAmB;AAAA,QACvB,GAAG,GAAA;AAAA,QACH,IAAI,EAAE,OAAA;AAAA,QACN,EAAA,EAAA,iBAAI,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OAC7B;AAEA,MAAA,KAAA,CAAM,IAAA,GAAO,CAAC,KAAA,EAAO,GAAG,MAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA;AACpD,MAAA,MAAA,EAAO;AAAA,IACT,CAAA;AAAA,IAEA,KAAA,GAAQ;AACN,MAAA,KAAA,CAAM,OAAO,EAAC;AACd,MAAA,MAAA,EAAO;AAAA,IACT,CAAA;AAAA,IAEA,IAAA,GAAO;AACL,MAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,MAAA,MAAA,EAAO;AAAA,IACT,CAAA;AAAA,IAEA,KAAA,GAAQ;AACN,MAAA,KAAA,CAAM,MAAA,GAAS,KAAA;AACf,MAAA,MAAA,EAAO;AAAA,IACT,CAAA;AAAA,IAEA,MAAA,GAAS;AACP,MAAA,KAAA,CAAM,MAAA,GAAS,CAAC,KAAA,CAAM,MAAA;AACtB,MAAA,MAAA,EAAO;AAAA,IACT,CAAA;AAAA,IAEA,UAAU,EAAA,EAAI;AACZ,MAAA,SAAA,CAAU,IAAI,EAAE,CAAA;AAChB,MAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,EAAE,CAAA;AAAA,IAClC;AAAA,GACF;AACF;AAMO,IAAM,WAAW,cAAA;AAMjB,SAAS,eAAA,CAAgB,OAAY,SAAA,EAAmB;AAC7D,EAAA,IAAI,CAAC,QAAA,EAAU;AAEf,EAAA,IAAI,YAAiB,EAAC;AAGtB,EAAA,MAAM,gBAAgB,KAAA,CAAM,SAAA;AAE5B,EAAA,IAAI,CAAC,aAAA,EAAe;AAGpB,EAAA,MAAM,aAAA,GAAgB,EAAE,GAAG,aAAA,CAAc,QAAQ,CAAA,EAAE;AAGnD,EAAA,aAAA,CAAc,QAAQ,CAAA,GAAI;AAAA,IACxB,GAAG,aAAA;AAAA,IAEH,QAAA,CAAS,MAAc,IAAA,EAAiB;AACtC,MAAA,SAAA,GAAY,MAAM,QAAA,EAAS;AAC3B,MAAA,aAAA,CAAc,QAAA,GAAW,MAAM,IAAI,CAAA;AAAA,IACrC,CAAA;AAAA,IAEA,YAAA,CAAa,MAAc,QAAA,EAAkB;AAC3C,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,EAAS;AACjC,MAAA,QAAA,CAAS,SAAA,CAAU;AAAA,QACjB,IAAA,EAAW,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA;AAAA,QACjC,MAAW,EAAC;AAAA,QACZ,QAAA;AAAA,QACA,MAAA,EAAW,SAAA;AAAA,QACX,SAAA,EAAW,EAAE,GAAG,SAAA,EAAU;AAAA,QAC1B,SAAA,EAAW,EAAE,GAAG,SAAA;AAAU,OAC3B,CAAA;AACD,MAAA,aAAA,CAAc,YAAA,GAAe,MAAM,QAAQ,CAAA;AAAA,IAC7C,CAAA;AAAA,IAEA,OAAA,CAAQ,OAAc,UAAA,EAAoB;AACxC,MAAA,QAAA,CAAS,SAAA,CAAU;AAAA,QACjB,IAAA,EAAW,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,EAAK,UAAU,CAAA,CAAA;AAAA,QACvC,MAAW,EAAC;AAAA,QACZ,QAAA,EAAW,CAAA;AAAA,QACX,MAAA,EAAW,OAAA;AAAA,QACX,OAAW,KAAA,CAAM,OAAA;AAAA,QACjB,SAAA,EAAW,EAAE,GAAG,SAAA,EAAU;AAAA,QAC1B,SAAA,EAAW,EAAE,GAAG,SAAA;AAAU,OAC3B,CAAA;AACD,MAAA,aAAA,CAAc,OAAA,GAAU,OAAO,UAAU,CAAA;AAAA,IAC3C,CAAA;AAAA,IAEA,eAAe,aAAA,CAAc;AAAA,GAC/B;AACF","file":"index.js","sourcesContent":["// ─────────────────────────────────────────────────────\r\n// @ngstato/core — createStore()\r\n// Le moteur principal de Stato\r\n// ─────────────────────────────────────────────────────\r\n\r\nimport type {\r\n StatoStoreConfig,\r\n StatoHooks,\r\n StateSlice,\r\n EffectEntry\r\n} from './types'\r\n\r\n// ─────────────────────────────────────────────────────\r\n// CLASSE INTERNE — jamais exposée directement\r\n// ─────────────────────────────────────────────────────\r\n\r\nclass StatoStore<S extends object> {\r\n\r\n // Le state interne — jamais accessible directement\r\n private _state: StateSlice<S>\r\n\r\n // Les abonnés — notifiés à chaque changement\r\n private _subscribers: Set<(state: StateSlice<S>) => void> = new Set()\r\n\r\n // Les actions enregistrées\r\n private _actions: Record<string, Function> = {}\r\n\r\n // Les computed enregistrés\r\n private _computed: Record<string, () => unknown> = {}\r\n private _selectors: Record<string, () => unknown> = {}\r\n\r\n // Les cleanups à appeler à la destruction\r\n private _cleanups: Array<() => void> = []\r\n\r\n // Les hooks lifecycle\r\n private _hooks: StatoHooks<any>\r\n private _publicStore: any = null\r\n private _effects: Array<{\r\n deps: (state: StateSlice<S>) => unknown | unknown[]\r\n run: Function\r\n prevDeps?: unknown[]\r\n hasRun: boolean\r\n cleanup?: () => void\r\n running: boolean\r\n rerunRequested: boolean\r\n }> = []\r\n\r\n private _createMemoizedSelector(fn: Function): () => unknown {\r\n let initialized = false\r\n let cachedResult: unknown\r\n let trackedKeys: string[] = []\r\n let trackedValues: unknown[] = []\r\n\r\n return () => {\r\n if (initialized && trackedKeys.length) {\r\n const unchanged = trackedKeys.every((key, index) =>\r\n Object.is((this._state as any)[key], trackedValues[index])\r\n )\r\n if (unchanged) return cachedResult\r\n }\r\n\r\n const reads = new Set<string>()\r\n const trackingState = new Proxy(this._state as any, {\r\n get: (target, prop, receiver) => {\r\n if (typeof prop === 'string' && prop in target) {\r\n reads.add(prop)\r\n }\r\n return Reflect.get(target, prop, receiver)\r\n }\r\n })\r\n\r\n const result = fn(trackingState)\r\n\r\n trackedKeys = Array.from(reads)\r\n trackedValues = trackedKeys.map((key) => (this._state as any)[key])\r\n cachedResult = result\r\n initialized = true\r\n\r\n return result\r\n }\r\n }\r\n\r\n constructor(config: StatoStoreConfig<S>) {\r\n // 1. Extraire le state initial — tout sauf actions/computed/hooks\r\n const { actions, computed, selectors, effects, hooks, ...initialState } = config\r\n this._state = initialState as StateSlice<S>\r\n this._hooks = hooks ?? {}\r\n\r\n // 2. Enregistrer les actions\r\n if (actions) {\r\n for (const [name, fn] of Object.entries(actions)) {\r\n this._actions[name] = fn\r\n }\r\n }\r\n\r\n // 3. Enregistrer les computed\r\n if (computed) {\r\n for (const [name, fn] of Object.entries(computed)) {\r\n if (typeof fn === 'function') {\r\n this._computed[name] = () => (fn as Function)(this._state)\r\n }\r\n }\r\n }\r\n\r\n // 4. Enregistrer les selectors memoïzés\r\n if (selectors) {\r\n for (const [name, fn] of Object.entries(selectors)) {\r\n if (typeof fn === 'function') {\r\n this._selectors[name] = this._createMemoizedSelector(fn as Function)\r\n }\r\n }\r\n }\r\n\r\n if (effects) {\r\n for (const entry of effects) {\r\n const [deps, run] = entry as EffectEntry<StateSlice<S>>\r\n if (typeof deps === 'function' && typeof run === 'function') {\r\n this._effects.push({\r\n deps,\r\n run,\r\n hasRun: false,\r\n running: false,\r\n rerunRequested: false\r\n })\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ── Lire le state ──────────────────────────────────\r\n getState(): Readonly<StateSlice<S>> {\r\n return { ...this._state }\r\n }\r\n\r\n // ── Modifier le state — usage interne uniquement ───\r\n private _setState(partial: Partial<StateSlice<S>>) {\r\n // Copie immutable — on ne modifie jamais l'objet original\r\n this._state = { ...this._state, ...partial }\r\n this._runEffects()\r\n this._notify()\r\n }\r\n\r\n private _normalizeDeps(value: unknown | unknown[]): unknown[] {\r\n return Array.isArray(value) ? value : [value]\r\n }\r\n\r\n private _depsChanged(prev: unknown[] | undefined, next: unknown[]): boolean {\r\n if (!prev) return true\r\n if (prev.length !== next.length) return true\r\n for (let i = 0; i < next.length; i++) {\r\n if (!Object.is(prev[i], next[i])) return true\r\n }\r\n return false\r\n }\r\n\r\n private _runEffects(force = false) {\r\n for (const effect of this._effects) {\r\n const depsValue = effect.deps(this._state)\r\n const depsArray = this._normalizeDeps(depsValue)\r\n const shouldRun = force || this._depsChanged(effect.prevDeps, depsArray)\r\n if (!shouldRun) continue\r\n\r\n const execute = async () => {\r\n if (effect.running) {\r\n effect.rerunRequested = true\r\n return\r\n }\r\n\r\n effect.running = true\r\n effect.rerunRequested = false\r\n const prevDepsValue = effect.prevDeps\r\n effect.prevDeps = depsArray\r\n\r\n try {\r\n effect.cleanup?.()\r\n const maybeCleanup = await effect.run(depsValue, {\r\n state: { ...this._state },\r\n store: this._publicStore,\r\n prevDepsValue\r\n })\r\n effect.cleanup = typeof maybeCleanup === 'function' ? maybeCleanup : undefined\r\n effect.hasRun = true\r\n } catch (error) {\r\n this._hooks.onError?.(error as Error, 'effect')\r\n } finally {\r\n effect.running = false\r\n if (effect.rerunRequested) {\r\n this._runEffects()\r\n }\r\n }\r\n }\r\n\r\n void execute()\r\n }\r\n }\r\n\r\n // ── Notifier tous les abonnés ──────────────────────\r\n private _notify() {\r\n for (const subscriber of this._subscribers) {\r\n subscriber({ ...this._state })\r\n }\r\n }\r\n\r\n // ── S'abonner aux changements ──────────────────────\r\n subscribe(fn: (state: StateSlice<S>) => void): () => void {\r\n this._subscribers.add(fn)\r\n // Retourne une fonction de désabonnement\r\n return () => this._subscribers.delete(fn)\r\n }\r\n\r\n // ── Exécuter une action ────────────────────────────\r\nasync dispatch(actionName: string, ...args: unknown[]) {\r\n const action = this._actions[actionName]\r\n if (!action) {\r\n throw new Error(`[Stato] Action \"${actionName}\" introuvable`)\r\n }\r\n\r\n // Hook onAction — avant l'exécution\r\n this._hooks.onAction?.(actionName, args)\r\n\r\n const start = Date.now()\r\n const prevState = { ...this._state }\r\n\r\n const stateProxy = new Proxy({ ...this._state } as any, {\r\n set: (target, key, value) => {\r\n target[key] = value\r\n this._setState({ [key]: value } as any)\r\n return true\r\n }\r\n })\r\n\r\n try {\r\n await action(stateProxy, ...args)\r\n\r\n // Hook onActionDone — après l'exécution\r\n this._hooks.onActionDone?.(actionName, Date.now() - start)\r\n\r\n // Hook onStateChange — si le state a changé\r\n this._hooks.onStateChange?.(prevState as any, { ...this._state } as any)\r\n\r\n } catch (error) {\r\n // Hook onError — si une erreur est lancée\r\n this._hooks.onError?.(error as Error, actionName)\r\n throw error // on remonte l'erreur quand même\r\n }\r\n}\r\n\r\n // ── Lire une valeur computed ───────────────────────\r\n getComputed(name: string): unknown {\r\n const fn = this._computed[name]\r\n if (!fn) throw new Error(`[Stato] Computed \"${name}\" introuvable`)\r\n return fn()\r\n }\r\n\r\n getSelector(name: string): unknown {\r\n const fn = this._selectors[name]\r\n if (!fn) throw new Error(`[Stato] Selector \"${name}\" introuvable`)\r\n return fn()\r\n }\r\n\r\n // ── Enregistrer un cleanup (pour fromStream) ───────\r\n registerCleanup(fn: () => void) {\r\n this._cleanups.push(fn)\r\n }\r\n\r\n hydrate(partial: Partial<StateSlice<S>>) {\r\n this._setState(partial)\r\n }\r\n\r\n setPublicStore(publicStore: any) {\r\n this._publicStore = publicStore\r\n this._runEffects(true)\r\n }\r\n\r\n // ── Lifecycle — appelé par l'adaptateur Angular ────\r\n init(publicStore: any) {\r\n this._publicStore = publicStore\r\n this._hooks.onInit?.(publicStore)\r\n this._runEffects(true)\r\n }\r\n\r\n destroy(publicStore: any) {\r\n this._hooks.onDestroy?.(publicStore)\r\n for (const effect of this._effects) {\r\n effect.cleanup?.()\r\n effect.cleanup = undefined\r\n }\r\n // Nettoyer tous les streams ouverts\r\n for (const cleanup of this._cleanups) {\r\n cleanup()\r\n }\r\n this._cleanups = []\r\n this._subscribers.clear()\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// FONCTION PUBLIQUE — createStore()\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function createStore<S extends object>(config: S & StatoStoreConfig<S>) {\r\n\r\n // Créer l'instance interne\r\n const store = new StatoStore<S>(config as StatoStoreConfig<S>)\r\n\r\n // Construire l'objet public\r\n // Les propriétés du state sont accessibles directement\r\n // Les actions sont exposées sans le paramètre state\r\n const publicStore: any = {\r\n // Accès au store interne — pour les adaptateurs Angular/React/Vue\r\n __store__: store,\r\n\r\n // S'abonner aux changements\r\n subscribe: store.subscribe.bind(store),\r\n\r\n // Lire le state complet\r\n getState: store.getState.bind(store),\r\n\r\n // Enregistrer un cleanup\r\n registerCleanup: store.registerCleanup.bind(store),\r\n }\r\n\r\n // Exposer chaque propriété du state\r\n const initialState = store.getState()\r\n for (const key of Object.keys(initialState as object)) {\r\n Object.defineProperty(publicStore, key, {\r\n get: () => store.getState()[key as keyof typeof initialState],\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n\r\n // Exposer chaque action\r\n const { actions, computed, selectors } = config as StatoStoreConfig<S>\r\n\r\n if (actions) {\r\n for (const name of Object.keys(actions)) {\r\n publicStore[name] = (...args: unknown[]) => store.dispatch(name, ...args)\r\n }\r\n }\r\n\r\n // Exposer chaque computed\r\n if (computed) {\r\n for (const name of Object.keys(computed)) {\r\n Object.defineProperty(publicStore, name, {\r\n get: () => store.getComputed(name),\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n }\r\n\r\n if (selectors) {\r\n for (const name of Object.keys(selectors)) {\r\n Object.defineProperty(publicStore, name, {\r\n get: () => store.getSelector(name),\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n }\r\n\r\n store.setPublicStore(publicStore)\r\n\r\n return publicStore\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// store.on() — réactions inter-stores\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function on<S extends object>(\r\n sourceAction: Function,\r\n handler: (state: S) => void | Promise<void>\r\n) {\r\n // Sera implémenté dans v0.2\r\n // après que le core soit stable\r\n console.warn('[Stato] store.on() disponible en v0.2')\r\n}","// ─────────────────────────────────────────────────────\r\n// TYPES PUBLICS DE @ngstato/core\r\n// ─────────────────────────────────────────────────────\r\n\r\n// Le state de base — tout sauf actions/computed/selectors/hooks\r\nexport type StateSlice<T> = Omit<T, 'actions' | 'computed' | 'selectors' | 'hooks'>\r\n\r\n// Une action — sync ou async\r\nexport type Action<S> = (state: S, ...args: any[]) => void | Promise<void> | (() => void)\r\n\r\n// Map d'actions\r\nexport type ActionsMap<S> = Record<string, Action<S>>\r\n\r\n// Computed — dérivé du state local\r\nexport type ComputedFn<S> = (state: S) => unknown\r\nexport type SelectorFn<S> = (state: S) => unknown\r\nexport type EffectDepsFn<S> = (state: S) => unknown | unknown[]\r\nexport type EffectCleanup = void | (() => void)\r\nexport type EffectRunner<S> = (\r\n depsValue: unknown | unknown[],\r\n ctx: { state: Readonly<S>; store: any; prevDepsValue?: unknown | unknown[] }\r\n) => EffectCleanup | Promise<EffectCleanup>\r\nexport type EffectEntry<S> = [EffectDepsFn<S>, EffectRunner<S>]\r\n\r\n// Hooks lifecycle\r\nexport interface StatoHooks<S> {\r\n // Lifecycle du store\r\n onInit?: (store: S) => void | Promise<void>\r\n onDestroy?: (store: S) => void | Promise<void>\r\n\r\n // Lifecycle des actions\r\n onAction?: (name: string, args: unknown[]) => void\r\n onActionDone?: (name: string, duration: number) => void\r\n onError?: (error: Error, actionName: string) => void\r\n\r\n // Lifecycle du state\r\n onStateChange?: (prev: S, next: S) => void\r\n}\r\n\r\n// Configuration du store\r\nexport interface StatoStoreConfig<S extends object> {\r\n actions?: ActionsMap<StateSlice<S>>\r\n computed?: Record<string, ComputedFn<StateSlice<S>> | unknown[]>\r\n selectors?: Record<string, SelectorFn<StateSlice<S>> | unknown[]>\r\n effects?: EffectEntry<StateSlice<S>>[]\r\n hooks?: StatoHooks<any>\r\n [key: string]: unknown\r\n}\r\n\r\n// Instance publique du store\r\nexport type StatoStoreInstance<S extends object> = {\r\n // readonly — on ne peut lire, jamais écrire directement\r\n readonly [K in keyof StateSlice<S>]: StateSlice<S>[K]\r\n} & {\r\n // Les actions sont exposées sans le paramètre state\r\n [K in keyof S as S[K] extends Function ? K : never]:\r\n S[K] extends (state: any, ...args: infer A) => infer R\r\n ? (...args: A) => R\r\n : never\r\n}\r\n\r\n// Configuration du client HTTP\r\nexport interface StatoConfig {\r\n baseUrl?: string\r\n timeout?: number\r\n headers?: Record<string, string>\r\n auth?: () => string | null | undefined\r\n}\r\n\r\n// Erreur HTTP\r\nexport class StatoHttpError extends Error {\r\n constructor(\r\n public status: number,\r\n public body: string\r\n ) {\r\n super(`HTTP ${status}: ${body}`)\r\n this.name = 'StatoHttpError'\r\n }\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — StatoHttp\r\n// Client HTTP natif — fetch + baseUrl + auth + timeout\r\n// Zero dépendance — pas de HttpClient Angular\r\n// ─────────────────────────────────────────────────────\r\n\r\nimport type { StatoConfig } from './types'\r\nimport { StatoHttpError } from './types'\r\n\r\n// ─────────────────────────────────────────────────────\r\n// OPTIONS PAR REQUÊTE\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport interface RequestOptions {\r\n params?: Record<string, string | number | boolean>\r\n headers?: Record<string, string>\r\n signal?: AbortSignal // pour abortable()\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// CLASSE PRINCIPALE\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport class StatoHttp {\r\n\r\n private _config: StatoConfig\r\n\r\n constructor(config: StatoConfig = {}) {\r\n this._config = config\r\n }\r\n\r\n // ── GET ───────────────────────────────────────────\r\n get<T = unknown>(url: string, options?: RequestOptions): Promise<T> {\r\n return this._request<T>('GET', url, undefined, options)\r\n }\r\n\r\n // ── POST ──────────────────────────────────────────\r\n post<T = unknown>(url: string, body?: unknown, options?: RequestOptions): Promise<T> {\r\n return this._request<T>('POST', url, body, options)\r\n }\r\n\r\n // ── PUT ───────────────────────────────────────────\r\n put<T = unknown>(url: string, body?: unknown, options?: RequestOptions): Promise<T> {\r\n return this._request<T>('PUT', url, body, options)\r\n }\r\n\r\n // ── PATCH ─────────────────────────────────────────\r\n patch<T = unknown>(url: string, body?: unknown, options?: RequestOptions): Promise<T> {\r\n return this._request<T>('PATCH', url, body, options)\r\n }\r\n\r\n // ── DELETE ────────────────────────────────────────\r\n delete<T = unknown>(url: string, options?: RequestOptions): Promise<T> {\r\n return this._request<T>('DELETE', url, undefined, options)\r\n }\r\n\r\n // ── MOTEUR INTERNE ────────────────────────────────\r\n private async _request<T>(\r\n method: string,\r\n url: string,\r\n body?: unknown,\r\n options?: RequestOptions\r\n ): Promise<T> {\r\n\r\n // 1. Construire l'URL complète avec baseUrl + params\r\n const fullUrl = this._buildUrl(url, options?.params)\r\n\r\n // 2. Récupérer le token auth si configuré\r\n const token = this._config.auth?.()\r\n\r\n // 3. Construire les headers\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n ...this._config.headers,\r\n ...options?.headers,\r\n ...(token ? { Authorization: `Bearer ${token}` } : {})\r\n }\r\n\r\n // 4. Configurer le timeout si défini\r\n let signal = options?.signal\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined\r\n\r\n if (this._config.timeout && !signal) {\r\n const controller = new AbortController()\r\n signal = controller.signal\r\n timeoutId = setTimeout(\r\n () => controller.abort(),\r\n this._config.timeout\r\n )\r\n }\r\n\r\n // 5. Exécuter la requête\r\n try {\r\n const response = await fetch(fullUrl, {\r\n method,\r\n headers,\r\n signal,\r\n ...(body !== undefined\r\n ? { body: JSON.stringify(body) }\r\n : {}\r\n )\r\n })\r\n\r\n // 6. Gérer les erreurs HTTP automatiquement\r\n if (!response.ok) {\r\n const errorBody = await response.text()\r\n throw new StatoHttpError(response.status, errorBody)\r\n }\r\n\r\n // 7. Réponse vide — ex: DELETE 204\r\n const contentType = response.headers.get('content-type')\r\n if (\r\n response.status === 204 ||\r\n !contentType?.includes('application/json')\r\n ) {\r\n return undefined as T\r\n }\r\n\r\n // 8. Parser le JSON\r\n return response.json() as Promise<T>\r\n\r\n } finally {\r\n // Toujours nettoyer le timeout\r\n if (timeoutId) clearTimeout(timeoutId)\r\n }\r\n }\r\n\r\n // ── CONSTRUIRE L'URL AVEC PARAMS ──────────────────\r\n private _buildUrl(\r\n path: string,\r\n params?: Record<string, string | number | boolean>\r\n ): string {\r\n\r\n // Si l'URL est absolue — on ne préfixe pas baseUrl\r\n const url = path.startsWith('http')\r\n ? path\r\n : `${this._config.baseUrl ?? ''}${path}`\r\n\r\n // Ajouter les query params si présents\r\n if (!params || Object.keys(params).length === 0) return url\r\n\r\n const qs = new URLSearchParams(\r\n Object.entries(params).map(([k, v]) => [k, String(v)])\r\n ).toString()\r\n\r\n return `${url}?${qs}`\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// FACTORY FUNCTION — createHttp()\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function createHttp(config: StatoConfig = {}): StatoHttp {\r\n return new StatoHttp(config)\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// INSTANCE GLOBALE — http\r\n// Utilisée dans les actions des stores\r\n// Configurée via provideStato()\r\n// ─────────────────────────────────────────────────────\r\n\r\nlet _globalHttp: StatoHttp = new StatoHttp()\r\n\r\nexport function configureHttp(config: StatoConfig): void {\r\n _globalHttp = new StatoHttp(config)\r\n}\r\n\r\n// L'objet http — utilisé dans les actions\r\n// await http.get('/api/users')\r\nexport const http = {\r\n get: <T>(url: string, options?: RequestOptions) =>\r\n _globalHttp.get<T>(url, options),\r\n\r\n post: <T>(url: string, body?: unknown, options?: RequestOptions) =>\r\n _globalHttp.post<T>(url, body, options),\r\n\r\n put: <T>(url: string, body?: unknown, options?: RequestOptions) =>\r\n _globalHttp.put<T>(url, body, options),\r\n\r\n patch: <T>(url: string, body?: unknown, options?: RequestOptions) =>\r\n _globalHttp.patch<T>(url, body, options),\r\n\r\n delete: <T>(url: string, options?: RequestOptions) =>\r\n _globalHttp.delete<T>(url, options),\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — abortable()\r\n// Annule automatiquement la requête précédente\r\n// Remplace switchMap de RxJS — sans RxJS\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport interface AbortableOptions {\r\n signal: AbortSignal\r\n}\r\n\r\nexport function abortable<S, A extends unknown[]>(\r\n fn: (state: S, ...args: [...A, AbortableOptions]) => Promise<void>\r\n) {\r\n let controller: AbortController | null = null\r\n\r\n return async (state: S, ...args: A): Promise<void> => {\r\n // Annuler la requête précédente si elle tourne encore\r\n if (controller) {\r\n controller.abort()\r\n }\r\n\r\n // Créer un nouveau controller pour cette requête\r\n controller = new AbortController()\r\n const signal = controller.signal\r\n\r\n try {\r\n await fn(state, ...args, { signal } as any)\r\n } catch (error: any) {\r\n // Ignorer silencieusement les erreurs d'annulation\r\n if (error?.name === 'AbortError') return\r\n throw error\r\n } finally {\r\n controller = null\r\n }\r\n }\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — debounced()\r\n// Attend que l'utilisateur arrête de taper\r\n// Remplace debounceTime de RxJS — sans RxJS\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function debounced<S, A extends unknown[]>(\r\n fn: (state: S, ...args: A) => void | Promise<void>,\r\n ms: number = 300\r\n) {\r\n let timer: ReturnType<typeof setTimeout> | null = null\r\n\r\n return (state: S, ...args: A): Promise<void> => {\r\n // Annuler le timer précédent\r\n if (timer) clearTimeout(timer)\r\n\r\n // Retourner une Promise qui se résout après le délai\r\n return new Promise((resolve, reject) => {\r\n timer = setTimeout(async () => {\r\n try {\r\n await fn(state, ...args)\r\n resolve()\r\n } catch (error) {\r\n reject(error)\r\n } finally {\r\n timer = null\r\n }\r\n }, ms)\r\n })\r\n }\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — throttled()\r\n// Limite la fréquence d'exécution d'une action\r\n// Remplace throttleTime de RxJS — sans RxJS\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function throttled<S, A extends unknown[]>(\r\n fn: (state: S, ...args: A) => void | Promise<void>,\r\n ms: number = 300\r\n) {\r\n let lastCall = 0\r\n let timer: ReturnType<typeof setTimeout> | null = null\r\n\r\n return async (state: S, ...args: A): Promise<void> => {\r\n const now = Date.now()\r\n const remaining = ms - (now - lastCall)\r\n\r\n if (remaining <= 0) {\r\n // Assez de temps passé — on exécute immédiatement\r\n lastCall = now\r\n if (timer) {\r\n clearTimeout(timer)\r\n timer = null\r\n }\r\n await fn(state, ...args)\r\n } else {\r\n // Trop tôt — on planifie pour la fin du délai\r\n if (timer) clearTimeout(timer)\r\n return new Promise((resolve, reject) => {\r\n timer = setTimeout(async () => {\r\n lastCall = Date.now()\r\n timer = null\r\n try {\r\n await fn(state, ...args)\r\n resolve()\r\n } catch (error) {\r\n reject(error)\r\n }\r\n }, remaining)\r\n })\r\n }\r\n }\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — retryable()\r\n// Réessaie automatiquement en cas d'échec\r\n// Remplace retryWhen de RxJS — sans RxJS\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport interface RetryOptions {\r\n attempts: number // nombre de tentatives\r\n backoff: 'fixed' | 'exponential' // stratégie de délai\r\n delay?: number // délai de base en ms (défaut 1000)\r\n onRetry?: (attempt: number, error: Error) => void // callback optionnel\r\n}\r\n\r\nexport function retryable<S, A extends unknown[]>(\r\n fn: (state: S, ...args: A) => Promise<void>,\r\n options: RetryOptions = {\r\n attempts: 3,\r\n backoff: 'exponential',\r\n delay: 1000\r\n }\r\n) {\r\n return async (state: S, ...args: A): Promise<void> => {\r\n const { attempts, backoff, delay = 1000, onRetry } = options\r\n\r\n for (let i = 0; i < attempts; i++) {\r\n try {\r\n await fn(state, ...args)\r\n return // succès — on sort immédiatement\r\n\r\n } catch (error) {\r\n const isLastAttempt = i === attempts - 1\r\n\r\n // Dernière tentative — on remonte l'erreur\r\n if (isLastAttempt) throw error\r\n\r\n // Calculer le délai avant la prochaine tentative\r\n const waitMs = backoff === 'exponential'\r\n ? delay * Math.pow(2, i) // 1s, 2s, 4s, 8s...\r\n : delay // fixe : toujours 1s\r\n\r\n // Callback optionnel — pour logger ou afficher un message\r\n onRetry?.(i + 1, error as Error)\r\n\r\n // Attendre avant de réessayer\r\n await new Promise(resolve => setTimeout(resolve, waitMs))\r\n }\r\n }\r\n }\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — fromStream()\r\n// Pont entre un flux Observable/callback et le state\r\n// Pour : Firebase, Supabase, WebSocket, SSE\r\n// RxJS optionnel — pas obligatoire\r\n// ─────────────────────────────────────────────────────\r\n\r\n// Interface minimale d'un Observable\r\n// Compatible RxJS sans l'importer\r\nexport interface StatoObservable<T> {\r\n subscribe(observer: {\r\n next?: (value: T) => void\r\n error?: (error: unknown) => void\r\n complete?: () => void\r\n }): { unsubscribe(): void }\r\n}\r\n\r\nexport interface StreamOptions {\r\n // Appelé quand le stream se termine normalement\r\n onComplete?: () => void\r\n // Appelé quand le stream rencontre une erreur\r\n onError?: (error: unknown) => void\r\n}\r\n\r\nexport function fromStream<S, T>(\r\n // setupFn — retourne l'Observable ou le flux\r\n setupFn: (state: S) => StatoObservable<T>,\r\n // updateFn — appelé à chaque valeur émise\r\n updateFn: (state: S, value: T) => void,\r\n options?: StreamOptions\r\n) {\r\n return (state: S): (() => void) => {\r\n // Démarrer le flux\r\n const stream$ = setupFn(state)\r\n const subscription = stream$.subscribe({\r\n\r\n next: (value: T) => {\r\n // Mettre à jour le state à chaque émission\r\n updateFn(state, value)\r\n },\r\n\r\n error: (error: unknown) => {\r\n options?.onError?.(error)\r\n },\r\n\r\n complete: () => {\r\n options?.onComplete?.()\r\n }\r\n })\r\n\r\n // Retourner la fonction de cleanup\r\n // appelée automatiquement à la destruction du store\r\n return () => subscription.unsubscribe()\r\n }\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — optimistic()\r\n// Mise à jour optimiste avec rollback automatique\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function optimistic<S, A extends unknown[]>(\r\n // Action immédiate — modifie le state sans attendre\r\n immediate: (state: S, ...args: A) => void,\r\n // Confirmation API — si elle échoue → rollback\r\n confirm: (state: S, ...args: A) => Promise<void>\r\n) {\r\n return async (state: S, ...args: A): Promise<void> => {\r\n // 1. Snapshot du state AVANT la modification\r\n const snapshot = { ...(state as object) } as S\r\n\r\n // 2. Appliquer la modification immédiatement\r\n immediate(state, ...args)\r\n\r\n try {\r\n // 3. Confirmer avec l'API\r\n await confirm(state, ...args)\r\n // Succès — le state optimiste est correct, rien à faire\r\n\r\n } catch (error) {\r\n // 4. Échec — restaurer le state d'avant\r\n Object.assign(state as object, snapshot)\r\n throw error\r\n }\r\n }\r\n}","import type { StateSlice, StatoStoreConfig, StatoHooks } from '../types'\n\nexport interface PersistStorage {\n getItem(key: string): string | null\n setItem(key: string, value: string): void\n removeItem(key: string): void\n}\n\nexport interface PersistEnvelope<T> {\n v: number\n data: Partial<T>\n}\n\nexport interface PersistOptions<S extends object> {\n key: string\n version?: number\n storage?: PersistStorage\n pick?: (keyof S)[]\n migrate?: (data: unknown, fromVersion: number) => Partial<S>\n onError?: (error: Error) => void\n}\n\nfunction resolveStorage(custom?: PersistStorage): PersistStorage | null {\n if (custom) return custom\n if (typeof window === 'undefined') return null\n try {\n return window.localStorage\n } catch {\n return null\n }\n}\n\nfunction pickState<S extends object>(state: Partial<S>, keys?: (keyof S)[]) {\n if (!keys?.length) return state\n const picked: Partial<S> = {}\n for (const key of keys) {\n picked[key] = state[key]\n }\n return picked\n}\n\nexport function withPersist<S extends object>(\n config: S & StatoStoreConfig<S>,\n options: PersistOptions<StateSlice<S>>\n): S & StatoStoreConfig<S> {\n const {\n key,\n version = 1,\n storage: customStorage,\n pick,\n migrate,\n onError\n } = options\n\n const storage = resolveStorage(customStorage)\n const userHooks = config.hooks ?? {}\n\n const mergedHooks: StatoHooks<any> = {\n ...userHooks,\n onInit(store: any) {\n try {\n if (!storage) return userHooks.onInit?.(store)\n const raw = storage.getItem(key)\n if (!raw) return userHooks.onInit?.(store)\n\n const parsed = JSON.parse(raw) as PersistEnvelope<StateSlice<S>>\n const data =\n parsed.v === version\n ? parsed.data\n : migrate\n ? migrate(parsed.data, parsed.v)\n : parsed.data\n\n if (data && typeof data === 'object') {\n store.__store__?.hydrate?.(data)\n }\n } catch (error) {\n onError?.(error as Error)\n }\n return userHooks.onInit?.(store)\n },\n\n onStateChange(prev: any, next: any) {\n try {\n if (storage) {\n const payload: PersistEnvelope<StateSlice<S>> = {\n v: version,\n data: pickState(next, pick as (keyof StateSlice<S>)[] | undefined)\n }\n storage.setItem(key, JSON.stringify(payload))\n }\n } catch (error) {\n onError?.(error as Error)\n }\n userHooks.onStateChange?.(prev, next)\n },\n\n onDestroy(store: any) {\n return userHooks.onDestroy?.(store)\n },\n onAction(name: string, args: unknown[]) {\n return userHooks.onAction?.(name, args)\n },\n onActionDone(name: string, duration: number) {\n return userHooks.onActionDone?.(name, duration)\n },\n onError(error: Error, actionName: string) {\n return userHooks.onError?.(error, actionName)\n }\n }\n\n return {\n ...config,\n hooks: mergedHooks\n }\n}\n\n","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — DevTools\r\n// Logique pure — pas de dépendance Angular\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport interface ActionLog {\r\n id: number\r\n name: string\r\n args: unknown[]\r\n duration: number\r\n status: 'success' | 'error'\r\n error?: string\r\n prevState: unknown\r\n nextState: unknown\r\n at: string\r\n}\r\n\r\nexport interface DevToolsState {\r\n logs: ActionLog[]\r\n isOpen: boolean\r\n maxLogs: number\r\n}\r\n\r\nexport interface DevToolsInstance {\r\n state: DevToolsState\r\n logAction: (log: Omit<ActionLog, 'id' | 'at'>) => void\r\n clear: () => void\r\n open: () => void\r\n close: () => void\r\n toggle: () => void\r\n subscribe: (cb: (state: DevToolsState) => void) => () => void\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// FACTORY\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function createDevTools(maxLogs = 50): DevToolsInstance {\r\n let counter = 0\r\n\r\n const state: DevToolsState = {\r\n logs: [],\r\n isOpen: false,\r\n maxLogs\r\n }\r\n\r\n const listeners = new Set<(state: DevToolsState) => void>()\r\n\r\n function notify() {\r\n listeners.forEach(cb => cb({ ...state, logs: [...state.logs] }))\r\n }\r\n\r\n return {\r\n state,\r\n\r\n logAction(log) {\r\n const entry: ActionLog = {\r\n ...log,\r\n id: ++counter,\r\n at: new Date().toISOString()\r\n }\r\n\r\n state.logs = [entry, ...state.logs].slice(0, maxLogs)\r\n notify()\r\n },\r\n\r\n clear() {\r\n state.logs = []\r\n notify()\r\n },\r\n\r\n open() {\r\n state.isOpen = true\r\n notify()\r\n },\r\n\r\n close() {\r\n state.isOpen = false\r\n notify()\r\n },\r\n\r\n toggle() {\r\n state.isOpen = !state.isOpen\r\n notify()\r\n },\r\n\r\n subscribe(cb) {\r\n listeners.add(cb)\r\n return () => listeners.delete(cb)\r\n }\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// INSTANCE GLOBALE — singleton partagé entre tous les stores\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport const devTools = createDevTools()\r\n\r\n// ─────────────────────────────────────────────────────\r\n// PLUGIN — connecte un store aux DevTools\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function connectDevTools(store: any, storeName: string) {\r\n if (!devTools) return\r\n\r\n let prevState: any = {}\r\n\r\n // Accès aux hooks via __store__\r\n const internalStore = store.__store__\r\n\r\n if (!internalStore) return\r\n\r\n // Sauvegarder les hooks existants\r\n const existingHooks = { ...internalStore['_hooks'] }\r\n\r\n // Remplacer les hooks\r\n internalStore['_hooks'] = {\r\n ...existingHooks,\r\n\r\n onAction(name: string, args: unknown[]) {\r\n prevState = store.getState()\r\n existingHooks.onAction?.(name, args)\r\n },\r\n\r\n onActionDone(name: string, duration: number) {\r\n const nextState = store.getState()\r\n devTools.logAction({\r\n name: `[${storeName}] ${name}`,\r\n args: [],\r\n duration,\r\n status: 'success',\r\n prevState: { ...prevState },\r\n nextState: { ...nextState }\r\n })\r\n existingHooks.onActionDone?.(name, duration)\r\n },\r\n\r\n onError(error: Error, actionName: string) {\r\n devTools.logAction({\r\n name: `[${storeName}] ${actionName}`,\r\n args: [],\r\n duration: 0,\r\n status: 'error',\r\n error: error.message,\r\n prevState: { ...prevState },\r\n nextState: { ...prevState }\r\n })\r\n existingHooks.onError?.(error, actionName)\r\n },\r\n\r\n onStateChange: existingHooks.onStateChange\r\n }\r\n}"]}
1
+ {"version":3,"sources":["../src/action-bus.ts","../src/store.ts","../src/types.ts","../src/http.ts","../src/helpers/abortable.ts","../src/helpers/debounced.ts","../src/helpers/throttled.ts","../src/helpers/retryable.ts","../src/helpers/from-stream.ts","../src/helpers/optimistic.ts","../src/helpers/exclusive.ts","../src/helpers/queued.ts","../src/helpers/distinct-until-changed.ts","../src/helpers/fork-join.ts","../src/helpers/race.ts","../src/helpers/combine-latest.ts","../src/helpers/combine-latest-stream.ts","../src/helpers/entity-adapter.ts","../src/helpers/with-entities.ts","../src/helpers/stream-operators.ts","../src/helpers/with-persist.ts","../src/devtools.ts"],"names":["throttled"],"mappings":"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","file":"index.js","sourcesContent":["// ─────────────────────────────────────────────────────\n// @ngstato/core — Action Bus (inter-stores)\n// Permet d'écouter l'exécution d'une action spécifique.\n// ─────────────────────────────────────────────────────\n\nexport type ActionEvent = {\n action: Function\n name: string\n args: unknown[]\n store: any\n status: 'success' | 'error'\n duration: number\n error?: Error\n}\n\ntype Listener = (event: ActionEvent) => void\n\nconst listenersByAction = new WeakMap<Function, Set<Listener>>()\n\nexport function emitActionEvent(event: ActionEvent) {\n const set = listenersByAction.get(event.action)\n if (!set?.size) return\n for (const listener of set) {\n try {\n listener(event)\n } catch {\n // Ne jamais casser le flux d'une action à cause d'un listener.\n }\n }\n}\n\nexport function subscribeToAction(action: Function, listener: Listener): () => void {\n let set = listenersByAction.get(action)\n if (!set) {\n set = new Set()\n listenersByAction.set(action, set)\n }\n set.add(listener)\n return () => {\n set?.delete(listener)\n }\n}\n\n","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — createStore()\r\n// Le moteur principal de Stato\r\n// ─────────────────────────────────────────────────────\r\n\r\nimport type {\r\n StatoStoreConfig,\r\n StatoHooks,\r\n StateSlice,\r\n EffectEntry\r\n} from './types'\r\nimport { emitActionEvent, subscribeToAction } from './action-bus'\r\n\r\n// ─────────────────────────────────────────────────────\r\n// CLASSE INTERNE — jamais exposée directement\r\n// ─────────────────────────────────────────────────────\r\n\r\nclass StatoStore<S extends object> {\r\n\r\n // Le state interne — jamais accessible directement\r\n private _state: StateSlice<S>\r\n\r\n // Les abonnés — notifiés à chaque changement\r\n private _subscribers: Set<(state: StateSlice<S>) => void> = new Set()\r\n\r\n // Les actions enregistrées\r\n private _actions: Record<string, Function> = {}\r\n\r\n // Les computed enregistrés\r\n private _computed: Record<string, () => unknown> = {}\r\n private _selectors: Record<string, () => unknown> = {}\r\n\r\n // Les cleanups à appeler à la destruction\r\n private _cleanups: Array<() => void> = []\r\n\r\n // Les hooks lifecycle\r\n private _hooks: StatoHooks<any>\r\n private _publicStore: any = null\r\n private _publicActions: Record<string, Function> = {}\r\n private _initialized = false\r\n private _effects: Array<{\r\n deps: (state: StateSlice<S>) => unknown | unknown[]\r\n run: Function\r\n prevDeps?: unknown[]\r\n hasRun: boolean\r\n cleanup?: () => void\r\n running: boolean\r\n rerunRequested: boolean\r\n }> = []\r\n\r\n private _createMemoizedSelector(fn: Function): () => unknown {\r\n let initialized = false\r\n let cachedResult: unknown\r\n let trackedKeys: string[] = []\r\n let trackedValues: unknown[] = []\r\n\r\n return () => {\r\n if (initialized && trackedKeys.length) {\r\n const unchanged = trackedKeys.every((key, index) =>\r\n Object.is((this._state as any)[key], trackedValues[index])\r\n )\r\n if (unchanged) return cachedResult\r\n }\r\n\r\n const reads = new Set<string>()\r\n const trackingState = new Proxy(this._state as any, {\r\n get: (target, prop, receiver) => {\r\n if (typeof prop === 'string' && prop in target) {\r\n reads.add(prop)\r\n }\r\n return Reflect.get(target, prop, receiver)\r\n }\r\n })\r\n\r\n const result = fn(trackingState)\r\n\r\n trackedKeys = Array.from(reads)\r\n trackedValues = trackedKeys.map((key) => (this._state as any)[key])\r\n cachedResult = result\r\n initialized = true\r\n\r\n return result\r\n }\r\n }\r\n\r\n constructor(config: StatoStoreConfig<S>) {\r\n // 1. Extraire le state initial — tout sauf actions/computed/hooks\r\n const { actions, computed, selectors, effects, hooks, ...initialState } = config\r\n this._state = initialState as StateSlice<S>\r\n this._hooks = hooks ?? {}\r\n\r\n // 2. Enregistrer les actions\r\n if (actions) {\r\n for (const [name, fn] of Object.entries(actions)) {\r\n this._actions[name] = fn\r\n }\r\n }\r\n\r\n // 3. Enregistrer les computed\r\n if (computed) {\r\n for (const [name, fn] of Object.entries(computed)) {\r\n if (typeof fn === 'function') {\r\n this._computed[name] = () => (fn as Function)(this._state)\r\n }\r\n }\r\n }\r\n\r\n // 4. Enregistrer les selectors memoïzés\r\n if (selectors) {\r\n for (const [name, fn] of Object.entries(selectors)) {\r\n if (typeof fn === 'function') {\r\n this._selectors[name] = this._createMemoizedSelector(fn as Function)\r\n }\r\n }\r\n }\r\n\r\n if (effects) {\r\n for (const entry of effects) {\r\n const [deps, run] = entry as EffectEntry<StateSlice<S>>\r\n if (typeof deps === 'function' && typeof run === 'function') {\r\n this._effects.push({\r\n deps,\r\n run,\r\n hasRun: false,\r\n running: false,\r\n rerunRequested: false\r\n })\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ── Lire le state ──────────────────────────────────\r\n getState(): Readonly<StateSlice<S>> {\r\n return { ...this._state }\r\n }\r\n\r\n // ── Modifier le state — usage interne uniquement ───\r\n private _setState(partial: Partial<StateSlice<S>>) {\r\n // Copie immutable — on ne modifie jamais l'objet original\r\n this._state = { ...this._state, ...partial }\r\n this._runEffects()\r\n this._notify()\r\n }\r\n\r\n private _normalizeDeps(value: unknown | unknown[]): unknown[] {\r\n return Array.isArray(value) ? value : [value]\r\n }\r\n\r\n private _depsChanged(prev: unknown[] | undefined, next: unknown[]): boolean {\r\n if (!prev) return true\r\n if (prev.length !== next.length) return true\r\n for (let i = 0; i < next.length; i++) {\r\n if (!Object.is(prev[i], next[i])) return true\r\n }\r\n return false\r\n }\r\n\r\n private _runEffects(force = false) {\r\n for (const effect of this._effects) {\r\n const depsValue = effect.deps(this._state)\r\n const depsArray = this._normalizeDeps(depsValue)\r\n const shouldRun = force || this._depsChanged(effect.prevDeps, depsArray)\r\n if (!shouldRun) continue\r\n\r\n const execute = async () => {\r\n if (effect.running) {\r\n effect.rerunRequested = true\r\n return\r\n }\r\n\r\n effect.running = true\r\n effect.rerunRequested = false\r\n const prevDepsValue = effect.prevDeps\r\n effect.prevDeps = depsArray\r\n\r\n try {\r\n effect.cleanup?.()\r\n const maybeCleanup = await effect.run(depsValue, {\r\n state: { ...this._state },\r\n store: this._publicStore,\r\n prevDepsValue\r\n })\r\n effect.cleanup = typeof maybeCleanup === 'function' ? maybeCleanup : undefined\r\n effect.hasRun = true\r\n } catch (error) {\r\n this._hooks.onError?.(error as Error, 'effect')\r\n } finally {\r\n effect.running = false\r\n if (effect.rerunRequested) {\r\n this._runEffects()\r\n }\r\n }\r\n }\r\n\r\n void execute()\r\n }\r\n }\r\n\r\n // ── Notifier tous les abonnés ──────────────────────\r\n private _notify() {\r\n for (const subscriber of this._subscribers) {\r\n subscriber({ ...this._state })\r\n }\r\n }\r\n\r\n // ── S'abonner aux changements ──────────────────────\r\n subscribe(fn: (state: StateSlice<S>) => void): () => void {\r\n this._subscribers.add(fn)\r\n // Retourne une fonction de désabonnement\r\n return () => this._subscribers.delete(fn)\r\n }\r\n\r\n // ── Exécuter une action ────────────────────────────\r\nasync dispatch(actionName: string, ...args: unknown[]) {\r\n const action = this._actions[actionName]\r\n if (!action) {\r\n throw new Error(`[Stato] Action \"${actionName}\" introuvable`)\r\n }\r\n\r\n const publicAction = this._publicActions[actionName]\r\n\r\n // Hook onAction — avant l'exécution\r\n this._hooks.onAction?.(actionName, args)\r\n\r\n const start = Date.now()\r\n const prevState = { ...this._state }\r\n\r\n const stateProxy = new Proxy({ ...this._state } as any, {\r\n set: (target, key, value) => {\r\n target[key] = value\r\n this._setState({ [key]: value } as any)\r\n return true\r\n }\r\n })\r\n\r\n try {\r\n await action(stateProxy, ...args)\r\n\r\n // Hook onActionDone — après l'exécution\r\n const duration = Date.now() - start\r\n this._hooks.onActionDone?.(actionName, duration)\r\n\r\n // Hook onStateChange — si le state a changé\r\n this._hooks.onStateChange?.(prevState as any, { ...this._state } as any)\r\n\r\n if (publicAction) {\r\n emitActionEvent({\r\n action: publicAction,\r\n name: actionName,\r\n args,\r\n store: this._publicStore,\r\n status: 'success',\r\n duration\r\n })\r\n }\r\n\r\n } catch (error) {\r\n // Hook onError — si une erreur est lancée\r\n this._hooks.onError?.(error as Error, actionName)\r\n\r\n if (publicAction) {\r\n emitActionEvent({\r\n action: publicAction,\r\n name: actionName,\r\n args,\r\n store: this._publicStore,\r\n status: 'error',\r\n duration: Date.now() - start,\r\n error: error as Error\r\n })\r\n }\r\n throw error // on remonte l'erreur quand même\r\n }\r\n}\r\n\r\n // ── Lire une valeur computed ───────────────────────\r\n getComputed(name: string): unknown {\r\n const fn = this._computed[name]\r\n if (!fn) throw new Error(`[Stato] Computed \"${name}\" introuvable`)\r\n return fn()\r\n }\r\n\r\n getSelector(name: string): unknown {\r\n const fn = this._selectors[name]\r\n if (!fn) throw new Error(`[Stato] Selector \"${name}\" introuvable`)\r\n return fn()\r\n }\r\n\r\n // ── Enregistrer un cleanup (pour fromStream) ───────\r\n registerCleanup(fn: () => void) {\r\n this._cleanups.push(fn)\r\n }\r\n\r\n registerPublicAction(name: string, fn: Function) {\r\n this._publicActions[name] = fn\r\n }\r\n\r\n hydrate(partial: Partial<StateSlice<S>>) {\r\n this._setState(partial)\r\n }\r\n\r\n setPublicStore(publicStore: any) {\r\n this._publicStore = publicStore\r\n this._runEffects(true)\r\n }\r\n\r\n // ── Lifecycle — appelé par l'adaptateur Angular ────\r\n init(publicStore: any) {\r\n this._publicStore = publicStore\r\n if (!this._initialized) {\r\n this._initialized = true\r\n this._hooks.onInit?.(publicStore)\r\n }\r\n this._runEffects(true)\r\n }\r\n\r\n destroy(publicStore: any) {\r\n this._hooks.onDestroy?.(publicStore)\r\n for (const effect of this._effects) {\r\n effect.cleanup?.()\r\n effect.cleanup = undefined\r\n }\r\n // Nettoyer tous les streams ouverts\r\n for (const cleanup of this._cleanups) {\r\n cleanup()\r\n }\r\n this._cleanups = []\r\n this._subscribers.clear()\r\n this._initialized = false\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// FONCTION PUBLIQUE — createStore()\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function createStore<S extends object>(config: S & StatoStoreConfig<S>) {\r\n\r\n // Créer l'instance interne\r\n const store = new StatoStore<S>(config as StatoStoreConfig<S>)\r\n\r\n // Construire l'objet public\r\n // Les propriétés du state sont accessibles directement\r\n // Les actions sont exposées sans le paramètre state\r\n const publicStore: any = {\r\n // Accès au store interne — pour les adaptateurs Angular/React/Vue\r\n __store__: store,\r\n\r\n // S'abonner aux changements\r\n subscribe: store.subscribe.bind(store),\r\n\r\n // Lire le state complet\r\n getState: store.getState.bind(store),\r\n\r\n // Enregistrer un cleanup\r\n registerCleanup: store.registerCleanup.bind(store),\r\n }\r\n\r\n // Exposer chaque propriété du state\r\n const initialState = store.getState()\r\n for (const key of Object.keys(initialState as object)) {\r\n Object.defineProperty(publicStore, key, {\r\n get: () => store.getState()[key as keyof typeof initialState],\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n\r\n // Exposer chaque action\r\n const { actions, computed, selectors } = config as StatoStoreConfig<S>\r\n\r\n if (actions) {\r\n for (const name of Object.keys(actions)) {\r\n const fn = (...args: unknown[]) => store.dispatch(name, ...args)\r\n publicStore[name] = fn\r\n store.registerPublicAction(name, fn)\r\n }\r\n }\r\n\r\n // Exposer chaque computed\r\n if (computed) {\r\n for (const name of Object.keys(computed)) {\r\n Object.defineProperty(publicStore, name, {\r\n get: () => store.getComputed(name),\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n }\r\n\r\n if (selectors) {\r\n for (const name of Object.keys(selectors)) {\r\n Object.defineProperty(publicStore, name, {\r\n get: () => store.getSelector(name),\r\n enumerable: true,\r\n configurable: true\r\n })\r\n }\r\n }\r\n\r\n // Initialiser automatiquement (onInit + premier run effects)\r\n store.init(publicStore)\r\n\r\n return publicStore\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// store.on() — réactions inter-stores\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function on<S extends object>(\r\n sourceAction: Function,\r\n handler: (store: S, event?: { name: string; args: unknown[]; status: 'success' | 'error'; duration: number; error?: Error }) => void | Promise<void>\r\n) {\r\n return subscribeToAction(sourceAction, (event) => {\r\n try {\r\n // handler(store) compatible + handler(store, event) plus riche\r\n void handler(event.store as S, {\r\n name: event.name,\r\n args: event.args,\r\n status: event.status,\r\n duration: event.duration,\r\n error: event.error\r\n })\r\n } catch {\r\n // ignore\r\n }\r\n })\r\n}","// ─────────────────────────────────────────────────────\r\n// TYPES PUBLICS DE @ngstato/core\r\n// ─────────────────────────────────────────────────────\r\n\r\n// Le state de base — tout sauf actions/computed/selectors/hooks\r\nexport type StateSlice<T> = Omit<T, 'actions' | 'computed' | 'selectors' | 'hooks'>\r\n\r\n// Une action — sync ou async\r\nexport type Action<S> = (state: S, ...args: any[]) => void | Promise<void> | (() => void)\r\n\r\n// Map d'actions\r\nexport type ActionsMap<S> = Record<string, Action<S>>\r\n\r\n// Computed — dérivé du state local\r\nexport type ComputedFn<S> = (state: S) => unknown\r\nexport type SelectorFn<S> = (state: S) => unknown\r\nexport type EffectDepsFn<S> = (state: S) => unknown | unknown[]\r\nexport type EffectCleanup = void | (() => void)\r\nexport type EffectRunner<S> = (\r\n depsValue: unknown | unknown[],\r\n ctx: { state: Readonly<S>; store: any; prevDepsValue?: unknown | unknown[] }\r\n) => EffectCleanup | Promise<EffectCleanup>\r\nexport type EffectEntry<S> = [EffectDepsFn<S>, EffectRunner<S>]\r\n\r\n// Hooks lifecycle\r\nexport interface StatoHooks<S> {\r\n // Lifecycle du store\r\n onInit?: (store: S) => void | Promise<void>\r\n onDestroy?: (store: S) => void | Promise<void>\r\n\r\n // Lifecycle des actions\r\n onAction?: (name: string, args: unknown[]) => void\r\n onActionDone?: (name: string, duration: number) => void\r\n onError?: (error: Error, actionName: string) => void\r\n\r\n // Lifecycle du state\r\n onStateChange?: (prev: S, next: S) => void\r\n}\r\n\r\n// Configuration du store\r\nexport interface StatoStoreConfig<S extends object> {\r\n actions?: ActionsMap<StateSlice<S>>\r\n computed?: Record<string, ComputedFn<StateSlice<S>> | unknown[]>\r\n selectors?: Record<string, SelectorFn<StateSlice<S>> | unknown[]>\r\n effects?: EffectEntry<StateSlice<S>>[]\r\n hooks?: StatoHooks<any>\r\n [key: string]: unknown\r\n}\r\n\r\n// Instance publique du store\r\nexport type StatoStoreInstance<S extends object> = {\r\n // readonly — on ne peut lire, jamais écrire directement\r\n readonly [K in keyof StateSlice<S>]: StateSlice<S>[K]\r\n} & {\r\n // Les actions sont exposées sans le paramètre state\r\n [K in keyof S as S[K] extends Function ? K : never]:\r\n S[K] extends (state: any, ...args: infer A) => infer R\r\n ? (...args: A) => R\r\n : never\r\n}\r\n\r\n// Configuration du client HTTP\r\nexport interface StatoConfig {\r\n baseUrl?: string\r\n timeout?: number\r\n headers?: Record<string, string>\r\n auth?: () => string | null | undefined\r\n}\r\n\r\n// Erreur HTTP\r\nexport class StatoHttpError extends Error {\r\n constructor(\r\n public status: number,\r\n public body: string\r\n ) {\r\n super(`HTTP ${status}: ${body}`)\r\n this.name = 'StatoHttpError'\r\n }\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — StatoHttp\r\n// Client HTTP natif — fetch + baseUrl + auth + timeout\r\n// Zero dépendance — pas de HttpClient Angular\r\n// ─────────────────────────────────────────────────────\r\n\r\nimport type { StatoConfig } from './types'\r\nimport { StatoHttpError } from './types'\r\n\r\n// ─────────────────────────────────────────────────────\r\n// OPTIONS PAR REQUÊTE\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport interface RequestOptions {\r\n params?: Record<string, string | number | boolean>\r\n headers?: Record<string, string>\r\n signal?: AbortSignal // pour abortable()\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// CLASSE PRINCIPALE\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport class StatoHttp {\r\n\r\n private _config: StatoConfig\r\n\r\n constructor(config: StatoConfig = {}) {\r\n this._config = config\r\n }\r\n\r\n // ── GET ───────────────────────────────────────────\r\n get<T = unknown>(url: string, options?: RequestOptions): Promise<T> {\r\n return this._request<T>('GET', url, undefined, options)\r\n }\r\n\r\n // ── POST ──────────────────────────────────────────\r\n post<T = unknown>(url: string, body?: unknown, options?: RequestOptions): Promise<T> {\r\n return this._request<T>('POST', url, body, options)\r\n }\r\n\r\n // ── PUT ───────────────────────────────────────────\r\n put<T = unknown>(url: string, body?: unknown, options?: RequestOptions): Promise<T> {\r\n return this._request<T>('PUT', url, body, options)\r\n }\r\n\r\n // ── PATCH ─────────────────────────────────────────\r\n patch<T = unknown>(url: string, body?: unknown, options?: RequestOptions): Promise<T> {\r\n return this._request<T>('PATCH', url, body, options)\r\n }\r\n\r\n // ── DELETE ────────────────────────────────────────\r\n delete<T = unknown>(url: string, options?: RequestOptions): Promise<T> {\r\n return this._request<T>('DELETE', url, undefined, options)\r\n }\r\n\r\n // ── MOTEUR INTERNE ────────────────────────────────\r\n private async _request<T>(\r\n method: string,\r\n url: string,\r\n body?: unknown,\r\n options?: RequestOptions\r\n ): Promise<T> {\r\n\r\n // 1. Construire l'URL complète avec baseUrl + params\r\n const fullUrl = this._buildUrl(url, options?.params)\r\n\r\n // 2. Récupérer le token auth si configuré\r\n const token = this._config.auth?.()\r\n\r\n // 3. Construire les headers\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n ...this._config.headers,\r\n ...options?.headers,\r\n ...(token ? { Authorization: `Bearer ${token}` } : {})\r\n }\r\n\r\n // 4. Configurer le timeout si défini\r\n let signal = options?.signal\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined\r\n\r\n if (this._config.timeout && !signal) {\r\n const controller = new AbortController()\r\n signal = controller.signal\r\n timeoutId = setTimeout(\r\n () => controller.abort(),\r\n this._config.timeout\r\n )\r\n }\r\n\r\n // 5. Exécuter la requête\r\n try {\r\n const response = await fetch(fullUrl, {\r\n method,\r\n headers,\r\n signal,\r\n ...(body !== undefined\r\n ? { body: JSON.stringify(body) }\r\n : {}\r\n )\r\n })\r\n\r\n // 6. Gérer les erreurs HTTP automatiquement\r\n if (!response.ok) {\r\n const errorBody = await response.text()\r\n throw new StatoHttpError(response.status, errorBody)\r\n }\r\n\r\n // 7. Réponse vide — ex: DELETE 204\r\n const contentType = response.headers.get('content-type')\r\n if (\r\n response.status === 204 ||\r\n !contentType?.includes('application/json')\r\n ) {\r\n return undefined as T\r\n }\r\n\r\n // 8. Parser le JSON\r\n return response.json() as Promise<T>\r\n\r\n } finally {\r\n // Toujours nettoyer le timeout\r\n if (timeoutId) clearTimeout(timeoutId)\r\n }\r\n }\r\n\r\n // ── CONSTRUIRE L'URL AVEC PARAMS ──────────────────\r\n private _buildUrl(\r\n path: string,\r\n params?: Record<string, string | number | boolean>\r\n ): string {\r\n\r\n // Si l'URL est absolue — on ne préfixe pas baseUrl\r\n const url = path.startsWith('http')\r\n ? path\r\n : `${this._config.baseUrl ?? ''}${path}`\r\n\r\n // Ajouter les query params si présents\r\n if (!params || Object.keys(params).length === 0) return url\r\n\r\n const qs = new URLSearchParams(\r\n Object.entries(params).map(([k, v]) => [k, String(v)])\r\n ).toString()\r\n\r\n return `${url}?${qs}`\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// FACTORY FUNCTION — createHttp()\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function createHttp(config: StatoConfig = {}): StatoHttp {\r\n return new StatoHttp(config)\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// INSTANCE GLOBALE — http\r\n// Utilisée dans les actions des stores\r\n// Configurée via provideStato()\r\n// ─────────────────────────────────────────────────────\r\n\r\nlet _globalHttp: StatoHttp = new StatoHttp()\r\n\r\nexport function configureHttp(config: StatoConfig): void {\r\n _globalHttp = new StatoHttp(config)\r\n}\r\n\r\n// L'objet http — utilisé dans les actions\r\n// await http.get('/api/users')\r\nexport const http = {\r\n get: <T>(url: string, options?: RequestOptions) =>\r\n _globalHttp.get<T>(url, options),\r\n\r\n post: <T>(url: string, body?: unknown, options?: RequestOptions) =>\r\n _globalHttp.post<T>(url, body, options),\r\n\r\n put: <T>(url: string, body?: unknown, options?: RequestOptions) =>\r\n _globalHttp.put<T>(url, body, options),\r\n\r\n patch: <T>(url: string, body?: unknown, options?: RequestOptions) =>\r\n _globalHttp.patch<T>(url, body, options),\r\n\r\n delete: <T>(url: string, options?: RequestOptions) =>\r\n _globalHttp.delete<T>(url, options),\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — abortable()\r\n// Annule automatiquement la requête précédente\r\n// Remplace switchMap de RxJS — sans RxJS\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport interface AbortableOptions {\r\n signal: AbortSignal\r\n}\r\n\r\nexport function abortable<S, A extends unknown[]>(\r\n fn: (state: S, ...args: [...A, AbortableOptions]) => Promise<void>\r\n) {\r\n let controller: AbortController | null = null\r\n\r\n return async (state: S, ...args: A): Promise<void> => {\r\n // Annuler la requête précédente si elle tourne encore\r\n if (controller) {\r\n controller.abort()\r\n }\r\n\r\n // Créer un nouveau controller pour cette requête\r\n controller = new AbortController()\r\n const signal = controller.signal\r\n\r\n try {\r\n await fn(state, ...args, { signal } as any)\r\n } catch (error: any) {\r\n // Ignorer silencieusement les erreurs d'annulation\r\n if (error?.name === 'AbortError') return\r\n throw error\r\n } finally {\r\n controller = null\r\n }\r\n }\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — debounced()\r\n// Attend que l'utilisateur arrête de taper\r\n// Remplace debounceTime de RxJS — sans RxJS\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function debounced<S, A extends unknown[]>(\r\n fn: (state: S, ...args: A) => void | Promise<void>,\r\n ms: number = 300\r\n) {\r\n let timer: ReturnType<typeof setTimeout> | null = null\r\n\r\n return (state: S, ...args: A): Promise<void> => {\r\n // Annuler le timer précédent\r\n if (timer) clearTimeout(timer)\r\n\r\n // Retourner une Promise qui se résout après le délai\r\n return new Promise((resolve, reject) => {\r\n timer = setTimeout(async () => {\r\n try {\r\n await fn(state, ...args)\r\n resolve()\r\n } catch (error) {\r\n reject(error)\r\n } finally {\r\n timer = null\r\n }\r\n }, ms)\r\n })\r\n }\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — throttled()\r\n// Limite la fréquence d'exécution d'une action\r\n// Remplace throttleTime de RxJS — sans RxJS\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function throttled<S, A extends unknown[]>(\r\n fn: (state: S, ...args: A) => void | Promise<void>,\r\n ms: number = 300\r\n) {\r\n let lastCall = 0\r\n let timer: ReturnType<typeof setTimeout> | null = null\r\n\r\n return async (state: S, ...args: A): Promise<void> => {\r\n const now = Date.now()\r\n const remaining = ms - (now - lastCall)\r\n\r\n if (remaining <= 0) {\r\n // Assez de temps passé — on exécute immédiatement\r\n lastCall = now\r\n if (timer) {\r\n clearTimeout(timer)\r\n timer = null\r\n }\r\n await fn(state, ...args)\r\n } else {\r\n // Trop tôt — on planifie pour la fin du délai\r\n if (timer) clearTimeout(timer)\r\n return new Promise((resolve, reject) => {\r\n timer = setTimeout(async () => {\r\n lastCall = Date.now()\r\n timer = null\r\n try {\r\n await fn(state, ...args)\r\n resolve()\r\n } catch (error) {\r\n reject(error)\r\n }\r\n }, remaining)\r\n })\r\n }\r\n }\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — retryable()\r\n// Réessaie automatiquement en cas d'échec\r\n// Remplace retryWhen de RxJS — sans RxJS\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport interface RetryOptions {\r\n attempts: number // nombre de tentatives\r\n backoff: 'fixed' | 'exponential' // stratégie de délai\r\n delay?: number // délai de base en ms (défaut 1000)\r\n onRetry?: (attempt: number, error: Error) => void // callback optionnel\r\n}\r\n\r\nexport function retryable<S, A extends unknown[]>(\r\n fn: (state: S, ...args: A) => Promise<void>,\r\n options: RetryOptions = {\r\n attempts: 3,\r\n backoff: 'exponential',\r\n delay: 1000\r\n }\r\n) {\r\n return async (state: S, ...args: A): Promise<void> => {\r\n const { attempts, backoff, delay = 1000, onRetry } = options\r\n\r\n for (let i = 0; i < attempts; i++) {\r\n try {\r\n await fn(state, ...args)\r\n return // succès — on sort immédiatement\r\n\r\n } catch (error) {\r\n const isLastAttempt = i === attempts - 1\r\n\r\n // Dernière tentative — on remonte l'erreur\r\n if (isLastAttempt) throw error\r\n\r\n // Calculer le délai avant la prochaine tentative\r\n const waitMs = backoff === 'exponential'\r\n ? delay * Math.pow(2, i) // 1s, 2s, 4s, 8s...\r\n : delay // fixe : toujours 1s\r\n\r\n // Callback optionnel — pour logger ou afficher un message\r\n onRetry?.(i + 1, error as Error)\r\n\r\n // Attendre avant de réessayer\r\n await new Promise(resolve => setTimeout(resolve, waitMs))\r\n }\r\n }\r\n }\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — fromStream()\r\n// Pont entre un flux Observable/callback et le state\r\n// Pour : Firebase, Supabase, WebSocket, SSE\r\n// RxJS optionnel — pas obligatoire\r\n// ─────────────────────────────────────────────────────\r\n\r\n// Interface minimale d'un Observable\r\n// Compatible RxJS sans l'importer\r\nexport interface StatoObservable<T> {\r\n subscribe(observer: {\r\n next?: (value: T) => void\r\n error?: (error: unknown) => void\r\n complete?: () => void\r\n }): { unsubscribe(): void }\r\n}\r\n\r\nexport interface StreamOptions {\r\n // Appelé quand le stream se termine normalement\r\n onComplete?: () => void\r\n // Appelé quand le stream rencontre une erreur\r\n onError?: (error: unknown) => void\r\n}\r\n\r\nexport function fromStream<S, T>(\r\n // setupFn — retourne l'Observable ou le flux\r\n setupFn: (state: S) => StatoObservable<T>,\r\n // updateFn — appelé à chaque valeur émise\r\n updateFn: (state: S, value: T) => void,\r\n options?: StreamOptions\r\n) {\r\n return (state: S): (() => void) => {\r\n // Démarrer le flux\r\n const stream$ = setupFn(state)\r\n const subscription = stream$.subscribe({\r\n\r\n next: (value: T) => {\r\n // Mettre à jour le state à chaque émission\r\n updateFn(state, value)\r\n },\r\n\r\n error: (error: unknown) => {\r\n options?.onError?.(error)\r\n },\r\n\r\n complete: () => {\r\n options?.onComplete?.()\r\n }\r\n })\r\n\r\n // Retourner la fonction de cleanup\r\n // appelée automatiquement à la destruction du store\r\n return () => subscription.unsubscribe()\r\n }\r\n}","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — optimistic()\r\n// Mise à jour optimiste avec rollback automatique\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function optimistic<S, A extends unknown[]>(\r\n // Action immédiate — modifie le state sans attendre\r\n immediate: (state: S, ...args: A) => void,\r\n // Confirmation API — si elle échoue → rollback\r\n confirm: (state: S, ...args: A) => Promise<void>\r\n) {\r\n return async (state: S, ...args: A): Promise<void> => {\r\n // 1. Snapshot du state AVANT la modification\r\n const snapshot = { ...(state as object) } as S\r\n\r\n // 2. Appliquer la modification immédiatement\r\n immediate(state, ...args)\r\n\r\n try {\r\n // 3. Confirmer avec l'API\r\n await confirm(state, ...args)\r\n // Succès — le state optimiste est correct, rien à faire\r\n\r\n } catch (error) {\r\n // 4. Échec — restaurer le state d'avant\r\n Object.assign(state as object, snapshot)\r\n throw error\r\n }\r\n }\r\n}","// ─────────────────────────────────────────────────────\n// @ngstato/core — exclusive()\n// Équivalent “exhaustMap” : ignore les nouveaux appels\n// pendant qu'une exécution est en cours.\n// ─────────────────────────────────────────────────────\n\nexport function exclusive<S, A extends unknown[]>(\n fn: (state: S, ...args: A) => Promise<void>\n) {\n let running = false\n let current: Promise<void> | null = null\n\n return (state: S, ...args: A): Promise<void> => {\n // Si déjà en cours : on renvoie la Promise courante.\n // Ainsi l'appelant peut await, mais aucun nouvel effet ne démarre.\n if (running && current) return current\n\n running = true\n\n current = (async () => {\n try {\n await fn(state, ...args)\n } finally {\n running = false\n current = null\n }\n })()\n\n return current\n }\n}\n\n","// ─────────────────────────────────────────────────────\n// @ngstato/core — queued()\n// Équivalent “concatMap” : exécute les appels\n// les uns après les autres, dans l'ordre d'arrivée.\n// ─────────────────────────────────────────────────────\n\nexport function queued<S, A extends unknown[]>(\n fn: (state: S, ...args: A) => Promise<void>\n) {\n type QueueItem = {\n state: S\n args: A\n resolve: () => void\n reject: (err: unknown) => void\n }\n\n const queue: QueueItem[] = []\n let processing = false\n\n const processNext = () => {\n if (processing) return\n processing = true\n\n const run = async () => {\n while (queue.length) {\n const item = queue.shift()\n if (!item) break\n\n try {\n await fn(item.state, ...item.args)\n item.resolve()\n } catch (err) {\n item.reject(err)\n // Pour coller à la logique “concatMap” : on stoppe et on rejette\n // les items restants (leur execution n'a pas de sens sans reprise).\n while (queue.length) {\n const rest = queue.shift()\n rest?.reject(err)\n }\n return\n }\n }\n }\n\n void run().finally(() => {\n processing = false\n })\n }\n\n return (state: S, ...args: A): Promise<void> => {\n return new Promise<void>((resolve, reject) => {\n queue.push({ state, args, resolve, reject })\n processNext()\n })\n }\n}\n\n","// ─────────────────────────────────────────────────────\n// @ngstato/core — distinctUntilChanged()\n// Ignore les appels si la “clé” n’a pas changé.\n// ─────────────────────────────────────────────────────\n\nexport type Comparator<T> = (prev: T, next: T) => boolean\n\nexport function distinctUntilChanged<S, A extends unknown[], K>(\n fn: (state: S, ...args: A) => void | Promise<void>,\n keySelector: (...args: A) => K,\n comparator: Comparator<K> = Object.is\n) {\n let initialized = false\n let prevKey: K\n\n return async (state: S, ...args: A): Promise<void> => {\n const nextKey = keySelector(...args)\n\n if (initialized && comparator(prevKey, nextKey)) {\n return\n }\n\n initialized = true\n prevKey = nextKey\n await fn(state, ...args)\n }\n}\n\n","// ─────────────────────────────────────────────────────\n// @ngstato/core — forkJoin()\n// Exécute plusieurs tâches en parallèle, attend tout (Promise.all)\n// ─────────────────────────────────────────────────────\n\nexport type TaskContext = { signal: AbortSignal }\nexport type Task<T> = (ctx: TaskContext) => Promise<T> | T\n\nexport type ForkJoinOptions = {\n signal?: AbortSignal\n}\n\nexport async function forkJoin<T extends Record<string, Task<any>>>(\n tasks: T,\n options?: ForkJoinOptions\n): Promise<{ [K in keyof T]: Awaited<ReturnType<T[K]>> }> {\n const controller = new AbortController()\n const signal = options?.signal\n\n if (signal) {\n if (signal.aborted) controller.abort()\n else signal.addEventListener('abort', () => controller.abort(), { once: true })\n }\n\n const entries = Object.entries(tasks) as Array<[keyof T, T[keyof T]]>\n const results = await Promise.all(entries.map(async ([key, task]) => {\n const value = await task({ signal: controller.signal })\n return [key, value] as const\n }))\n\n return Object.fromEntries(results) as { [K in keyof T]: Awaited<ReturnType<T[K]>> }\n}\n\n","// ─────────────────────────────────────────────────────\n// @ngstato/core — race()\n// Retourne le résultat de la première tâche qui se termine.\n// Les autres peuvent être annulées si elles respectent AbortSignal.\n// ─────────────────────────────────────────────────────\n\nexport type TaskContext = { signal: AbortSignal }\nexport type Task<T> = (ctx: TaskContext) => Promise<T> | T\n\nexport type RaceOptions = {\n signal?: AbortSignal\n}\n\nexport async function race<T>(\n tasks: Array<Task<T>>,\n options?: RaceOptions\n): Promise<T> {\n const controller = new AbortController()\n const outer = options?.signal\n\n if (outer) {\n if (outer.aborted) controller.abort()\n else outer.addEventListener('abort', () => controller.abort(), { once: true })\n }\n\n const wrapped = tasks.map((task) => (async () => task({ signal: controller.signal }))())\n\n try {\n return await Promise.race(wrapped)\n } finally {\n // best-effort cancellation\n controller.abort()\n }\n}\n\n","// ─────────────────────────────────────────────────────\n// @ngstato/core — combineLatest()\n// Compose plusieurs deps pour `effects`\n// (équivalent combineLatest côté RxJS, mais sans streams)\n// ─────────────────────────────────────────────────────\n\nexport type DepFn<S, T> = (state: S) => T\n\nexport function combineLatest<S>() {\n return <T extends unknown[]>(\n ...deps: { [K in keyof T]: DepFn<S, T[K]> }\n ) => {\n return (state: S): T => deps.map((fn) => fn(state)) as unknown as T\n }\n}\n\n","// ─────────────────────────────────────────────────────\n// @ngstato/core — combineLatestStream()\n// Combine plusieurs flux externes (RxJS compatible via subscribe)\n// sans dépendre de RxJS.\n// ─────────────────────────────────────────────────────\n\nimport type { StatoObservable } from './from-stream'\n\ntype Observer<T> = {\n next?: (value: T) => void\n error?: (error: unknown) => void\n complete?: () => void\n}\n\ntype Subscription = { unsubscribe(): void }\n\nexport function combineLatestStream<T extends unknown[]>(\n ...sources: { [K in keyof T]: StatoObservable<T[K]> }\n): StatoObservable<T> {\n return {\n subscribe(observer: Observer<T>): Subscription {\n const n = sources.length\n if (!n) {\n observer.complete?.()\n return { unsubscribe() {} }\n }\n\n const hasValue = new Array<boolean>(n).fill(false)\n const values = new Array<unknown>(n)\n let completed = 0\n let closed = false\n\n const subs: Subscription[] = []\n\n const tryEmit = () => {\n if (closed) return\n if (hasValue.every(Boolean)) {\n observer.next?.(values.slice() as unknown as T)\n }\n }\n\n const closeAll = () => {\n if (closed) return\n closed = true\n for (const s of subs) {\n try { s.unsubscribe() } catch { /* ignore */ }\n }\n }\n\n sources.forEach((src, index) => {\n const sub = src.subscribe({\n next: (v) => {\n if (closed) return\n values[index] = v\n hasValue[index] = true\n tryEmit()\n },\n error: (err) => {\n if (closed) return\n observer.error?.(err)\n closeAll()\n },\n complete: () => {\n if (closed) return\n completed++\n if (completed >= n) {\n observer.complete?.()\n closeAll()\n }\n }\n })\n subs.push(sub)\n })\n\n return {\n unsubscribe() {\n closeAll()\n }\n }\n }\n }\n}\n\n","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — createEntityAdapter()\r\n// CRUD collections normalisees (style NgRx Entity, plus simple)\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport type EntityId = string | number\r\n\r\nexport interface EntityState<T> {\r\n ids: EntityId[]\r\n entities: Record<string, T>\r\n}\r\n\r\nexport type Update<T> = {\r\n id: EntityId\r\n changes: Partial<T>\r\n}\r\n\r\ntype SelectId<T> = (entity: T) => EntityId\r\n\r\nexport interface EntityAdapterOptions<T> {\r\n selectId?: SelectId<T>\r\n sortComparer?: (a: T, b: T) => number\r\n}\r\n\r\nfunction defaultSelectId<T extends { id: EntityId }>(entity: T): EntityId {\r\n return entity.id\r\n}\r\n\r\nfunction idKey(id: EntityId): string {\r\n return String(id)\r\n}\r\n\r\nfunction ensureSort<T>(\r\n state: EntityState<T>,\r\n sortComparer: ((a: T, b: T) => number) | undefined\r\n) {\r\n if (!sortComparer) return\r\n state.ids.sort((a, b) => {\r\n const ea = state.entities[idKey(a)]\r\n const eb = state.entities[idKey(b)]\r\n if (!ea || !eb) return 0\r\n return sortComparer(ea, eb)\r\n })\r\n}\r\n\r\nexport function createEntityAdapter<T extends Record<string, any>>(\r\n options: EntityAdapterOptions<T> = {}\r\n) {\r\n const selectId = (options.selectId ??\r\n defaultSelectId) as SelectId<T>\r\n const sortComparer = options.sortComparer\r\n\r\n const getInitialState = <E extends object = {}>(extra?: E): EntityState<T> & E => {\r\n return {\r\n ids: [],\r\n entities: {},\r\n ...(extra ?? ({} as E))\r\n }\r\n }\r\n\r\n const addOne = (entity: T, state: EntityState<T>): void => {\r\n const id = selectId(entity)\r\n const key = idKey(id)\r\n if (state.entities[key]) return\r\n state.ids.push(id)\r\n state.entities[key] = entity\r\n ensureSort(state, sortComparer)\r\n }\r\n\r\n const addMany = (entities: T[], state: EntityState<T>): void => {\r\n for (const entity of entities) addOne(entity, state)\r\n }\r\n\r\n const setAll = (entities: T[], state: EntityState<T>): void => {\r\n state.ids = []\r\n state.entities = {}\r\n for (const entity of entities) {\r\n const id = selectId(entity)\r\n state.ids.push(id)\r\n state.entities[idKey(id)] = entity\r\n }\r\n ensureSort(state, sortComparer)\r\n }\r\n\r\n const upsertOne = (entity: T, state: EntityState<T>): void => {\r\n const id = selectId(entity)\r\n const key = idKey(id)\r\n const exists = !!state.entities[key]\r\n state.entities[key] = entity\r\n if (!exists) state.ids.push(id)\r\n ensureSort(state, sortComparer)\r\n }\r\n\r\n const upsertMany = (entities: T[], state: EntityState<T>): void => {\r\n for (const entity of entities) upsertOne(entity, state)\r\n }\r\n\r\n const updateOne = (update: Update<T>, state: EntityState<T>): void => {\r\n const key = idKey(update.id)\r\n const current = state.entities[key]\r\n if (!current) return\r\n state.entities[key] = { ...current, ...update.changes }\r\n ensureSort(state, sortComparer)\r\n }\r\n\r\n const removeOne = (id: EntityId, state: EntityState<T>): void => {\r\n const key = idKey(id)\r\n if (!state.entities[key]) return\r\n delete state.entities[key]\r\n state.ids = state.ids.filter((x) => !Object.is(x, id))\r\n }\r\n\r\n const removeMany = (ids: EntityId[], state: EntityState<T>): void => {\r\n const removeSet = new Set(ids.map(idKey))\r\n for (const key of Object.keys(state.entities)) {\r\n if (removeSet.has(key)) delete state.entities[key]\r\n }\r\n state.ids = state.ids.filter((id) => !removeSet.has(idKey(id)))\r\n }\r\n\r\n const removeAll = (state: EntityState<T>): void => {\r\n state.ids = []\r\n state.entities = {}\r\n }\r\n\r\n const getSelectors = <S = EntityState<T>>(\r\n selectState?: (state: S) => EntityState<T>\r\n ) => {\r\n const pick = (state: S | EntityState<T>) =>\r\n (selectState ? selectState(state as S) : (state as EntityState<T>))\r\n\r\n return {\r\n selectIds: (state: S | EntityState<T>) => pick(state).ids,\r\n selectEntities: (state: S | EntityState<T>) => pick(state).entities,\r\n selectAll: (state: S | EntityState<T>) => {\r\n const s = pick(state)\r\n return s.ids.map((id) => s.entities[idKey(id)]).filter(Boolean)\r\n },\r\n selectTotal: (state: S | EntityState<T>) => pick(state).ids.length,\r\n selectById: (state: S | EntityState<T>, id: EntityId) => pick(state).entities[idKey(id)]\r\n }\r\n }\r\n\r\n return {\r\n selectId,\r\n sortComparer,\r\n getInitialState,\r\n addOne,\r\n addMany,\r\n setAll,\r\n upsertOne,\r\n upsertMany,\r\n updateOne,\r\n removeOne,\r\n removeMany,\r\n removeAll,\r\n getSelectors\r\n }\r\n}\r\n\r\n","import type { StatoStoreConfig, ActionsMap } from '../types'\nimport type {\n EntityId,\n EntityState,\n Update\n} from './entity-adapter'\n\ntype EntityAdapter<T> = {\n getInitialState: <E extends object = {}>(extra?: E) => EntityState<T> & E\n addOne: (entity: T, state: EntityState<T>) => void\n addMany: (entities: T[], state: EntityState<T>) => void\n setAll: (entities: T[], state: EntityState<T>) => void\n upsertOne: (entity: T, state: EntityState<T>) => void\n upsertMany: (entities: T[], state: EntityState<T>) => void\n updateOne: (update: Update<T>, state: EntityState<T>) => void\n removeOne: (id: EntityId, state: EntityState<T>) => void\n removeMany: (ids: EntityId[], state: EntityState<T>) => void\n removeAll: (state: EntityState<T>) => void\n getSelectors: <S = EntityState<T>>(\n selectState?: (state: S) => EntityState<T>\n ) => {\n selectIds: (state: S | EntityState<T>) => EntityId[]\n selectEntities: (state: S | EntityState<T>) => Record<string, T>\n selectAll: (state: S | EntityState<T>) => T[]\n selectTotal: (state: S | EntityState<T>) => number\n selectById: (state: S | EntityState<T>, id: EntityId) => T | undefined\n }\n}\n\nexport type WithEntitiesSelectorsNames = Partial<{\n ids: string\n entities: string\n all: string\n total: string\n byId: string\n}>\n\nexport type WithEntitiesActionsNames = Partial<{\n addOne: string\n addMany: string\n setAll: string\n upsertOne: string\n upsertMany: string\n updateOne: string\n removeOne: string\n removeMany: string\n removeAll: string\n}>\n\nexport type WithEntitiesOptions<T> = {\n key: string\n adapter: EntityAdapter<T>\n initial?: T[]\n selectors?: WithEntitiesSelectorsNames\n actions?: WithEntitiesActionsNames\n}\n\nfunction cloneEntityState<T>(state: EntityState<T>): EntityState<T> {\n return {\n ids: [...state.ids],\n entities: { ...state.entities }\n }\n}\n\nexport function withEntities<S extends object, T>(\n config: S & StatoStoreConfig<S>,\n options: WithEntitiesOptions<T>\n): S & StatoStoreConfig<S> {\n const { key, adapter, initial } = options\n\n const initialSlice = adapter.getInitialState()\n if (initial?.length) {\n adapter.setAll(initial, initialSlice)\n }\n\n const baseSelectors = config.selectors ?? {}\n const baseActions = config.actions ?? {}\n\n const scopedSelectors = adapter.getSelectors<any>((s) => (s as any)[key])\n\n const selectorNames: Required<WithEntitiesSelectorsNames> = {\n ids: options.selectors?.ids ?? `${key}Ids`,\n entities: options.selectors?.entities ?? `${key}Entities`,\n all: options.selectors?.all ?? `${key}All`,\n total: options.selectors?.total ?? `${key}Total`,\n byId: options.selectors?.byId ?? `${key}ById`\n }\n\n const actionNames: Required<WithEntitiesActionsNames> = {\n addOne: options.actions?.addOne ?? `${key}AddOne`,\n addMany: options.actions?.addMany ?? `${key}AddMany`,\n setAll: options.actions?.setAll ?? `${key}SetAll`,\n upsertOne: options.actions?.upsertOne ?? `${key}UpsertOne`,\n upsertMany: options.actions?.upsertMany ?? `${key}UpsertMany`,\n updateOne: options.actions?.updateOne ?? `${key}UpdateOne`,\n removeOne: options.actions?.removeOne ?? `${key}RemoveOne`,\n removeMany: options.actions?.removeMany ?? `${key}RemoveMany`,\n removeAll: options.actions?.removeAll ?? `${key}RemoveAll`\n }\n\n // Note: `selectors` dans le core autorise (fn | unknown[]), donc on garde\n // le type large pour rester compatible DTS/build.\n const nextSelectors: NonNullable<StatoStoreConfig<any>['selectors']> = {\n ...(baseSelectors as any),\n [selectorNames.ids]: (state: any) => scopedSelectors.selectIds(state),\n [selectorNames.entities]: (state: any) => scopedSelectors.selectEntities(state),\n [selectorNames.all]: (state: any) => scopedSelectors.selectAll(state),\n [selectorNames.total]: (state: any) => scopedSelectors.selectTotal(state),\n [selectorNames.byId]: (state: any) => (id: EntityId) => scopedSelectors.selectById(state, id)\n }\n\n const nextActions: ActionsMap<any> = {\n ...baseActions,\n [actionNames.addOne]: (state: any, entity: T) => {\n const prev = (state as any)[key] as EntityState<T>\n const next = cloneEntityState(prev)\n adapter.addOne(entity, next)\n ;(state as any)[key] = next\n },\n [actionNames.addMany]: (state: any, entities: T[]) => {\n const prev = (state as any)[key] as EntityState<T>\n const next = cloneEntityState(prev)\n adapter.addMany(entities, next)\n ;(state as any)[key] = next\n },\n [actionNames.setAll]: (state: any, entities: T[]) => {\n const next = adapter.getInitialState()\n adapter.setAll(entities, next)\n ;(state as any)[key] = next\n },\n [actionNames.upsertOne]: (state: any, entity: T) => {\n const prev = (state as any)[key] as EntityState<T>\n const next = cloneEntityState(prev)\n adapter.upsertOne(entity, next)\n ;(state as any)[key] = next\n },\n [actionNames.upsertMany]: (state: any, entities: T[]) => {\n const prev = (state as any)[key] as EntityState<T>\n const next = cloneEntityState(prev)\n adapter.upsertMany(entities, next)\n ;(state as any)[key] = next\n },\n [actionNames.updateOne]: (state: any, update: Update<T>) => {\n const prev = (state as any)[key] as EntityState<T>\n const next = cloneEntityState(prev)\n adapter.updateOne(update, next)\n ;(state as any)[key] = next\n },\n [actionNames.removeOne]: (state: any, id: EntityId) => {\n const prev = (state as any)[key] as EntityState<T>\n const next = cloneEntityState(prev)\n adapter.removeOne(id, next)\n ;(state as any)[key] = next\n },\n [actionNames.removeMany]: (state: any, ids: EntityId[]) => {\n const prev = (state as any)[key] as EntityState<T>\n const next = cloneEntityState(prev)\n adapter.removeMany(ids, next)\n ;(state as any)[key] = next\n },\n [actionNames.removeAll]: (state: any) => {\n ;(state as any)[key] = adapter.getInitialState()\n }\n }\n\n return {\n ...(config as any),\n [key]: (config as any)[key] ?? initialSlice,\n actions: nextActions,\n selectors: nextSelectors\n }\n}\n\n","// ─────────────────────────────────────────────────────\n// @ngstato/core — stream operators (RxJS-like, sans RxJS)\n// ─────────────────────────────────────────────────────\n\nimport type { StatoObservable } from './from-stream'\n\ntype Observer<T> = {\n next?: (value: T) => void\n error?: (error: unknown) => void\n complete?: () => void\n}\n\ntype Subscription = { unsubscribe(): void }\n\ntype MaybeObservable<T> = StatoObservable<T> | Promise<T> | T\n\nexport type StreamOperator<I, O> = (source: StatoObservable<I>) => StatoObservable<O>\n\nexport function pipeStream<T>(\n source: StatoObservable<T>\n): StatoObservable<T>\nexport function pipeStream<T, A>(\n source: StatoObservable<T>,\n op1: StreamOperator<T, A>\n): StatoObservable<A>\nexport function pipeStream<T, A, B>(\n source: StatoObservable<T>,\n op1: StreamOperator<T, A>,\n op2: StreamOperator<A, B>\n): StatoObservable<B>\nexport function pipeStream<T, A, B, C>(\n source: StatoObservable<T>,\n op1: StreamOperator<T, A>,\n op2: StreamOperator<A, B>,\n op3: StreamOperator<B, C>\n): StatoObservable<C>\nexport function pipeStream(\n source: StatoObservable<unknown>,\n ...ops: Array<StreamOperator<any, any>>\n) {\n return ops.reduce((acc, op) => op(acc), source)\n}\n\nfunction isObservable<T>(value: MaybeObservable<T>): value is StatoObservable<T> {\n return !!value && typeof value === 'object' && typeof (value as any).subscribe === 'function'\n}\n\nfunction toObservable<T>(value: MaybeObservable<T>): StatoObservable<T> {\n if (isObservable(value)) return value\n\n return {\n subscribe(observer: Observer<T>) {\n let closed = false\n Promise.resolve(value)\n .then((resolved) => {\n if (closed) return\n observer.next?.(resolved)\n observer.complete?.()\n })\n .catch((error) => {\n if (closed) return\n observer.error?.(error)\n })\n\n return { unsubscribe: () => { closed = true } }\n }\n }\n}\n\nexport function mapStream<I, O>(\n mapFn: (value: I) => O\n): StreamOperator<I, O> {\n return (source) => ({\n subscribe(observer) {\n return source.subscribe({\n next: (value) => observer.next?.(mapFn(value)),\n error: (error) => observer.error?.(error),\n complete: () => observer.complete?.()\n })\n }\n })\n}\n\nexport function filterStream<T>(\n predicate: (value: T) => boolean\n): StreamOperator<T, T> {\n return (source) => ({\n subscribe(observer) {\n return source.subscribe({\n next: (value) => {\n if (predicate(value)) observer.next?.(value)\n },\n error: (error) => observer.error?.(error),\n complete: () => observer.complete?.()\n })\n }\n })\n}\n\ntype Mapper<I, O> = (value: I, ctx: { signal: AbortSignal }) => MaybeObservable<O>\n\nfunction closeSubs(subs: Subscription[]) {\n for (const sub of subs) {\n try { sub.unsubscribe() } catch { /* ignore */ }\n }\n}\n\nexport function switchMapStream<I, O>(\n mapper: Mapper<I, O>\n): StreamOperator<I, O> {\n return (source) => ({\n subscribe(observer) {\n let closed = false\n let sourceDone = false\n let innerSub: Subscription | null = null\n let innerActive = false\n let controller: AbortController | null = null\n\n const maybeComplete = () => {\n if (!closed && sourceDone && !innerActive) {\n closed = true\n observer.complete?.()\n }\n }\n\n const sourceSub = source.subscribe({\n next: (value) => {\n if (closed) return\n\n controller?.abort()\n innerSub?.unsubscribe()\n controller = new AbortController()\n innerActive = true\n\n innerSub = toObservable(mapper(value, { signal: controller.signal })).subscribe({\n next: (v) => {\n if (!closed) observer.next?.(v)\n },\n error: (error) => {\n if (closed) return\n closed = true\n observer.error?.(error)\n sourceSub.unsubscribe()\n innerSub?.unsubscribe()\n },\n complete: () => {\n innerActive = false\n maybeComplete()\n }\n })\n },\n error: (error) => {\n if (closed) return\n closed = true\n observer.error?.(error)\n controller?.abort()\n innerSub?.unsubscribe()\n },\n complete: () => {\n sourceDone = true\n maybeComplete()\n }\n })\n\n return {\n unsubscribe() {\n if (closed) return\n closed = true\n controller?.abort()\n sourceSub.unsubscribe()\n innerSub?.unsubscribe()\n }\n }\n }\n })\n}\n\nexport function concatMapStream<I, O>(\n mapper: Mapper<I, O>\n): StreamOperator<I, O> {\n return (source) => ({\n subscribe(observer) {\n let closed = false\n let sourceDone = false\n const queue: I[] = []\n let running = false\n let currentSub: Subscription | null = null\n let currentController: AbortController | null = null\n\n const maybeComplete = () => {\n if (!closed && sourceDone && !running && queue.length === 0) {\n closed = true\n observer.complete?.()\n }\n }\n\n const runNext = () => {\n if (closed || running || queue.length === 0) {\n maybeComplete()\n return\n }\n running = true\n const value = queue.shift() as I\n currentController = new AbortController()\n currentSub = toObservable(mapper(value, { signal: currentController.signal })).subscribe({\n next: (v) => {\n if (!closed) observer.next?.(v)\n },\n error: (error) => {\n if (closed) return\n closed = true\n observer.error?.(error)\n sourceSub.unsubscribe()\n currentController?.abort()\n currentSub?.unsubscribe()\n queue.length = 0\n },\n complete: () => {\n running = false\n runNext()\n }\n })\n }\n\n const sourceSub = source.subscribe({\n next: (value) => {\n if (closed) return\n queue.push(value)\n runNext()\n },\n error: (error) => {\n if (closed) return\n closed = true\n observer.error?.(error)\n currentController?.abort()\n currentSub?.unsubscribe()\n queue.length = 0\n },\n complete: () => {\n sourceDone = true\n maybeComplete()\n }\n })\n\n return {\n unsubscribe() {\n if (closed) return\n closed = true\n sourceSub.unsubscribe()\n currentController?.abort()\n currentSub?.unsubscribe()\n queue.length = 0\n }\n }\n }\n })\n}\n\nexport function exhaustMapStream<I, O>(\n mapper: Mapper<I, O>\n): StreamOperator<I, O> {\n return (source) => ({\n subscribe(observer) {\n let closed = false\n let sourceDone = false\n let running = false\n let currentSub: Subscription | null = null\n let controller: AbortController | null = null\n\n const maybeComplete = () => {\n if (!closed && sourceDone && !running) {\n closed = true\n observer.complete?.()\n }\n }\n\n const sourceSub = source.subscribe({\n next: (value) => {\n if (closed || running) return\n running = true\n controller = new AbortController()\n currentSub = toObservable(mapper(value, { signal: controller.signal })).subscribe({\n next: (v) => {\n if (!closed) observer.next?.(v)\n },\n error: (error) => {\n if (closed) return\n closed = true\n observer.error?.(error)\n sourceSub.unsubscribe()\n controller?.abort()\n currentSub?.unsubscribe()\n },\n complete: () => {\n running = false\n maybeComplete()\n }\n })\n },\n error: (error) => {\n if (closed) return\n closed = true\n observer.error?.(error)\n controller?.abort()\n currentSub?.unsubscribe()\n },\n complete: () => {\n sourceDone = true\n maybeComplete()\n }\n })\n\n return {\n unsubscribe() {\n if (closed) return\n closed = true\n sourceSub.unsubscribe()\n controller?.abort()\n currentSub?.unsubscribe()\n }\n }\n }\n })\n}\n\nexport function mergeMapStream<I, O>(\n mapper: Mapper<I, O>,\n options?: { concurrency?: number }\n): StreamOperator<I, O> {\n const concurrency = Math.max(1, options?.concurrency ?? Number.POSITIVE_INFINITY)\n\n return (source) => ({\n subscribe(observer) {\n let closed = false\n let sourceDone = false\n const queue: I[] = []\n const active = new Set<Subscription>()\n const controllers = new Set<AbortController>()\n\n const maybeComplete = () => {\n if (!closed && sourceDone && active.size === 0 && queue.length === 0) {\n closed = true\n observer.complete?.()\n }\n }\n\n const spawn = (value: I) => {\n const controller = new AbortController()\n controllers.add(controller)\n const sub = toObservable(mapper(value, { signal: controller.signal })).subscribe({\n next: (v) => {\n if (!closed) observer.next?.(v)\n },\n error: (error) => {\n if (closed) return\n closed = true\n observer.error?.(error)\n sourceSub.unsubscribe()\n closeSubs(Array.from(active))\n active.clear()\n for (const c of controllers) c.abort()\n controllers.clear()\n queue.length = 0\n },\n complete: () => {\n active.delete(sub)\n controllers.delete(controller)\n drain()\n maybeComplete()\n }\n })\n active.add(sub)\n }\n\n const drain = () => {\n while (!closed && active.size < concurrency && queue.length > 0) {\n spawn(queue.shift() as I)\n }\n }\n\n const sourceSub = source.subscribe({\n next: (value) => {\n if (closed) return\n queue.push(value)\n drain()\n },\n error: (error) => {\n if (closed) return\n closed = true\n observer.error?.(error)\n closeSubs(Array.from(active))\n active.clear()\n for (const c of controllers) c.abort()\n controllers.clear()\n queue.length = 0\n },\n complete: () => {\n sourceDone = true\n maybeComplete()\n }\n })\n\n return {\n unsubscribe() {\n if (closed) return\n closed = true\n sourceSub.unsubscribe()\n closeSubs(Array.from(active))\n active.clear()\n for (const c of controllers) c.abort()\n controllers.clear()\n queue.length = 0\n }\n }\n }\n })\n}\n\nexport function distinctUntilChangedStream<T, K = T>(\n keySelector?: (value: T) => K,\n comparator: (prev: K, next: K) => boolean = Object.is\n): StreamOperator<T, T> {\n return (source) => ({\n subscribe(observer) {\n let initialized = false\n let prevKey: K\n return source.subscribe({\n next: (value) => {\n const nextKey = keySelector ? keySelector(value) : (value as unknown as K)\n if (initialized && comparator(prevKey, nextKey)) return\n initialized = true\n prevKey = nextKey\n observer.next?.(value)\n },\n error: (error) => observer.error?.(error),\n complete: () => observer.complete?.()\n })\n }\n })\n}\n\nexport function debounceStream<T>(ms: number): StreamOperator<T, T> {\n return (source) => ({\n subscribe(observer) {\n let timer: ReturnType<typeof setTimeout> | null = null\n let sourceDone = false\n let lastValue: T | undefined\n let hasValue = false\n let closed = false\n\n const flush = () => {\n if (!hasValue || closed) return\n observer.next?.(lastValue as T)\n hasValue = false\n lastValue = undefined\n }\n\n const maybeComplete = () => {\n if (sourceDone && !timer && !closed) {\n closed = true\n observer.complete?.()\n }\n }\n\n const sub = source.subscribe({\n next: (value) => {\n if (closed) return\n lastValue = value\n hasValue = true\n if (timer) clearTimeout(timer)\n timer = setTimeout(() => {\n timer = null\n flush()\n maybeComplete()\n }, ms)\n },\n error: (error) => {\n if (closed) return\n closed = true\n if (timer) clearTimeout(timer)\n observer.error?.(error)\n },\n complete: () => {\n sourceDone = true\n if (!timer) {\n maybeComplete()\n }\n }\n })\n\n return {\n unsubscribe() {\n if (closed) return\n closed = true\n if (timer) clearTimeout(timer)\n sub.unsubscribe()\n }\n }\n }\n })\n}\n\nexport function throttleStream<T>(ms: number): StreamOperator<T, T> {\n return (source) => ({\n subscribe(observer) {\n let throttled = false\n let timer: ReturnType<typeof setTimeout> | null = null\n let closed = false\n const sub = source.subscribe({\n next: (value) => {\n if (closed || throttled) return\n observer.next?.(value)\n throttled = true\n timer = setTimeout(() => {\n throttled = false\n timer = null\n }, ms)\n },\n error: (error) => {\n if (closed) return\n closed = true\n if (timer) clearTimeout(timer)\n observer.error?.(error)\n },\n complete: () => {\n if (closed) return\n closed = true\n if (timer) clearTimeout(timer)\n observer.complete?.()\n }\n })\n\n return {\n unsubscribe() {\n if (closed) return\n closed = true\n if (timer) clearTimeout(timer)\n sub.unsubscribe()\n }\n }\n }\n })\n}\n\nexport function catchErrorStream<T>(\n handler: (error: unknown) => MaybeObservable<T>\n): StreamOperator<T, T> {\n return (source) => ({\n subscribe(observer) {\n let closed = false\n let fallbackSub: Subscription | null = null\n const sourceSub = source.subscribe({\n next: (value) => {\n if (!closed) observer.next?.(value)\n },\n error: (error) => {\n if (closed) return\n fallbackSub = toObservable(handler(error)).subscribe({\n next: (value) => {\n if (!closed) observer.next?.(value)\n },\n error: (innerErr) => {\n if (closed) return\n closed = true\n observer.error?.(innerErr)\n },\n complete: () => {\n if (closed) return\n closed = true\n observer.complete?.()\n }\n })\n },\n complete: () => {\n if (closed) return\n closed = true\n observer.complete?.()\n }\n })\n\n return {\n unsubscribe() {\n if (closed) return\n closed = true\n sourceSub.unsubscribe()\n fallbackSub?.unsubscribe()\n }\n }\n }\n })\n}\n\nexport function retryStream<T>(\n options: {\n attempts?: number\n delay?: number\n backoff?: 'fixed' | 'exponential'\n } = {}\n): StreamOperator<T, T> {\n const attempts = Math.max(1, options.attempts ?? 3)\n const delay = Math.max(0, options.delay ?? 0)\n const backoff = options.backoff ?? 'fixed'\n\n return (source) => ({\n subscribe(observer) {\n let closed = false\n let attempt = 0\n let activeSub: Subscription | null = null\n let retryTimer: ReturnType<typeof setTimeout> | null = null\n\n const subscribeOnce = () => {\n if (closed) return\n attempt++\n activeSub = source.subscribe({\n next: (value) => {\n if (!closed) observer.next?.(value)\n },\n complete: () => {\n if (closed) return\n closed = true\n observer.complete?.()\n },\n error: (error) => {\n if (closed) return\n if (attempt >= attempts) {\n closed = true\n observer.error?.(error)\n return\n }\n const wait = backoff === 'exponential'\n ? delay * Math.pow(2, attempt - 1)\n : delay\n retryTimer = setTimeout(() => {\n retryTimer = null\n subscribeOnce()\n }, wait)\n }\n })\n }\n\n subscribeOnce()\n\n return {\n unsubscribe() {\n if (closed) return\n closed = true\n if (retryTimer) clearTimeout(retryTimer)\n activeSub?.unsubscribe()\n }\n }\n }\n })\n}\n\n","import type { StateSlice, StatoStoreConfig, StatoHooks } from '../types'\n\nexport interface PersistStorage {\n getItem(key: string): string | null\n setItem(key: string, value: string): void\n removeItem(key: string): void\n}\n\nexport interface PersistEnvelope<T> {\n v: number\n data: Partial<T>\n}\n\nexport interface PersistOptions<S extends object> {\n key: string\n version?: number\n storage?: PersistStorage\n pick?: (keyof S)[]\n migrate?: (data: unknown, fromVersion: number) => Partial<S>\n onError?: (error: Error) => void\n}\n\nfunction resolveStorage(custom?: PersistStorage): PersistStorage | null {\n if (custom) return custom\n if (typeof window === 'undefined') return null\n try {\n return window.localStorage\n } catch {\n return null\n }\n}\n\nfunction pickState<S extends object>(state: Partial<S>, keys?: (keyof S)[]) {\n if (!keys?.length) return state\n const picked: Partial<S> = {}\n for (const key of keys) {\n picked[key] = state[key]\n }\n return picked\n}\n\nexport function withPersist<S extends object>(\n config: S & StatoStoreConfig<S>,\n options: PersistOptions<StateSlice<S>>\n): S & StatoStoreConfig<S> {\n const {\n key,\n version = 1,\n storage: customStorage,\n pick,\n migrate,\n onError\n } = options\n\n const storage = resolveStorage(customStorage)\n const userHooks = config.hooks ?? {}\n\n const mergedHooks: StatoHooks<any> = {\n ...userHooks,\n onInit(store: any) {\n try {\n if (!storage) return userHooks.onInit?.(store)\n const raw = storage.getItem(key)\n if (!raw) return userHooks.onInit?.(store)\n\n const parsed = JSON.parse(raw) as PersistEnvelope<StateSlice<S>>\n const data =\n parsed.v === version\n ? parsed.data\n : migrate\n ? migrate(parsed.data, parsed.v)\n : parsed.data\n\n if (data && typeof data === 'object') {\n store.__store__?.hydrate?.(data)\n }\n } catch (error) {\n onError?.(error as Error)\n }\n return userHooks.onInit?.(store)\n },\n\n onStateChange(prev: any, next: any) {\n try {\n if (storage) {\n const payload: PersistEnvelope<StateSlice<S>> = {\n v: version,\n data: pickState(next, pick as (keyof StateSlice<S>)[] | undefined)\n }\n storage.setItem(key, JSON.stringify(payload))\n }\n } catch (error) {\n onError?.(error as Error)\n }\n userHooks.onStateChange?.(prev, next)\n },\n\n onDestroy(store: any) {\n return userHooks.onDestroy?.(store)\n },\n onAction(name: string, args: unknown[]) {\n return userHooks.onAction?.(name, args)\n },\n onActionDone(name: string, duration: number) {\n return userHooks.onActionDone?.(name, duration)\n },\n onError(error: Error, actionName: string) {\n return userHooks.onError?.(error, actionName)\n }\n }\n\n return {\n ...config,\n hooks: mergedHooks\n }\n}\n\n","// ─────────────────────────────────────────────────────\r\n// @ngstato/core — DevTools\r\n// Logique pure — pas de dépendance Angular\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport interface ActionLog {\r\n id: number\r\n name: string\r\n args: unknown[]\r\n duration: number\r\n status: 'success' | 'error'\r\n error?: string\r\n prevState: unknown\r\n nextState: unknown\r\n at: string\r\n}\r\n\r\nexport interface DevToolsState {\r\n logs: ActionLog[]\r\n isOpen: boolean\r\n maxLogs: number\r\n}\r\n\r\nexport interface DevToolsInstance {\r\n state: DevToolsState\r\n logAction: (log: Omit<ActionLog, 'id' | 'at'>) => void\r\n clear: () => void\r\n open: () => void\r\n close: () => void\r\n toggle: () => void\r\n subscribe: (cb: (state: DevToolsState) => void) => () => void\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// FACTORY\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function createDevTools(maxLogs = 50): DevToolsInstance {\r\n let counter = 0\r\n\r\n const state: DevToolsState = {\r\n logs: [],\r\n isOpen: false,\r\n maxLogs\r\n }\r\n\r\n const listeners = new Set<(state: DevToolsState) => void>()\r\n\r\n function notify() {\r\n listeners.forEach(cb => cb({ ...state, logs: [...state.logs] }))\r\n }\r\n\r\n return {\r\n state,\r\n\r\n logAction(log) {\r\n const entry: ActionLog = {\r\n ...log,\r\n id: ++counter,\r\n at: new Date().toISOString()\r\n }\r\n\r\n state.logs = [entry, ...state.logs].slice(0, maxLogs)\r\n notify()\r\n },\r\n\r\n clear() {\r\n state.logs = []\r\n notify()\r\n },\r\n\r\n open() {\r\n state.isOpen = true\r\n notify()\r\n },\r\n\r\n close() {\r\n state.isOpen = false\r\n notify()\r\n },\r\n\r\n toggle() {\r\n state.isOpen = !state.isOpen\r\n notify()\r\n },\r\n\r\n subscribe(cb) {\r\n listeners.add(cb)\r\n return () => listeners.delete(cb)\r\n }\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// INSTANCE GLOBALE — singleton partagé entre tous les stores\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport const devTools = createDevTools()\r\n\r\n// ─────────────────────────────────────────────────────\r\n// PLUGIN — connecte un store aux DevTools\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport function connectDevTools(store: any, storeName: string) {\r\n if (!devTools) return\r\n\r\n let prevState: any = {}\r\n\r\n // Accès aux hooks via __store__\r\n const internalStore = store.__store__\r\n\r\n if (!internalStore) return\r\n\r\n // Sauvegarder les hooks existants\r\n const existingHooks = { ...internalStore['_hooks'] }\r\n\r\n // Remplacer les hooks\r\n internalStore['_hooks'] = {\r\n ...existingHooks,\r\n\r\n onAction(name: string, args: unknown[]) {\r\n prevState = store.getState()\r\n existingHooks.onAction?.(name, args)\r\n },\r\n\r\n onActionDone(name: string, duration: number) {\r\n const nextState = store.getState()\r\n devTools.logAction({\r\n name: `[${storeName}] ${name}`,\r\n args: [],\r\n duration,\r\n status: 'success',\r\n prevState: { ...prevState },\r\n nextState: { ...nextState }\r\n })\r\n existingHooks.onActionDone?.(name, duration)\r\n },\r\n\r\n onError(error: Error, actionName: string) {\r\n devTools.logAction({\r\n name: `[${storeName}] ${actionName}`,\r\n args: [],\r\n duration: 0,\r\n status: 'error',\r\n error: error.message,\r\n prevState: { ...prevState },\r\n nextState: { ...prevState }\r\n })\r\n existingHooks.onError?.(error, actionName)\r\n },\r\n\r\n onStateChange: existingHooks.onStateChange\r\n }\r\n}"]}