@ngstato/core 0.4.0 → 0.4.2

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/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/helpers/with-feature.ts","../src/helpers/with-props.ts","../src/devtools.ts"],"names":["throttled","internalStore"],"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 _timeTraveling = 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 if (!this._timeTraveling) {\r\n this._runEffects()\r\n }\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\n async 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 — seulement si le state a réellement changé\r\n const nextState = { ...this._state }\r\n const hasChanged = Object.keys(nextState).some(\r\n (k) => !Object.is((prevState as any)[k], (nextState as any)[k])\r\n )\r\n if (hasChanged) {\r\n this._hooks.onStateChange?.(prevState as any, nextState as any)\r\n }\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 // ── Time-travel — restaurer un snapshot sans déclencher les effects ──\r\n hydrateForTimeTravel(fullState: StateSlice<S>) {\r\n this._timeTraveling = true\r\n this._state = { ...fullState }\r\n this._notify()\r\n this._timeTraveling = false\r\n }\r\n\r\n setPublicStore(publicStore: any) {\r\n this._publicStore = publicStore\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>(\r\n config: S & StatoStoreConfig<S>,\r\n __internal?: { skipInit?: boolean }\r\n) {\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 // Si skipInit est demandé (cas Angular), l'adaptateur appellera init() lui-même\r\n if (!__internal?.skipInit) {\r\n store.init(publicStore)\r\n }\r\n\r\n return publicStore\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// store.on() — réactions inter-stores\r\n// Supporte une action unique ou un tableau d'actions\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport type OnEvent = {\r\n name: string\r\n args: unknown[]\r\n status: 'success' | 'error'\r\n duration: number\r\n error?: Error\r\n}\r\n\r\nexport function on<S extends object>(\r\n sourceAction: Function | Function[],\r\n handler: (store: S, event: OnEvent) => void | Promise<void>\r\n): () => void {\r\n const actions = Array.isArray(sourceAction) ? sourceAction : [sourceAction]\r\n\r\n const unsubs = actions.map((action) =>\r\n subscribeToAction(action, (event) => {\r\n try {\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 — les erreurs dans les handlers on() ne doivent pas crasher\r\n }\r\n })\r\n )\r\n\r\n // Retourne une fonction de désabonnement unique pour toutes les actions\r\n return () => unsubs.forEach((unsub) => unsub())\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 // Stocker le dernier appel pour utiliser le state le plus récent\r\n let latestState: S\r\n let latestArgs: A\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 // Sauvegarder le state et args les plus récents\r\n latestState = state\r\n latestArgs = args\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(latestState, ...latestArgs)\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 // Stocker le dernier appel pour utiliser le state le plus récent\r\n let latestState: S\r\n let latestArgs: A\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 // Sauvegarder le state et args les plus récents\r\n latestState = state\r\n latestArgs = args\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(latestState, ...latestArgs)\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(latestState, ...latestArgs)\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 PROFOND du state AVANT la modification\r\n // structuredClone garantit un rollback correct même avec\r\n // des arrays/objets imbriqués (ex: state.users[0].name)\r\n const snapshot = structuredClone(state) 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","// ─────────────────────────────────────────────────────\n// @ngstato/core — mergeFeatures()\n// Composition de features réutilisables entre stores\n//\n// Inspiré de NgRx signalStoreFeature() mais sans boilerplate.\n// Une feature = un fragment de config { state, actions, computed,\n// selectors, effects, hooks } qui peut être partagée entre stores.\n//\n// Usage :\n// function withLoading() {\n// return {\n// state: { loading: false, error: null as string | null },\n// actions: { setLoading: (s, v: boolean) => { s.loading = v } },\n// computed: { hasError: (s) => s.error !== null }\n// }\n// }\n//\n// const store = createStore({\n// users: [] as User[],\n// ...mergeFeatures(withLoading(), withPagination())\n// })\n// ─────────────────────────────────────────────────────\n\nimport type { StatoHooks, EffectEntry } from '../types'\n\n// ─────────────────────────────────────────────────────\n// TYPES\n// ─────────────────────────────────────────────────────\n\nexport interface FeatureConfig {\n state?: Record<string, unknown>\n actions?: Record<string, Function>\n computed?: Record<string, Function>\n selectors?: Record<string, Function>\n effects?: EffectEntry<any>[]\n hooks?: Partial<StatoHooks<any>>\n}\n\nexport type MergedFeature = {\n actions?: Record<string, Function>\n computed?: Record<string, Function>\n selectors?: Record<string, Function>\n effects?: EffectEntry<any>[]\n hooks?: Partial<StatoHooks<any>>\n [key: string]: unknown // state keys spreaded at root level\n}\n\n// ─────────────────────────────────────────────────────\n// HOOK MERGER — fusionne les hooks sans écraser les existants\n// Chaque hook appelle tous les handlers enregistrés par chaque feature\n// ─────────────────────────────────────────────────────\n\nfunction mergeHooks(\n a: Partial<StatoHooks<any>> | undefined,\n b: Partial<StatoHooks<any>> | undefined\n): Partial<StatoHooks<any>> {\n if (!a) return b ?? {}\n if (!b) return a\n\n const hookNames: (keyof StatoHooks<any>)[] = [\n 'onInit', 'onDestroy', 'onAction', 'onActionDone', 'onError', 'onStateChange'\n ]\n\n const merged: Partial<StatoHooks<any>> = { ...a }\n\n for (const name of hookNames) {\n const fnA = a[name] as Function | undefined\n const fnB = b[name] as Function | undefined\n if (fnA && fnB) {\n ;(merged as any)[name] = (...args: unknown[]) => {\n fnA(...args)\n fnB(...args)\n }\n } else if (fnB) {\n ;(merged as any)[name] = fnB\n }\n }\n\n return merged\n}\n\n// ─────────────────────────────────────────────────────\n// mergeFeatures() — fusionne N features en un seul objet config\n//\n// Règles de fusion :\n// - state → spreaded à la racine (comme createStore l'attend)\n// - actions → merge objet (dernière feature l'emporte en cas de conflit)\n// - computed → merge objet\n// - selectors → merge objet\n// - effects → concat array\n// - hooks → merge intelligent (tous les handlers sont appelés)\n// ─────────────────────────────────────────────────────\n\nexport function mergeFeatures(...features: FeatureConfig[]): MergedFeature {\n const result: MergedFeature = {}\n\n for (const feature of features) {\n // State — spreader à la racine\n if (feature.state) {\n Object.assign(result, feature.state)\n }\n\n // Actions — merge objet\n if (feature.actions) {\n result.actions = { ...(result.actions ?? {}), ...feature.actions }\n }\n\n // Computed — merge objet\n if (feature.computed) {\n result.computed = { ...(result.computed ?? {}), ...feature.computed }\n }\n\n // Selectors — merge objet\n if (feature.selectors) {\n result.selectors = { ...(result.selectors ?? {}), ...feature.selectors }\n }\n\n // Effects — concat\n if (feature.effects?.length) {\n result.effects = [...(result.effects ?? []), ...feature.effects]\n }\n\n // Hooks — merge intelligent (tous les handlers appelés)\n if (feature.hooks) {\n result.hooks = mergeHooks(result.hooks, feature.hooks)\n }\n }\n\n return result\n}\n","// ─────────────────────────────────────────────────────\n// @ngstato/core — withProps()\n// Attach read-only properties (services, configs) to the store\n// ─────────────────────────────────────────────────────\n\n/**\n * withProps() — Attach external properties to a store config.\n *\n * Properties are accessible on the store instance but NOT part of the state.\n * Use this to expose injected services on the store object.\n *\n * @example\n * ```ts\n * // Pattern 1: Expose services on the store\n * export const UsersStore = StatoStore(() => {\n * const api = inject(ApiService)\n * const notifier = inject(NotificationService)\n *\n * const store = createStore({\n * users: [] as User[],\n * loading: false,\n *\n * actions: {\n * async loadUsers(state) {\n * state.loading = true\n * state.users = await api.getUsers() // closure over injected service\n * state.loading = false\n * },\n *\n * async deleteUser(state, id: string) {\n * await api.deleteUser(id)\n * state.users = state.users.filter(u => u.id !== id)\n * notifier.success('User deleted')\n * }\n * }\n * })\n *\n * // Attach props to the store — accessible but not in state\n * return withProps(store, { api, notifier })\n * })\n *\n * // In a component:\n * store = injectStore(UsersStore)\n * store.users() // Signal<User[]>\n * store.loadUsers() // action\n * store.api // ApiService — read-only, not in state\n * ```\n *\n * @example\n * ```ts\n * // Pattern 2: Configuration props\n * return withProps(store, {\n * storeName: 'Users',\n * version: '1.0.0',\n * config: { pageSize: 20, cacheTTL: 60_000 }\n * })\n * ```\n */\nexport function withProps<S extends object, P extends Record<string, unknown>>(\n store: S,\n props: P\n): S & Readonly<P> {\n const enhanced = store as any\n\n for (const [key, value] of Object.entries(props)) {\n Object.defineProperty(enhanced, key, {\n get: () => value,\n enumerable: true,\n configurable: false\n })\n }\n\n return enhanced as S & Readonly<P>\n}\n","// ─────────────────────────────────────────────────────\n// @ngstato/core — DevTools\n// Time-travel, action replay, state export/import\n// ─────────────────────────────────────────────────────\n\nexport interface ActionLog {\n id: number\n name: string\n storeName: string\n args: unknown[]\n duration: number\n status: 'success' | 'error'\n error?: string\n prevState: Record<string, unknown>\n nextState: Record<string, unknown>\n at: string\n}\n\nexport interface DevToolsState {\n logs: ActionLog[]\n isOpen: boolean\n maxLogs: number\n activeLogId: number | null // null = \"live\" mode\n isTimeTraveling: boolean\n}\n\nexport interface DevToolsSnapshot {\n version: number\n timestamp: string\n stores: Record<string, unknown>\n logs: ActionLog[]\n}\n\nexport interface DevToolsInstance {\n state: DevToolsState\n logAction: (log: Omit<ActionLog, 'id' | 'at'>) => void\n clear: () => void\n open: () => void\n close: () => void\n toggle: () => void\n subscribe: (cb: (state: DevToolsState) => void) => () => void\n\n // Time-travel\n travelTo: (logId: number) => void\n undo: () => void\n redo: () => void\n resume: () => void\n replay: (logId: number) => void\n\n // State export/import\n exportSnapshot: () => DevToolsSnapshot\n importSnapshot: (snapshot: DevToolsSnapshot) => void\n\n // Store registry\n registerStore: (name: string, publicStore: any, internalStore: any) => void\n getStoreRegistry: () => Map<string, { store: any; internalStore: any }>\n}\n\n// ─────────────────────────────────────────────────────\n// FACTORY\n// ─────────────────────────────────────────────────────\n\nexport function createDevTools(maxLogs = 100): DevToolsInstance {\n let counter = 0\n\n const state: DevToolsState = {\n logs: [],\n isOpen: false,\n maxLogs,\n activeLogId: null,\n isTimeTraveling: false\n }\n\n const listeners = new Set<(state: DevToolsState) => void>()\n const storeRegistry = new Map<string, { store: any; internalStore: any }>()\n\n function notify() {\n const snapshot: DevToolsState = {\n ...state,\n logs: [...state.logs]\n }\n listeners.forEach(cb => cb(snapshot))\n }\n\n function findLogIndex(logId: number): number {\n return state.logs.findIndex(l => l.id === logId)\n }\n\n function getStoreForTravel(storeName: string) {\n const entry = storeRegistry.get(storeName)\n if (!entry) return null\n return entry.internalStore\n }\n\n return {\n state,\n\n // ── Action logging ─────────────────────────────────\n logAction(log) {\n const entry: ActionLog = {\n ...log,\n id: ++counter,\n at: new Date().toISOString()\n }\n\n // Fork: if time-traveling and a new action arrives, truncate future\n if (state.isTimeTraveling && state.activeLogId !== null) {\n const activeIdx = findLogIndex(state.activeLogId)\n if (activeIdx >= 0) {\n // logs are newest-first, so truncate everything before activeIdx\n state.logs = state.logs.slice(activeIdx)\n }\n state.activeLogId = null\n state.isTimeTraveling = false\n }\n\n state.logs = [entry, ...state.logs].slice(0, maxLogs)\n notify()\n },\n\n // ── Travel to a specific action ─────────────────────\n travelTo(logId: number) {\n const idx = findLogIndex(logId)\n if (idx === -1) return\n\n const log = state.logs[idx]\n const internalStore = getStoreForTravel(log.storeName)\n if (!internalStore) return\n\n // Restore that action's resulting state\n internalStore.hydrateForTimeTravel(log.nextState)\n\n state.activeLogId = logId\n state.isTimeTraveling = true\n notify()\n },\n\n // ── Undo — step back in time ───────────────────────\n // activeLogId always points to the log whose nextState is currently displayed.\n // Logs are newest-first: [idx0=newest, idx1, ..., idxN=oldest]\n // Undo moves deeper (higher index = older). Redo moves shallower (lower index = newer).\n undo() {\n if (!state.logs.length) return\n\n if (!state.isTimeTraveling || state.activeLogId === null) {\n // First undo: show the latest log's prevState\n // This is equivalent to \"un-doing the last action\"\n const latest = state.logs[0]\n const internalStore = getStoreForTravel(latest.storeName)\n if (!internalStore) return\n\n // If there's a log after this one, show that log's nextState\n // Otherwise show latest's prevState (initial state)\n if (state.logs.length > 1) {\n const olderLog = state.logs[1]\n internalStore.hydrateForTimeTravel(olderLog.nextState)\n state.activeLogId = olderLog.id\n } else {\n internalStore.hydrateForTimeTravel(latest.prevState)\n state.activeLogId = -1 // before all actions\n }\n state.isTimeTraveling = true\n notify()\n return\n }\n\n // Already time-traveling — go one step deeper\n if (state.activeLogId === -1) return // already at the very beginning\n\n const currentIdx = findLogIndex(state.activeLogId)\n if (currentIdx === -1) return\n\n const targetIdx = currentIdx + 1\n if (targetIdx >= state.logs.length) {\n // Go before all actions\n const currentLog = state.logs[currentIdx]\n const internalStore = getStoreForTravel(currentLog.storeName)\n if (!internalStore) return\n internalStore.hydrateForTimeTravel(currentLog.prevState)\n state.activeLogId = -1\n notify()\n return\n }\n\n const targetLog = state.logs[targetIdx]\n const internalStore = getStoreForTravel(targetLog.storeName)\n if (!internalStore) return\n\n internalStore.hydrateForTimeTravel(targetLog.nextState)\n state.activeLogId = targetLog.id\n notify()\n },\n\n // ── Redo — step forward in time ─────────────────────\n redo() {\n if (!state.isTimeTraveling || state.activeLogId === null) return\n\n if (state.activeLogId === -1) {\n // Was before all actions — go to the oldest action's nextState\n if (!state.logs.length) return\n const oldest = state.logs[state.logs.length - 1]\n const internalStore = getStoreForTravel(oldest.storeName)\n if (!internalStore) return\n\n internalStore.hydrateForTimeTravel(oldest.nextState)\n state.activeLogId = oldest.id\n notify()\n return\n }\n\n const currentIdx = findLogIndex(state.activeLogId)\n if (currentIdx === -1) return\n\n // Move to newer action (lower index)\n const targetIdx = currentIdx - 1\n if (targetIdx <= 0) {\n // Back to live mode (newest action's nextState)\n this.resume()\n return\n }\n\n const targetLog = state.logs[targetIdx]\n const internalStore = getStoreForTravel(targetLog.storeName)\n if (!internalStore) return\n\n internalStore.hydrateForTimeTravel(targetLog.nextState)\n state.activeLogId = targetLog.id\n notify()\n },\n\n // ── Resume — back to live state ─────────────────────\n resume() {\n if (!state.isTimeTraveling) return\n\n // Restore the latest state (newest log's nextState)\n if (state.logs.length) {\n const latest = state.logs[0]\n const internalStore = getStoreForTravel(latest.storeName)\n if (internalStore) {\n internalStore.hydrateForTimeTravel(latest.nextState)\n }\n }\n\n state.activeLogId = null\n state.isTimeTraveling = false\n notify()\n },\n\n // ── Replay — re-execute an action ───────────────────\n replay(logId: number) {\n const idx = findLogIndex(logId)\n if (idx === -1) return\n\n const log = state.logs[idx]\n const entry = storeRegistry.get(log.storeName)\n if (!entry) return\n\n // Extract the raw action name (remove \"[StoreName] \" prefix)\n const rawName = log.name.replace(/^\\[.*?\\]\\s*/, '')\n\n // Resume live state first\n if (state.isTimeTraveling) {\n this.resume()\n }\n\n // Re-dispatch the action\n const publicStore = entry.store\n if (typeof publicStore[rawName] === 'function') {\n void publicStore[rawName](...log.args)\n }\n },\n\n // ── Export snapshot ──────────────────────────────────\n exportSnapshot(): DevToolsSnapshot {\n const stores: Record<string, unknown> = {}\n for (const [name, { store }] of storeRegistry) {\n stores[name] = store.getState()\n }\n\n return {\n version: 1,\n timestamp: new Date().toISOString(),\n stores,\n logs: [...state.logs]\n }\n },\n\n // ── Import snapshot ─────────────────────────────────\n importSnapshot(snapshot: DevToolsSnapshot) {\n if (!snapshot || snapshot.version !== 1) return\n\n // Restore each store's state\n for (const [name, storeState] of Object.entries(snapshot.stores)) {\n const entry = storeRegistry.get(name)\n if (entry) {\n entry.internalStore.hydrateForTimeTravel(storeState)\n }\n }\n\n // Restore logs\n state.logs = snapshot.logs\n state.activeLogId = null\n state.isTimeTraveling = false\n notify()\n },\n\n // ── Basic controls ──────────────────────────────────\n clear() {\n if (state.isTimeTraveling) {\n this.resume()\n }\n state.logs = []\n notify()\n },\n\n open() {\n state.isOpen = true\n notify()\n },\n\n close() {\n state.isOpen = false\n notify()\n },\n\n toggle() {\n state.isOpen = !state.isOpen\n notify()\n },\n\n subscribe(cb) {\n listeners.add(cb)\n return () => listeners.delete(cb)\n },\n\n // ── Store registry ──────────────────────────────────\n registerStore(name, publicStore, internalStore) {\n storeRegistry.set(name, { store: publicStore, internalStore })\n },\n\n getStoreRegistry() {\n return storeRegistry\n }\n }\n}\n\n// ─────────────────────────────────────────────────────\n// INSTANCE GLOBALE — singleton partagé entre tous les stores\n// ─────────────────────────────────────────────────────\n\nexport const devTools = createDevTools()\n\n// ─────────────────────────────────────────────────────\n// PLUGIN — connecte un store aux DevTools\n// ─────────────────────────────────────────────────────\n\nexport function connectDevTools(store: any, storeName: string) {\n if (!devTools) return\n\n let prevState: any = {}\n\n // Accès aux hooks via __store__\n const internalStore = store.__store__\n\n if (!internalStore) return\n\n // Register in store registry for time-travel\n devTools.registerStore(storeName, store, internalStore)\n\n // Sauvegarder les hooks existants\n const existingHooks = { ...internalStore['_hooks'] }\n\n // Remplacer les hooks\n internalStore['_hooks'] = {\n ...existingHooks,\n\n onAction(name: string, args: unknown[]) {\n prevState = store.getState()\n existingHooks.onAction?.(name, args)\n },\n\n onActionDone(name: string, duration: number) {\n const nextState = store.getState()\n devTools.logAction({\n name: `[${storeName}] ${name}`,\n storeName,\n args: [],\n duration,\n status: 'success',\n prevState: { ...prevState },\n nextState: { ...nextState }\n })\n existingHooks.onActionDone?.(name, duration)\n },\n\n onError(error: Error, actionName: string) {\n devTools.logAction({\n name: `[${storeName}] ${actionName}`,\n storeName,\n args: [],\n duration: 0,\n status: 'error',\n error: error.message,\n prevState: { ...prevState },\n nextState: { ...prevState }\n })\n existingHooks.onError?.(error, actionName)\n },\n\n onStateChange: existingHooks.onStateChange\n }\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/helpers/with-feature.ts","../src/helpers/with-props.ts","../src/devtools.ts"],"names":["throttled","internalStore"],"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// Global DevTools dispatch hook — set by connectDevTools\r\nconst DEVTOOLS_DISPATCH_KEY = '__NGSTATO_DISPATCH_HOOK__'\r\ntype DispatchHook = (storeName: string, actionName: string, prevState: any, nextState: any, duration: number, status: 'success' | 'error', error?: string) => void\r\nfunction getDispatchHook(): DispatchHook | undefined {\r\n return (globalThis as any)[DEVTOOLS_DISPATCH_KEY]\r\n}\r\nexport function setDispatchHook(hook: DispatchHook) {\r\n (globalThis as any)[DEVTOOLS_DISPATCH_KEY] = hook\r\n}\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 _timeTraveling = false\r\n _devToolsStoreName: string | null = 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 if (!this._timeTraveling) {\r\n this._runEffects()\r\n }\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\n async 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 — seulement si le state a réellement changé\r\n const nextState = { ...this._state }\r\n const hasChanged = Object.keys(nextState).some(\r\n (k) => !Object.is((prevState as any)[k], (nextState as any)[k])\r\n )\r\n if (hasChanged) {\r\n this._hooks.onStateChange?.(prevState as any, nextState as any)\r\n }\r\n\r\n // DevTools logging — via globalThis hook\r\n if (this._devToolsStoreName) {\r\n getDispatchHook()?.(this._devToolsStoreName, actionName, prevState, nextState, duration, 'success')\r\n }\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 const errDuration = Date.now() - start\r\n // DevTools logging — error\r\n if (this._devToolsStoreName) {\r\n getDispatchHook()?.(this._devToolsStoreName, actionName, prevState, prevState, errDuration, 'error', (error as Error).message)\r\n }\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: errDuration,\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 // ── Time-travel — restaurer un snapshot sans déclencher les effects ──\r\n hydrateForTimeTravel(fullState: StateSlice<S>) {\r\n this._timeTraveling = true\r\n this._state = { ...fullState }\r\n this._notify()\r\n this._timeTraveling = false\r\n }\r\n\r\n setPublicStore(publicStore: any) {\r\n this._publicStore = publicStore\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>(\r\n config: S & StatoStoreConfig<S>,\r\n __internal?: { skipInit?: boolean }\r\n) {\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 // Si skipInit est demandé (cas Angular), l'adaptateur appellera init() lui-même\r\n if (!__internal?.skipInit) {\r\n store.init(publicStore)\r\n }\r\n\r\n return publicStore\r\n}\r\n\r\n// ─────────────────────────────────────────────────────\r\n// store.on() — réactions inter-stores\r\n// Supporte une action unique ou un tableau d'actions\r\n// ─────────────────────────────────────────────────────\r\n\r\nexport type OnEvent = {\r\n name: string\r\n args: unknown[]\r\n status: 'success' | 'error'\r\n duration: number\r\n error?: Error\r\n}\r\n\r\nexport function on<S extends object>(\r\n sourceAction: Function | Function[],\r\n handler: (store: S, event: OnEvent) => void | Promise<void>\r\n): () => void {\r\n const actions = Array.isArray(sourceAction) ? sourceAction : [sourceAction]\r\n\r\n const unsubs = actions.map((action) =>\r\n subscribeToAction(action, (event) => {\r\n try {\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 — les erreurs dans les handlers on() ne doivent pas crasher\r\n }\r\n })\r\n )\r\n\r\n // Retourne une fonction de désabonnement unique pour toutes les actions\r\n return () => unsubs.forEach((unsub) => unsub())\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 // Stocker le dernier appel pour utiliser le state le plus récent\r\n let latestState: S\r\n let latestArgs: A\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 // Sauvegarder le state et args les plus récents\r\n latestState = state\r\n latestArgs = args\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(latestState, ...latestArgs)\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 // Stocker le dernier appel pour utiliser le state le plus récent\r\n let latestState: S\r\n let latestArgs: A\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 // Sauvegarder le state et args les plus récents\r\n latestState = state\r\n latestArgs = args\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(latestState, ...latestArgs)\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(latestState, ...latestArgs)\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 PROFOND du state AVANT la modification\r\n // JSON deep clone — structuredClone fails on Proxy objects\r\n const snapshot = JSON.parse(JSON.stringify(state)) 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","// ─────────────────────────────────────────────────────\n// @ngstato/core — mergeFeatures()\n// Composition de features réutilisables entre stores\n//\n// Inspiré de NgRx signalStoreFeature() mais sans boilerplate.\n// Une feature = un fragment de config { state, actions, computed,\n// selectors, effects, hooks } qui peut être partagée entre stores.\n//\n// Usage :\n// function withLoading() {\n// return {\n// state: { loading: false, error: null as string | null },\n// actions: { setLoading: (s, v: boolean) => { s.loading = v } },\n// computed: { hasError: (s) => s.error !== null }\n// }\n// }\n//\n// const store = createStore({\n// users: [] as User[],\n// ...mergeFeatures(withLoading(), withPagination())\n// })\n// ─────────────────────────────────────────────────────\n\nimport type { StatoHooks, EffectEntry } from '../types'\n\n// ─────────────────────────────────────────────────────\n// TYPES\n// ─────────────────────────────────────────────────────\n\nexport interface FeatureConfig {\n state?: Record<string, unknown>\n actions?: Record<string, Function>\n computed?: Record<string, Function>\n selectors?: Record<string, Function>\n effects?: EffectEntry<any>[]\n hooks?: Partial<StatoHooks<any>>\n}\n\nexport type MergedFeature = {\n actions?: Record<string, Function>\n computed?: Record<string, Function>\n selectors?: Record<string, Function>\n effects?: EffectEntry<any>[]\n hooks?: Partial<StatoHooks<any>>\n [key: string]: unknown // state keys spreaded at root level\n}\n\n// ─────────────────────────────────────────────────────\n// HOOK MERGER — fusionne les hooks sans écraser les existants\n// Chaque hook appelle tous les handlers enregistrés par chaque feature\n// ─────────────────────────────────────────────────────\n\nfunction mergeHooks(\n a: Partial<StatoHooks<any>> | undefined,\n b: Partial<StatoHooks<any>> | undefined\n): Partial<StatoHooks<any>> {\n if (!a) return b ?? {}\n if (!b) return a\n\n const hookNames: (keyof StatoHooks<any>)[] = [\n 'onInit', 'onDestroy', 'onAction', 'onActionDone', 'onError', 'onStateChange'\n ]\n\n const merged: Partial<StatoHooks<any>> = { ...a }\n\n for (const name of hookNames) {\n const fnA = a[name] as Function | undefined\n const fnB = b[name] as Function | undefined\n if (fnA && fnB) {\n ;(merged as any)[name] = (...args: unknown[]) => {\n fnA(...args)\n fnB(...args)\n }\n } else if (fnB) {\n ;(merged as any)[name] = fnB\n }\n }\n\n return merged\n}\n\n// ─────────────────────────────────────────────────────\n// mergeFeatures() — fusionne N features en un seul objet config\n//\n// Règles de fusion :\n// - state → spreaded à la racine (comme createStore l'attend)\n// - actions → merge objet (dernière feature l'emporte en cas de conflit)\n// - computed → merge objet\n// - selectors → merge objet\n// - effects → concat array\n// - hooks → merge intelligent (tous les handlers sont appelés)\n// ─────────────────────────────────────────────────────\n\nexport function mergeFeatures(...features: FeatureConfig[]): MergedFeature {\n const result: MergedFeature = {}\n\n for (const feature of features) {\n // State — spreader à la racine\n if (feature.state) {\n Object.assign(result, feature.state)\n }\n\n // Actions — merge objet\n if (feature.actions) {\n result.actions = { ...(result.actions ?? {}), ...feature.actions }\n }\n\n // Computed — merge objet\n if (feature.computed) {\n result.computed = { ...(result.computed ?? {}), ...feature.computed }\n }\n\n // Selectors — merge objet\n if (feature.selectors) {\n result.selectors = { ...(result.selectors ?? {}), ...feature.selectors }\n }\n\n // Effects — concat\n if (feature.effects?.length) {\n result.effects = [...(result.effects ?? []), ...feature.effects]\n }\n\n // Hooks — merge intelligent (tous les handlers appelés)\n if (feature.hooks) {\n result.hooks = mergeHooks(result.hooks, feature.hooks)\n }\n }\n\n return result\n}\n","// ─────────────────────────────────────────────────────\n// @ngstato/core — withProps()\n// Attach read-only properties (services, configs) to the store\n// ─────────────────────────────────────────────────────\n\n/**\n * withProps() — Attach external properties to a store config.\n *\n * Properties are accessible on the store instance but NOT part of the state.\n * Use this to expose injected services on the store object.\n *\n * @example\n * ```ts\n * // Pattern 1: Expose services on the store\n * export const UsersStore = StatoStore(() => {\n * const api = inject(ApiService)\n * const notifier = inject(NotificationService)\n *\n * const store = createStore({\n * users: [] as User[],\n * loading: false,\n *\n * actions: {\n * async loadUsers(state) {\n * state.loading = true\n * state.users = await api.getUsers() // closure over injected service\n * state.loading = false\n * },\n *\n * async deleteUser(state, id: string) {\n * await api.deleteUser(id)\n * state.users = state.users.filter(u => u.id !== id)\n * notifier.success('User deleted')\n * }\n * }\n * })\n *\n * // Attach props to the store — accessible but not in state\n * return withProps(store, { api, notifier })\n * })\n *\n * // In a component:\n * store = injectStore(UsersStore)\n * store.users() // Signal<User[]>\n * store.loadUsers() // action\n * store.api // ApiService — read-only, not in state\n * ```\n *\n * @example\n * ```ts\n * // Pattern 2: Configuration props\n * return withProps(store, {\n * storeName: 'Users',\n * version: '1.0.0',\n * config: { pageSize: 20, cacheTTL: 60_000 }\n * })\n * ```\n */\nexport function withProps<S extends object, P extends Record<string, unknown>>(\n store: S,\n props: P\n): S & Readonly<P> {\n const enhanced = store as any\n\n for (const [key, value] of Object.entries(props)) {\n Object.defineProperty(enhanced, key, {\n get: () => value,\n enumerable: true,\n configurable: false\n })\n }\n\n return enhanced as S & Readonly<P>\n}\n","// ─────────────────────────────────────────────────────\n// @ngstato/core — DevTools\n// Time-travel, action replay, state export/import\n// ─────────────────────────────────────────────────────\n\nimport { setDispatchHook } from './store'\nexport interface ActionLog {\n id: number\n name: string\n storeName: string\n args: unknown[]\n duration: number\n status: 'success' | 'error'\n error?: string\n prevState: Record<string, unknown>\n nextState: Record<string, unknown>\n at: string\n}\n\nexport interface DevToolsState {\n logs: ActionLog[]\n isOpen: boolean\n maxLogs: number\n activeLogId: number | null // null = \"live\" mode\n isTimeTraveling: boolean\n}\n\nexport interface DevToolsSnapshot {\n version: number\n timestamp: string\n stores: Record<string, unknown>\n logs: ActionLog[]\n}\n\nexport interface DevToolsInstance {\n state: DevToolsState\n logAction: (log: Omit<ActionLog, 'id' | 'at'>) => void\n clear: () => void\n open: () => void\n close: () => void\n toggle: () => void\n subscribe: (cb: (state: DevToolsState) => void) => () => void\n\n // Time-travel\n travelTo: (logId: number) => void\n undo: () => void\n redo: () => void\n resume: () => void\n replay: (logId: number) => void\n\n // State export/import\n exportSnapshot: () => DevToolsSnapshot\n importSnapshot: (snapshot: DevToolsSnapshot) => void\n\n // Store registry\n registerStore: (name: string, publicStore: any, internalStore: any) => void\n getStoreRegistry: () => Map<string, { store: any; internalStore: any }>\n}\n\n// ─────────────────────────────────────────────────────\n// FACTORY\n// ─────────────────────────────────────────────────────\n\nexport function createDevTools(maxLogs = 100): DevToolsInstance {\n let counter = 0\n\n const state: DevToolsState = {\n logs: [],\n isOpen: false,\n maxLogs,\n activeLogId: null,\n isTimeTraveling: false\n }\n\n const listeners = new Set<(state: DevToolsState) => void>()\n const storeRegistry = new Map<string, { store: any; internalStore: any }>()\n\n function notify() {\n const snapshot: DevToolsState = {\n ...state,\n logs: [...state.logs]\n }\n listeners.forEach(cb => cb(snapshot))\n }\n\n function findLogIndex(logId: number): number {\n return state.logs.findIndex(l => l.id === logId)\n }\n\n function getStoreForTravel(storeName: string) {\n const entry = storeRegistry.get(storeName)\n if (!entry) return null\n return entry.internalStore\n }\n\n return {\n state,\n\n // ── Action logging ─────────────────────────────────\n logAction(log) {\n const entry: ActionLog = {\n ...log,\n id: ++counter,\n at: new Date().toISOString()\n }\n\n // Fork: if time-traveling and a new action arrives, truncate future\n if (state.isTimeTraveling && state.activeLogId !== null) {\n const activeIdx = findLogIndex(state.activeLogId)\n if (activeIdx >= 0) {\n // logs are newest-first, so truncate everything before activeIdx\n state.logs = state.logs.slice(activeIdx)\n }\n state.activeLogId = null\n state.isTimeTraveling = false\n }\n\n state.logs = [entry, ...state.logs].slice(0, maxLogs)\n notify()\n },\n\n // ── Travel to a specific action ─────────────────────\n travelTo(logId: number) {\n const idx = findLogIndex(logId)\n if (idx === -1) return\n\n const log = state.logs[idx]\n const internalStore = getStoreForTravel(log.storeName)\n if (!internalStore) return\n\n // Restore that action's resulting state\n internalStore.hydrateForTimeTravel(log.nextState)\n\n state.activeLogId = logId\n state.isTimeTraveling = true\n notify()\n },\n\n // ── Undo — step back in time ───────────────────────\n // activeLogId always points to the log whose nextState is currently displayed.\n // Logs are newest-first: [idx0=newest, idx1, ..., idxN=oldest]\n // Undo moves deeper (higher index = older). Redo moves shallower (lower index = newer).\n undo() {\n if (!state.logs.length) return\n\n if (!state.isTimeTraveling || state.activeLogId === null) {\n // First undo: show the latest log's prevState\n // This is equivalent to \"un-doing the last action\"\n const latest = state.logs[0]\n const internalStore = getStoreForTravel(latest.storeName)\n if (!internalStore) return\n\n // If there's a log after this one, show that log's nextState\n // Otherwise show latest's prevState (initial state)\n if (state.logs.length > 1) {\n const olderLog = state.logs[1]\n internalStore.hydrateForTimeTravel(olderLog.nextState)\n state.activeLogId = olderLog.id\n } else {\n internalStore.hydrateForTimeTravel(latest.prevState)\n state.activeLogId = -1 // before all actions\n }\n state.isTimeTraveling = true\n notify()\n return\n }\n\n // Already time-traveling — go one step deeper\n if (state.activeLogId === -1) return // already at the very beginning\n\n const currentIdx = findLogIndex(state.activeLogId)\n if (currentIdx === -1) return\n\n const targetIdx = currentIdx + 1\n if (targetIdx >= state.logs.length) {\n // Go before all actions\n const currentLog = state.logs[currentIdx]\n const internalStore = getStoreForTravel(currentLog.storeName)\n if (!internalStore) return\n internalStore.hydrateForTimeTravel(currentLog.prevState)\n state.activeLogId = -1\n notify()\n return\n }\n\n const targetLog = state.logs[targetIdx]\n const internalStore = getStoreForTravel(targetLog.storeName)\n if (!internalStore) return\n\n internalStore.hydrateForTimeTravel(targetLog.nextState)\n state.activeLogId = targetLog.id\n notify()\n },\n\n // ── Redo — step forward in time ─────────────────────\n redo() {\n if (!state.isTimeTraveling || state.activeLogId === null) return\n\n if (state.activeLogId === -1) {\n // Was before all actions — go to the oldest action's nextState\n if (!state.logs.length) return\n const oldest = state.logs[state.logs.length - 1]\n const internalStore = getStoreForTravel(oldest.storeName)\n if (!internalStore) return\n\n internalStore.hydrateForTimeTravel(oldest.nextState)\n state.activeLogId = oldest.id\n notify()\n return\n }\n\n const currentIdx = findLogIndex(state.activeLogId)\n if (currentIdx === -1) return\n\n // Move to newer action (lower index)\n const targetIdx = currentIdx - 1\n if (targetIdx <= 0) {\n // Back to live mode (newest action's nextState)\n this.resume()\n return\n }\n\n const targetLog = state.logs[targetIdx]\n const internalStore = getStoreForTravel(targetLog.storeName)\n if (!internalStore) return\n\n internalStore.hydrateForTimeTravel(targetLog.nextState)\n state.activeLogId = targetLog.id\n notify()\n },\n\n // ── Resume — back to live state ─────────────────────\n resume() {\n if (!state.isTimeTraveling) return\n\n // Restore the latest state (newest log's nextState)\n if (state.logs.length) {\n const latest = state.logs[0]\n const internalStore = getStoreForTravel(latest.storeName)\n if (internalStore) {\n internalStore.hydrateForTimeTravel(latest.nextState)\n }\n }\n\n state.activeLogId = null\n state.isTimeTraveling = false\n notify()\n },\n\n // ── Replay — re-execute an action ───────────────────\n replay(logId: number) {\n const idx = findLogIndex(logId)\n if (idx === -1) return\n\n const log = state.logs[idx]\n const entry = storeRegistry.get(log.storeName)\n if (!entry) return\n\n // Extract the raw action name (remove \"[StoreName] \" prefix)\n const rawName = log.name.replace(/^\\[.*?\\]\\s*/, '')\n\n // Resume live state first\n if (state.isTimeTraveling) {\n this.resume()\n }\n\n // Re-dispatch the action\n const publicStore = entry.store\n if (typeof publicStore[rawName] === 'function') {\n void publicStore[rawName](...log.args)\n }\n },\n\n // ── Export snapshot ──────────────────────────────────\n exportSnapshot(): DevToolsSnapshot {\n const stores: Record<string, unknown> = {}\n for (const [name, { store }] of storeRegistry) {\n stores[name] = store.getState()\n }\n\n return {\n version: 1,\n timestamp: new Date().toISOString(),\n stores,\n logs: [...state.logs]\n }\n },\n\n // ── Import snapshot ─────────────────────────────────\n importSnapshot(snapshot: DevToolsSnapshot) {\n if (!snapshot || snapshot.version !== 1) return\n\n // Restore each store's state\n for (const [name, storeState] of Object.entries(snapshot.stores)) {\n const entry = storeRegistry.get(name)\n if (entry) {\n entry.internalStore.hydrateForTimeTravel(storeState)\n }\n }\n\n // Restore logs\n state.logs = snapshot.logs\n state.activeLogId = null\n state.isTimeTraveling = false\n notify()\n },\n\n // ── Basic controls ──────────────────────────────────\n clear() {\n if (state.isTimeTraveling) {\n this.resume()\n }\n state.logs = []\n notify()\n },\n\n open() {\n state.isOpen = true\n notify()\n },\n\n close() {\n state.isOpen = false\n notify()\n },\n\n toggle() {\n state.isOpen = !state.isOpen\n notify()\n },\n\n subscribe(cb) {\n listeners.add(cb)\n return () => listeners.delete(cb)\n },\n\n // ── Store registry ──────────────────────────────────\n registerStore(name, publicStore, internalStore) {\n storeRegistry.set(name, { store: publicStore, internalStore })\n },\n\n getStoreRegistry() {\n return storeRegistry\n }\n }\n}\n\n// ─────────────────────────────────────────────────────\n// INSTANCE GLOBALE — singleton partagé entre tous les stores\n// Uses globalThis to survive across multiple bundle copies\n// ─────────────────────────────────────────────────────\n\nconst DEVTOOLS_KEY = '__NGSTATO_DEVTOOLS__'\nexport const devTools: DevToolsInstance =\n (globalThis as any)[DEVTOOLS_KEY] ??\n ((globalThis as any)[DEVTOOLS_KEY] = createDevTools())\n\n// ─────────────────────────────────────────────────────\n// PLUGIN — connecte un store aux DevTools\n// Uses globalThis dispatch hook — no private hook patching\n// ─────────────────────────────────────────────────────\n\n// Install the global dispatch hook once\nfunction ensureDispatchHook() {\n setDispatchHook((storeName, actionName, prevState, nextState, duration, status, error) => {\n devTools.logAction({\n name: `[${storeName}] ${actionName}`,\n storeName,\n args: [],\n duration,\n status,\n error,\n prevState: { ...prevState },\n nextState: { ...nextState }\n })\n })\n}\n\nexport function connectDevTools(store: any, storeName: string) {\n if (!devTools) return\n\n const internalStore = store.__store__\n if (!internalStore) return\n\n // Tag the internal store so dispatch() knows to call the hook\n internalStore._devToolsStoreName = storeName\n\n // Register in store registry for time-travel\n devTools.registerStore(storeName, store, internalStore)\n\n // Install global dispatch hook (idempotent)\n ensureDispatchHook()\n\n // Log initial state\n try {\n const currentState = store.getState()\n devTools.logAction({\n name: `[${storeName}] @@INIT`,\n storeName,\n args: [],\n duration: 0,\n status: 'success',\n prevState: {},\n nextState: { ...currentState }\n })\n } catch {\n // ignore\n }\n}"]}