{"version":3,"file":"signalstory.mjs","sources":["../../../packages/signalstory/src/lib/store-immutability/immutable-utility.ts","../../../packages/signalstory/src/lib/store-mediator.ts","../../../packages/signalstory/src/lib/store-registry.ts","../../../packages/signalstory/src/lib/utility/injector-helper.ts","../../../packages/signalstory/src/lib/utility/sideeffect.ts","../../../packages/signalstory/src/lib/store.ts","../../../packages/signalstory/src/lib/store-effect.ts","../../../packages/signalstory/src/lib/store-event.ts","../../../packages/signalstory/src/lib/store-immutability/immutable-store.ts","../../../packages/signalstory/src/lib/utility/memoize.ts","../../../packages/signalstory/src/lib/utility/feature-detection.ts","../../../packages/signalstory/src/lib/store-history.ts","../../../packages/signalstory/src/lib/store-plugin-deep-freeze/deep-freeze.ts","../../../packages/signalstory/src/lib/store-plugin-deep-freeze/plugin-deep-freeze.ts","../../../packages/signalstory/src/lib/store-plugin-devtools/plugin-devtools.ts","../../../packages/signalstory/src/lib/store-plugin-logger/plugin-logger.ts","../../../packages/signalstory/src/lib/store-plugin-performance-counter/performance-counter.ts","../../../packages/signalstory/src/lib/store-plugin-performance-counter/plugin-performance-counter.ts","../../../packages/signalstory/src/lib/store-plugin-persistence/idb/idb-migration.ts","../../../packages/signalstory/src/lib/store-plugin-persistence/idb/idb-pool.ts","../../../packages/signalstory/src/lib/store-plugin-persistence/idb/idb-adapter.ts","../../../packages/signalstory/src/lib/store-plugin-persistence/persistence-async-storage.ts","../../../packages/signalstory/src/lib/store-plugin-persistence/persistence-sync-storage.ts","../../../packages/signalstory/src/lib/store-plugin-persistence/plugin-persistence.ts","../../../packages/signalstory/src/lib/store-plugin-status/plugin-status.ts","../../../packages/signalstory/src/lib/store-query.ts","../../../packages/signalstory/src/lib/store-snapshot.ts","../../../packages/signalstory/src/public-api.ts","../../../packages/signalstory/src/signalstory.ts"],"sourcesContent":["/**\n * Naively creates a deep clone of a given state object using JSON.parse and JSON.stringify.\n * This approach is simple but not optimal for performance.\n *\n * @template TState - The type of the state object.\n * @param state - The state object to be cloned.\n * @returns A deep clone of the provided state object.\n */\nexport function naiveDeepClone<TState>(state: TState): TState {\n  return JSON.parse(JSON.stringify(state)) as TState;\n}\n\n/**\n * Creates a deep clone of a given value object using either the `structuredClone` method if available,\n * or a naive approach using JSON.parse and JSON.stringify if `structuredClone` is not supported.\n * The naive approach is simple but may have shortcomings and is not optimal for performance.\n *\n * @template T - The type of the value object.\n * @param {T} value - The value object to be cloned.\n * @returns {T} A deep clone of the provided value object.\n */\nexport function deepClone<TState>(state: TState): TState {\n  return window && 'structuredClone' in window\n    ? structuredClone(state)\n    : naiveDeepClone(state);\n}\n\n/**\n * Creates a shallow clone of a given value object\n * @param state - The state to be cloned.\n * @returns Shallow cloned state.\n */\nexport function shallowClone<TState>(state: TState): TState {\n  if (!state || typeof state !== 'object') {\n    return state;\n  }\n\n  if (Array.isArray(state)) return [...state] as TState;\n  if (state instanceof Date) return new Date(state) as TState;\n  if (state instanceof RegExp) return new RegExp(state) as TState;\n  if (state instanceof Set) return new Set(state) as TState;\n  if (state instanceof Map) return new Map(state) as TState;\n\n  return Object.assign({}, state) as TState;\n}\n\n/**\n * Naive implementation of an immutable update function using a clone-and-mutate approach.\n * This function serves as a placeholder that you can swap with a more optimized\n * solution like the one provided by the 'immer.js' library (https://immerjs.github.io/immer/).\n * Using 'immer.js' will result in more efficient and concise code for managing\n * immutable updates to your state.\n *\n * @template TState - The type of the state object.\n * @param currentState - The current state object to be updated.\n * @param mutation - A function that modifies a draft copy of the state.\n * @returns The new state object after applying the mutation.\n */\nexport function naiveCloneAndMutateFunc<TState>(\n  currentState: TState,\n  mutation: (draftState: TState) => void\n): TState {\n  const clone = deepClone(currentState) as TState;\n  mutation(clone);\n  return clone;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Store } from './store';\nimport { StoreEvent } from './store-event';\n\ntype EventHandler<TStore extends Store<unknown>, TPayload> = {\n  store: WeakRef<TStore>;\n  handler: (store: TStore, event: StoreEvent<TPayload>) => void;\n};\n\ntype MediatorRegistry = WeakMap<\n  StoreEvent<unknown>,\n  Set<EventHandler<Store<unknown>, unknown>>\n>;\n\n/**\n * Creates an empty Mediator registry.\n */\nexport function createRegistry(): MediatorRegistry {\n  return new WeakMap<\n    StoreEvent<unknown>,\n    Set<EventHandler<Store<unknown>, unknown>>\n  >();\n}\n\n/**\n * Root mediator registry instance.\n */\nexport const rootRegistry: MediatorRegistry = /*@__PURE__*/ createRegistry();\n\n/**\n * Register an event handler for a specific event.\n *\n * @param {MediatorRegistry} registry - The mediator registry to register the handler in.\n * @param {TStore} store - The store instance associated with the event handler.\n * @param {StoreEvent<TPayload>} event - The event to register.\n * @param {(store: TStore, event: StoreEvent<TPayload>) => void} handler - The handler function to be executed when the event occurs.\n * @throws {Error} if the event name is invalid.\n */\nexport function register<TStore extends Store<any>, TPayload>(\n  registry: MediatorRegistry,\n  store: TStore,\n  event: StoreEvent<TPayload>,\n  handler: (store: TStore, event: StoreEvent<TPayload>) => void\n) {\n  const existingHandlers =\n    registry.get(event) || new Set<EventHandler<Store<unknown>, unknown>>();\n  existingHandlers.add({\n    store: new WeakRef(store),\n    handler,\n  } as unknown as EventHandler<Store<unknown>, unknown>);\n  registry.set(event, existingHandlers);\n}\n\n/**\n * Unregister event handlers for a specific store and events.\n *\n * @param {MediatorRegistry} registry - The mediator registry to unregister the handlers from.\n * @param {TStore} store - The store instance to remove event handlers from.\n * @param {...StoreEvent<any>[]} events - The events to remove handlers for.\n */\nexport function unregister<TStore extends Store<any>>(\n  registry: MediatorRegistry,\n  store: TStore,\n  ...events: StoreEvent<unknown>[]\n) {\n  for (const event of events) {\n    const handlers = registry.get(event);\n    if (handlers) {\n      handlers.forEach(handler => {\n        const handlingStore = handler.store.deref();\n        if (!handlingStore || handlingStore === store) {\n          handlers.delete(handler);\n        }\n      });\n      if (handlers.size === 0) {\n        registry.delete(event);\n      }\n    }\n  }\n}\n\n/**\n * Publishes an event, executing all associated event handlers.\n *\n * @param {MediatorRegistry} registry - The mediator registry containing the event handlers.\n * @param {StoreEvent<never>} event - The event to publish.\n * @param {undefined} payload - The payload to pass to the event handlers.\n * @throws {Error} if the event name is invalid.\n * @throws {AggregateError} if there are errors in any event handler.\n */\nexport function publish(\n  registry: MediatorRegistry,\n  event: StoreEvent<never>,\n  payload?: undefined\n): void;\nexport function publish<T>(\n  registry: MediatorRegistry,\n  event: StoreEvent<T>,\n  payload: T\n): void;\nexport function publish<T>(\n  registry: MediatorRegistry,\n  event: StoreEvent<T>,\n  payload?: T\n): void {\n  const handlers = registry.get(event);\n\n  const eventWithPayload = {\n    name: event.name,\n    payload: payload,\n  };\n\n  if (handlers) {\n    const errors: Error[] = [];\n    for (const handler of handlers) {\n      const store = handler.store.deref();\n      if (store) {\n        try {\n          handler.handler(store, eventWithPayload);\n        } catch (error) {\n          errors.push(error as Error);\n        }\n      } else {\n        handlers.delete(handler);\n      }\n    }\n    if (errors.length > 0) {\n      throw new AggregateError(\n        errors,\n        `Errors in Handler for event ${eventWithPayload.name}`\n      );\n    }\n  }\n}\n\n/**\n * Publishes a store event, executing all associated event handlers.\n *\n * @param {StoreEvent<never>} event - The event to publish.\n * @param {undefined} payload - The payload to pass to the event handlers.\n * @throws {Error} if the event name is invalid.\n * @throws {AggregateError} if there are errors in any event handler.\n */\nexport function publishStoreEvent(\n  event: StoreEvent<never>,\n  payload?: undefined\n): void;\nexport function publishStoreEvent<T>(event: StoreEvent<T>, payload: T): void;\nexport function publishStoreEvent<T>(event: StoreEvent<T>, payload?: T): void {\n  publish(rootRegistry, event, payload);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Store } from './store';\n\n/**\n * Store registry of stores currently in scope\n */\nexport const storeRegistry = new Set<WeakRef<Store<unknown>>>();\n\n/**\n * Iterates over each store in the registry and executes the specified callback function.\n *\n * @param callbackFn - The callback function to be executed for each store in the registry.\n */\nexport function forEachStoreInScope(\n  callbackFn: (store: Store<unknown>) => void\n) {\n  storeRegistry.forEach(registration => {\n    const store = registration.deref();\n    if (store) {\n      callbackFn(store);\n    } else {\n      storeRegistry.delete(registration);\n    }\n  });\n}\n\n/**\n * Adds a store to the registry.\n *\n * @param store - The store to be added to the registry.\n */\nexport function addToRegistry(store: Store<any>) {\n  storeRegistry.add(new WeakRef(store));\n}\n\n/**\n * Cleare Store registry.\n * Only used for tests\n *\n */\nexport function clearRegistry() {\n  storeRegistry.clear();\n}\n","import { Injector, inject } from '@angular/core';\n\n/**\n * Attempts to retrieve the Angular injector or returns null if not available.\n *\n * This function utilizes the `inject` function from Angular's dependency injection system\n * to obtain an instance of the Angular `Injector`. If the injector is not available, it\n * gracefully returns null.\n *\n * @returns The Angular injector if available, otherwise null.\n */\nexport function getInjectorOrNull(): Injector | null {\n  try {\n    return inject(Injector);\n  } catch (_) {\n    return null;\n  }\n}\n","import { finalize, isObservable } from 'rxjs';\n\n/**\n * Type to indicate that a given object is a Promise\n * @template T - The type of the resolved value of the promise.\n */\ntype PromiseLike<T> = {\n  then(\n    onfulfilled?: (value: T) => unknown | PromiseLike<unknown>\n  ): PromiseLike<unknown>;\n  finally(onfinally?: () => void): PromiseLike<unknown>;\n};\n\n/**\n * Checks if the provided object is a promise\n * @param obj - The object to be checked.\n * @returns True if the object is a promise, false otherwise.\n * @template T - The type of the resolved value of the promise.\n */\nfunction isPromise<T>(obj: T | PromiseLike<T>): obj is PromiseLike<T> {\n  return (\n    obj &&\n    typeof (obj as PromiseLike<T>).then === 'function' &&\n    typeof (obj as PromiseLike<T>).finally === 'function'\n  );\n}\n\n/**\n * Executes a side effect based on the nature of the source object\n * @param source - The source object\n * @param sideEffect - The side effect function to be executed.\n * @returns The source object with the side effect applied.\n * @template T - The type of the source object.\n */\nexport function withSideEffect<T>(source: T, sideEffect: () => void): T {\n  if (isObservable(source)) {\n    return source.pipe(finalize(sideEffect)) as T;\n  } else if (isPromise(source)) {\n    return source.finally(sideEffect) as T;\n  }\n\n  sideEffect();\n  return source;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n  Injector,\n  ProviderToken,\n  Signal,\n  WritableSignal,\n  assertInInjectionContext,\n  computed,\n  inject,\n  runInInjectionContext,\n  signal,\n} from '@angular/core';\nimport { StoreConfig } from './store-config';\nimport { StoreEffect } from './store-effect';\nimport { StoreEvent } from './store-event';\nimport { shallowClone } from './store-immutability/immutable-utility';\nimport { register, rootRegistry, unregister } from './store-mediator';\nimport {\n  CommandPostprocessor,\n  CommandPreprocessor,\n  EffectPostprocessor,\n  EffectPreprocessor,\n  InitPostprocessor,\n} from './store-plugin';\nimport { StoreQuery } from './store-query';\nimport { addToRegistry } from './store-registry';\nimport { getInjectorOrNull } from './utility/injector-helper';\nimport { withSideEffect } from './utility/sideeffect';\n\n/**\n * Represents a signal store that manages a state and provides methods for state mutation, event handling, and more.\n * @typeparam TState The type of the store's state.\n */\nexport class Store<TState> {\n  private readonly _state: WritableSignal<TState>;\n  private readonly initPostprocessor?: InitPostprocessor[];\n  private readonly commandPreprocessor?: CommandPreprocessor[];\n  private readonly commandPostprocessor?: CommandPostprocessor[];\n  private readonly effectPreprocessor?: EffectPreprocessor[];\n  private readonly effectPostprocessor?: EffectPostprocessor<unknown>[];\n  /**\n   * The config of the store as readonly\n   */\n  public readonly config: Readonly<Required<StoreConfig<TState>>>;\n\n  /**\n   * Creates a new instance of the store class.\n   * @param config The configuration options for the store.\n   */\n  public constructor(config: StoreConfig<TState>) {\n    this.config = {\n      name: config.name ?? this.constructor.name,\n      initialState: config.initialState,\n      injector: config.injector ?? getInjectorOrNull(),\n      stateEqualityFn: config.stateEqualityFn ?? null,\n      plugins: config.plugins ?? [],\n    };\n\n    this._state = signal(this.config.initialState, {\n      equal: this.config.stateEqualityFn ?? undefined,\n    });\n\n    addToRegistry(this);\n\n    this.config.plugins\n      .sort((a, b) => (b.precedence ?? 0) - (a.precedence ?? 0))\n      .forEach(plugin => {\n        if (plugin.init) {\n          (this.initPostprocessor as any) ??= [];\n          this.initPostprocessor!.push(plugin.init);\n        }\n        if (plugin.preprocessCommand) {\n          (this.commandPreprocessor as any) ??= [];\n          this.commandPreprocessor!.push(plugin.preprocessCommand);\n        }\n        if (plugin.postprocessCommand) {\n          (this.commandPostprocessor as any) ??= [];\n          this.commandPostprocessor!.unshift(plugin.postprocessCommand);\n        }\n        if (plugin.preprocessEffect) {\n          (this.effectPreprocessor as any) ??= [];\n          this.effectPreprocessor!.push(plugin.preprocessEffect);\n        }\n        if (plugin.postprocessEffect) {\n          (this.effectPostprocessor as any) ??= [];\n          this.effectPostprocessor!.unshift(plugin.postprocessEffect);\n        }\n      });\n\n    this.initPostprocessor?.forEach(p => p(this));\n  }\n\n  /**\n   * Gets the name of the store\n   */\n  public get name(): string {\n    return this.config.name;\n  }\n\n  /**\n   * Gets the signal representing the store's current state.\n   */\n  public get state(): Signal<TState> {\n    return this._state.asReadonly();\n  }\n\n  /**\n   * Sets the store's state to the provided state, with an optional command name.\n   * @param newState The new state of the store.\n   * @param commandName The name of the command associated with the state change.\n   */\n  public set(newState: TState, commandName?: string): void {\n    this.commandPreprocessor?.forEach(p => p(this, commandName));\n\n    this._state.set(newState);\n\n    this.commandPostprocessor?.forEach(p => p(this, commandName));\n  }\n\n  /**\n   * Updates the store's state based on the current state, with an optional command name.\n   * @param updateFn A function that updates the current state.\n   * @param commandName The name of the command associated with the state change.\n   */\n  public update(\n    updateFn: (currentState: TState) => TState,\n    commandName?: string\n  ): void {\n    this.commandPreprocessor?.forEach(p => p(this, commandName));\n\n    this._state.update(state => updateFn(state));\n\n    this.commandPostprocessor?.forEach(p => p(this, commandName));\n  }\n\n  /**\n   * Mutates the store's state using the provided mutator function, with an optional command name.\n   * @param mutator A function that mutates the current state.\n   * @param commandName The name of the command associated with the state mutation.\n   */\n  public mutate(\n    mutator: (currentState: TState) => void,\n    commandName?: string\n  ): void {\n    this.commandPreprocessor?.forEach(p => p(this, commandName));\n\n    this._state.update(state => {\n      const cloned = shallowClone(state);\n      mutator(cloned);\n      return cloned;\n    });\n\n    this.commandPostprocessor?.forEach(p => p(this, commandName));\n  }\n\n  /**\n   * Registers a handler for the specified event in the store's mediator.\n   * @param event The event to register the handler for.\n   * @param handler The handler function to be executed when the event is published.\n   */\n  public registerHandler<TPayload>(\n    event: StoreEvent<TPayload>,\n    handler: (store: this, event: StoreEvent<TPayload>) => void\n  ) {\n    register(rootRegistry, this, event, handler);\n  }\n\n  /**\n   * Unregister a handler for the specified event(s) in the store's mediator.\n   * @param event The event to remove the handler for.\n   * @param events Additional events to remove the handlers for.\n   */\n  public unregisterHandler(\n    event: StoreEvent<any>,\n    ...events: StoreEvent<any>[]\n  ): void;\n  public unregisterHandler(...events: StoreEvent<any>[]): void {\n    unregister(rootRegistry, this, ...events);\n  }\n\n  /**\n   * Runs an effect with the provided arguments and returns the result.\n   * The effect may be associated with the store itself but it may also be unrelated\n   * @typeparam TStore The types of the effect's target store.\n   * @typeparam TArgs The types of the effect's arguments.\n   * @typeparam TResult The type of the effect's result.\n   * @param effect The store effect to run.\n   * @param args The arguments to pass to the effect.\n   * @returns The result of the effect.\n   */\n  public runEffect<TArgs extends any[], TResult>(\n    effect: StoreEffect<this, TArgs, TResult>,\n    ...args: TArgs\n  ): TResult {\n    const invocationId = performance.now() + Math.random();\n    this.effectPreprocessor?.forEach(p => p(this, effect, invocationId));\n\n    const effectResult =\n      effect.config.withInjectionContext && this.config.injector\n        ? runInInjectionContext(this.config.injector, () =>\n            effect.func(this, ...args)\n          )\n        : effect.func(this, ...args);\n\n    return !this.effectPostprocessor\n      ? effectResult\n      : withSideEffect(effectResult, () => {\n          this.effectPostprocessor?.forEach(action =>\n            action(this, effect, effectResult, invocationId)\n          );\n        });\n  }\n\n  /**\n   * Runs a store query potentially targeting many differnt stores with the provided arguments and returns the result.\n   * @typeparam TResult The type of the query's result.\n   * @typeparam TStores The types of the stores used in the query.\n   * @typeparam TArgs The type of the query's arguments.\n   * @param storeQuery The store query to run.\n   * @param args The arguments to pass to the query.\n   * @returns The result of the query as computed signal.\n   */\n  public runQuery<\n    TResult,\n    TStores extends ProviderToken<any>[],\n    TArgs = undefined,\n  >(\n    storeQuery: StoreQuery<TResult, TStores, TArgs>,\n    ...args: TArgs extends undefined ? [] : [TArgs]\n  ): Signal<TResult> {\n    if (!this.config.injector) {\n      assertInInjectionContext(this.runQuery);\n    }\n\n    return runInInjectionContext(\n      this.config.injector ?? inject(Injector),\n      () => {\n        const queryArgs = [\n          ...(storeQuery.stores.map(x =>\n            x === this.constructor ? this : inject(x)\n          ) as {\n            [K in keyof TStores]: TStores[K] extends ProviderToken<infer U>\n              ? U\n              : never;\n          }),\n          ...(args as any[]),\n        ];\n\n        return computed(() => storeQuery.query(...(queryArgs as any)));\n      }\n    );\n  }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Store } from './store';\n\n/**\n * Configuration for a store effect.\n */\nexport interface StoreEffectConfig {\n  /**\n   * Indicates whether the effect requires an injection context. Defaults to true.\n   */\n  withInjectionContext?: boolean;\n\n  /**\n   * Indicates whether the effect sets loading status.\n   * Only applicable if the `StoreStatus` plugin is used.\n   * Defaults to false.\n   */\n  setLoadingStatus?: boolean;\n\n  /**\n   * Indicates whether the effect sets initialized status.\n   * Only applicable if the `StoreStatus` plugin is used.\n   * Defaults to false.\n   */\n  setInitializedStatus?: boolean;\n}\n\n/**\n * Represents an effect that can be executed on a store.\n */\nexport interface StoreEffect<\n  TStore extends Store<any>,\n  TArgs extends unknown[],\n  TResult,\n> {\n  name: string; // The name of the effect.\n  func: (store: TStore, ...args: TArgs) => TResult; // The function representing the effect.\n  config: Readonly<Required<StoreEffectConfig>>; // effect configuration\n}\n\n/**\n * Creates a new store effect with the provided name, function, and configuration.\n * @param name The name of the effect.\n * @param func The function representing the effect.\n * @param config Configuration options for the effect.\n * @returns A store effect object.\n */\nexport function createEffect<\n  TStore extends Store<any>,\n  TArgs extends any[],\n  TResult,\n>(\n  name: string,\n  func: (store: TStore, ...args: TArgs) => TResult,\n  config?: StoreEffectConfig\n): StoreEffect<TStore, TArgs, TResult>;\n\n/**\n * Implementation of the createEffect function.\n */\nexport function createEffect<\n  TStore extends Store<any>,\n  TArgs extends any[],\n  TResult,\n>(\n  name: string,\n  func: (store: TStore, ...args: TArgs) => TResult,\n  arg?: boolean | StoreEffectConfig\n): StoreEffect<TStore, TArgs, TResult> {\n  return {\n    name,\n    func,\n    config: {\n      withInjectionContext:\n        !arg || arg === true || (arg.withInjectionContext ?? true),\n      setLoadingStatus: (arg as StoreEffectConfig)?.setLoadingStatus ?? false,\n      setInitializedStatus:\n        (arg as StoreEffectConfig)?.setInitializedStatus ?? false,\n    },\n  };\n}\n","/**\n * Represents an event which may affect a store.\n */\nexport interface StoreEvent<TPayload> {\n  name: string; // The name of the event.\n  payload?: TPayload; // The payload associated with the event.\n}\n\n/**\n * Creates a store event blueprint with the provided name.\n * @param name The name of the event.\n * @returns A store event blueprint object.\n */\nexport function createEvent<TPayload = never>(\n  name: string\n): StoreEvent<TPayload> {\n  return { name };\n}\n","import { Store } from '../store';\nimport { ImmutableStoreConfig } from './immutable-store-config';\nimport { Immutable } from './immutable-type';\nimport { naiveCloneAndMutateFunc } from './immutable-utility';\n\n/**\n * Represents a store that holds an immutable state, allowing mutation through controlled operations.\n *\n * @typeparam TState The type of the immutable state held by the store.\n */\nexport class ImmutableStore<TState> extends Store<Immutable<TState>> {\n  private readonly cloneAndMutateFunc: (\n    currentState: TState,\n    mutation: (draftState: TState) => void\n  ) => TState;\n\n  public constructor(config: ImmutableStoreConfig<TState>) {\n    super(config);\n\n    this.cloneAndMutateFunc =\n      config.mutationProducerFn ?? naiveCloneAndMutateFunc;\n  }\n\n  /**\n   * Clones and mutates the store's state using the provided mutator function, with an optional command name.\n   * @param mutator A function that mutates the current state.\n   * @param commandName The name of the command associated with the state mutation.\n   */\n  public override mutate(\n    mutator: (currentState: TState) => void,\n    commandName?: string\n  ): void;\n  public override mutate(\n    mutator: (currentState: Immutable<TState>) => void,\n    commandName?: string\n  ): void;\n  public override mutate(\n    mutator:\n      | ((currentState: TState) => void)\n      | ((currentState: Immutable<TState>) => void),\n    commandName?: string\n  ): void {\n    this.update(\n      state =>\n        this.cloneAndMutateFunc(\n          state as TState,\n          mutator as (currentState: TState) => void\n        ) as Immutable<TState>,\n      commandName\n    );\n  }\n}\n","/**\n * Memoizes a function by caching its result and returning the cached result on subsequent calls.\n * @param fn - The function to be memoized.\n * @returns A memoized version of the input function.\n */\nexport function memoize<T>(fn: () => T): () => T {\n  let cachedResult: T | undefined;\n\n  return () => {\n    if (cachedResult === undefined) {\n      cachedResult = fn();\n    }\n    return cachedResult;\n  };\n}\n","import { memoize } from './memoize';\n\n/**\n * Creates a memoized function for feature detection.\n *\n * @param detectionFn - Function that performs the feature detection.\n * @returns Memoized function for feature detection.\n */\nfunction makeFeatureDetector(detectionFn: () => boolean) {\n  return memoize(() => {\n    try {\n      return detectionFn();\n    } catch {\n      return false;\n    }\n  });\n}\n\n/**\n * Feature detection for IndexedDB availability.\n */\nexport const isIndexedDbAvailable = /*@__PURE__*/ makeFeatureDetector(\n  () => !!indexedDB\n);\n\n/**\n * Feature detection for Local Storage availability.\n */\nexport const isLocalStorageAvailable = /*@__PURE__*/ makeFeatureDetector(\n  () => !!localStorage\n);\n\n/**\n * Feature detection for Session Storage availability.\n */\nexport const isSessionStorageAvailable = /*@__PURE__*/ makeFeatureDetector(\n  () => !!sessionStorage\n);\n\n/**\n * Feature detection for Redux DevTools availability.\n */\nexport const isDevtoolsAvailable = /*@__PURE__*/ makeFeatureDetector(\n  () => window && '__REDUX_DEVTOOLS_EXTENSION__' in window\n);\n\n/**\n * Feature detection for setTimeout availability.\n */\nexport const isSetTimeoutAvailable = /*@__PURE__*/ makeFeatureDetector(\n  () => !!setTimeout\n);\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Signal, WritableSignal, computed, signal } from '@angular/core';\nimport { Store } from './store';\nimport { ImmutableStore } from './store-immutability/immutable-store';\nimport { isSetTimeoutAvailable } from './utility/feature-detection';\n\ntype HistorySingleItem = {\n  command: string;\n  store: WeakRef<Store<any>>;\n  before: any;\n};\n\ntype HistoryItemGroup = {\n  command: string;\n  before: WeakMap<Store<any>, any>;\n};\n\ntype HistoryUndoItem = (HistorySingleItem | HistoryItemGroup) & {\n  undoneCommandIndex: number;\n};\n\ntype HistoryRedoItem = (HistorySingleItem | HistoryItemGroup) & {\n  redoneCommandIndex: number;\n};\n\ntype HistoryItem =\n  | HistorySingleItem\n  | HistoryItemGroup\n  | HistoryUndoItem\n  | HistoryRedoItem;\n\ntype History = HistoryItem[];\n\n/**\n * Type guard to check if an item is a undo item.\n * @param item The item to be checked.\n */\nfunction isHistoryUndoItem(\n  item: HistoryItem | undefined\n): item is HistoryUndoItem {\n  return !!item && 'undoneCommandIndex' in item;\n}\n\n/**\n * Type guard to check if an item is a redo item.\n * @param item The item to be checked.\n */\nfunction isHistoryRedoItem(\n  item: HistoryItem | undefined\n): item is HistoryRedoItem {\n  return !!item && 'redoneCommandIndex' in item;\n}\n\n/**\n * Creates a tracker which immediately tracks the history of the specifiedd stores.\n * @param maxLength Maximum number of commands to retain in the history.\n * @param store Initial store to be tracked in the history.\n * @param stores Additional stores to be tracked in the history.\n * @returns An instance of `HistoryTracker`.\n *\n * @remark At least one store has to be specifieid\n */\nexport function trackHistory(\n  maxLength: number,\n  store: ImmutableStore<any>,\n  ...stores: ImmutableStore<any>[]\n): HistoryTracker {\n  stores ??= [];\n  stores.push(store);\n  return new HistoryTrackerBase(\n    new Set(stores.map(x => new WeakRef(x))),\n    maxLength\n  );\n}\n\n/**\n * Hhistory tracker for tracking history of a finite set of stores enabling undo and redo functionality.\n */\nexport interface HistoryTracker {\n  /**\n   * Signal indicating whether undo operation is available.\n   */\n  canUndo: Signal<boolean>;\n\n  /**\n   * Signal indicating whether redo operation is available.\n   */\n  canRedo: Signal<boolean>;\n\n  /**\n   * History of commands performed.\n   */\n  getHistory: () => {\n    /**\n     * Name of the executed command or transaction tag.\n     */\n    command: string;\n    /**\n     * Array containing stores and their corresponding state values before the command was executed.\n     * Each element is a tuple [store, storeState].\n     */\n    before: [Store<any> | undefined, any][];\n  }[];\n\n  /**\n   * Destroys the history tracker, cleaning up any resources.\n   */\n  destroy: () => void;\n\n  /**\n   * Begins a new transaction in the history tracker.\n   * @param tag Optional tag to identify the transaction (only used for pretty printing).\n   */\n  beginTransaction: (tag?: string) => void;\n\n  /**\n   * Ends the current transaction in the history tracker.\n   */\n  endTransaction: () => void;\n\n  /**\n   * Undoes the last command or a group of commands if in a transaction.\n   * @returns True if the undo operation was successful, false otherwise.\n   */\n  undo: () => boolean;\n\n  /**\n   * Redoes the last undone command or a group of commands (if last undone action was a transaction).\n   * @returns True if the redo operation was successful, false otherwise.\n   */\n  redo: () => boolean;\n}\n\nconst PRUNE_FRACTION = 0.25;\nconst UNDO_COMMAND = '_UNDO_';\nconst REDO_COMMAND = '_REDO_';\nconst UNSPECIFIED_COMMAND = 'Unspecified';\n\nclass HistoryTrackerBase implements HistoryTracker {\n  private readonly stores: Set<WeakRef<Store<any>>>;\n  private readonly pool: WeakMap<Store<any>, WeakRef<Store<any>>>;\n  private readonly lastCommand: WritableSignal<HistoryItem | undefined>;\n  private readonly maxLength: number;\n  private readonly _history: History;\n  private readonly addToHistoryRef = this.addToHistory.bind(this);\n\n  private activeTransactions: number;\n\n  constructor(stores: Set<WeakRef<Store<any>>>, maxLength: number) {\n    this.stores = stores;\n    this.maxLength = Math.floor(maxLength * (1 + PRUNE_FRACTION));\n    this.pool = new WeakMap<Store<any>, WeakRef<Store<any>>>();\n    this._history = [];\n    this.activeTransactions = 0;\n    this.lastCommand = signal(undefined);\n\n    this.foreachStore(store => {\n      if (store instanceof ImmutableStore) {\n        (store['commandPreprocessor'] as any) ??= [];\n        store['commandPreprocessor']!.push(this.addToHistoryRef);\n        this.pool.set(store, new WeakRef(store));\n      } else {\n        throw new Error(\n          `${store.name} is not immutable: HistoryTracker does only support ImmutableStores`\n        );\n      }\n    });\n  }\n\n  private foreachStore(callbackFn: (store: Store<unknown>) => void) {\n    this.stores.forEach(storeRef => {\n      const store = storeRef.deref();\n      if (store) {\n        callbackFn(store);\n      } else {\n        this.stores.delete(storeRef);\n      }\n    });\n  }\n\n  private pushToHistory(historyItem: HistoryItem) {\n    this._history.push(historyItem);\n    this.lastCommand.set(historyItem);\n\n    if (this._history.length > this.maxLength) {\n      if (isSetTimeoutAvailable()) {\n        setTimeout(this.prune.bind(this), 0);\n      } else {\n        this.prune();\n      }\n    }\n  }\n\n  private popFromHistory() {\n    const poped = this._history.pop();\n    this.lastCommand.set(this._history[this._history.length - 1]);\n    return poped;\n  }\n\n  private addToHistory<TState>(\n    store: Store<TState>,\n    command: string | undefined\n  ) {\n    if (\n      this.activeTransactions === 0 &&\n      command !== UNDO_COMMAND &&\n      command !== REDO_COMMAND\n    ) {\n      this.pushToHistory({\n        command: command ?? UNSPECIFIED_COMMAND,\n        before: store.state(),\n        store: this.pool.get(store) ?? new WeakRef(store),\n      });\n    }\n  }\n\n  private collectCurrentStates() {\n    const values = new WeakMap<Store<any>, any>();\n    this.foreachStore(store => values.set(store, store.state()));\n    return values;\n  }\n\n  private getCommandToUndo(): [number, HistoryItem | undefined] {\n    let toBeUndoneCommandIndex = this._history.length - 1;\n    let toBeUndoneCommand = this.lastCommand();\n\n    while (\n      toBeUndoneCommandIndex >= 0 &&\n      isHistoryUndoItem(toBeUndoneCommand)\n    ) {\n      toBeUndoneCommandIndex = toBeUndoneCommand.undoneCommandIndex - 1;\n      toBeUndoneCommand =\n        toBeUndoneCommandIndex >= 0\n          ? this._history[toBeUndoneCommandIndex]\n          : undefined;\n    }\n\n    return toBeUndoneCommandIndex >= 0\n      ? [toBeUndoneCommandIndex, toBeUndoneCommand]\n      : [-1, undefined];\n  }\n\n  private getCommandToRedo(): [number, HistoryItem | undefined] {\n    let toBeRedoneCommandIndex = this._history.length - 1;\n    let toBeRedoneCommand = this.lastCommand();\n\n    while (\n      toBeRedoneCommandIndex >= 0 &&\n      isHistoryRedoItem(toBeRedoneCommand)\n    ) {\n      toBeRedoneCommandIndex = toBeRedoneCommand.redoneCommandIndex - 1;\n      toBeRedoneCommand =\n        toBeRedoneCommandIndex >= 0\n          ? this._history[toBeRedoneCommandIndex]\n          : undefined;\n    }\n\n    return toBeRedoneCommandIndex >= 0 && isHistoryUndoItem(toBeRedoneCommand)\n      ? [toBeRedoneCommandIndex, toBeRedoneCommand]\n      : [-1, undefined];\n  }\n\n  private prune(): void {\n    const deleteCount = Math.floor(this._history.length * PRUNE_FRACTION);\n\n    if (deleteCount > 0) {\n      this._history.splice(0, deleteCount);\n\n      this._history.forEach(command => {\n        if (isHistoryRedoItem(command)) {\n          command.redoneCommandIndex -= deleteCount;\n        } else if (isHistoryUndoItem(command)) {\n          command.undoneCommandIndex -= deleteCount;\n        }\n      });\n    }\n  }\n\n  get canUndo() {\n    return computed(\n      () => !!this.lastCommand() && this.getCommandToUndo()[0] >= 0\n    );\n  }\n\n  get canRedo() {\n    return computed(\n      () =>\n        !!this.lastCommand() &&\n        this.activeTransactions === 0 &&\n        this.getCommandToRedo()[0] >= 0\n    );\n  }\n\n  getHistory() {\n    const scopedStores = Array.from(this.stores);\n    return this._history.map(x => {\n      const stores = 'store' in x ? [x.store] : scopedStores;\n\n      const before = stores.map(storeRef => {\n        const store = storeRef.deref();\n        return [\n          store,\n          x.before instanceof WeakMap\n            ? store\n              ? x.before.get(store)\n              : undefined\n            : x.before,\n        ] as [Store<any> | undefined, any];\n      });\n\n      return {\n        command: x.command,\n        before,\n      };\n    });\n  }\n\n  destroy() {\n    this.foreachStore(store => {\n      if (store instanceof ImmutableStore) {\n        const trackerRefIndex = store['commandPreprocessor']?.indexOf(\n          this.addToHistoryRef\n        );\n        if (trackerRefIndex !== undefined && trackerRefIndex > -1) {\n          store['commandPreprocessor']!.splice(trackerRefIndex, 1);\n        }\n      }\n    });\n  }\n\n  beginTransaction(tag?: string) {\n    if (this.activeTransactions === 0) {\n      this.pushToHistory({\n        command: tag ?? UNSPECIFIED_COMMAND,\n        before: this.collectCurrentStates(),\n      });\n    }\n\n    this.activeTransactions++;\n  }\n\n  endTransaction() {\n    if (this.activeTransactions > 0) {\n      this.activeTransactions--;\n    }\n  }\n\n  undo(): boolean {\n    if (this.activeTransactions > 0) {\n      const toBeUndone = this.popFromHistory();\n      if (toBeUndone && toBeUndone.before instanceof WeakMap) {\n        this.foreachStore(store =>\n          store.set(toBeUndone.before.get(store), UNDO_COMMAND)\n        );\n      }\n\n      this.activeTransactions = 0;\n      return true;\n    }\n\n    const [toBeUndoneCommandIndex, toBeUndoneCommand] = this.getCommandToUndo();\n\n    if (toBeUndoneCommand) {\n      const newState = toBeUndoneCommand.before;\n\n      if (newState instanceof WeakMap) {\n        this.pushToHistory({\n          command: UNDO_COMMAND,\n          before: this.collectCurrentStates(),\n          undoneCommandIndex: toBeUndoneCommandIndex,\n        });\n        this.foreachStore(store =>\n          store.set(newState.get(store), UNDO_COMMAND)\n        );\n      } else if ('store' in toBeUndoneCommand) {\n        const store = toBeUndoneCommand.store.deref();\n        if (store) {\n          this.pushToHistory({\n            command: UNDO_COMMAND,\n            store: toBeUndoneCommand.store,\n            before: store.state(),\n            undoneCommandIndex: toBeUndoneCommandIndex,\n          });\n          store.set(newState, UNDO_COMMAND);\n        }\n      }\n\n      return true;\n    }\n\n    return false;\n  }\n\n  redo(): boolean {\n    if (this.activeTransactions > 0) {\n      return false;\n    }\n\n    const [toBeRedoneCommandIndex, toBeRedoneCommand] = this.getCommandToRedo();\n\n    if (toBeRedoneCommand) {\n      const newState = toBeRedoneCommand.before;\n      if (newState instanceof WeakMap) {\n        this.pushToHistory({\n          command: REDO_COMMAND,\n          before: this.collectCurrentStates(),\n          redoneCommandIndex: toBeRedoneCommandIndex,\n        });\n        this.foreachStore(store =>\n          store.set(newState.get(store), REDO_COMMAND)\n        );\n      } else if ('store' in toBeRedoneCommand) {\n        const store = toBeRedoneCommand.store.deref();\n        if (store) {\n          this.pushToHistory({\n            command: REDO_COMMAND,\n            store: toBeRedoneCommand.store,\n            before: store.state(),\n            redoneCommandIndex: toBeRedoneCommandIndex,\n          });\n          store.set(newState, REDO_COMMAND);\n        }\n      }\n\n      return true;\n    }\n\n    return false;\n  }\n}\n","/**\n * Deeply freezes an object and its properties, making it immutable at runtime.\n * @template T - The type of the object.\n * @param {T} obj - The object to be deeply frozen.\n * @returns {T} The deeply frozen object.\n */\nexport function deepFreeze<T>(obj: T): T {\n  if (obj) {\n    Object.freeze(obj);\n\n    const oIsFunction = typeof obj === 'function';\n    const hasOwnProp = Object.prototype.hasOwnProperty;\n\n    Object.getOwnPropertyNames(obj).forEach(function (prop: string) {\n      if (\n        hasOwnProp.call(obj, prop) &&\n        (oIsFunction\n          ? prop !== 'caller' && prop !== 'callee' && prop !== 'arguments'\n          : true)\n      ) {\n        const propValue = obj[prop as keyof T];\n        if (\n          propValue !== null &&\n          (typeof propValue === 'object' || typeof propValue === 'function') &&\n          !Object.isFrozen(propValue)\n        ) {\n          deepFreeze(propValue);\n        }\n      }\n    });\n  }\n\n  return obj;\n}\n","import { StorePlugin } from '../store-plugin';\nimport { deepFreeze } from './deep-freeze';\n\n/**\n * Enables Storeplugin that deep freezes the state after each command\n * This middleware introduces some overhead\n *\n * @returns DeepFreeze Storeplugin.\n */\nexport function useDeepFreeze(): StorePlugin {\n  return {\n    postprocessCommand(store) {\n      deepFreeze(store.state());\n    },\n  };\n}\n","import { Store } from '../store';\nimport { StorePlugin } from '../store-plugin';\nimport { isDevtoolsAvailable } from '../utility/feature-detection';\n\n/**\n * Represents a Redux action.\n */\ntype Action = { type: string };\n\n/**\n * Options for configuring the Redux DevTools extension.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface DevtoolsOptions {\n  // At the moment, no support for custom Enhancer options for Redux DevTools\n}\n\n/**\n * Represents a message sent to the Redux DevTools extension.\n */\ninterface DevtoolsMessage {\n  type: string;\n  payload: { type: string };\n  state: string;\n}\n\n/**\n * Represents the Redux DevTools extension interface.\n */\ninterface Devtools {\n  send(\n    data: { type: string } & Record<string, unknown>,\n    state: Record<string, never>\n  ): void;\n  init(state: Record<string, never>): void;\n  unsubscribe(): void;\n  subscribe(cb: (message: DevtoolsMessage) => void): () => void;\n}\n\n/**\n * Augments the global Window interface to include Redux DevTools extension functionality.\n */\ndeclare global {\n  interface Window {\n    __REDUX_DEVTOOLS_EXTENSION__: {\n      connect(options: DevtoolsOptions): Devtools;\n    };\n  }\n}\n\n/**\n * Registry for store with attached redux devtools monitoring\n * It maps the store name to a Weak reference of the store\n */\nexport const registry = new Map<string, WeakRef<Store<unknown>>>();\n\n/**\n * Retrieves a store from the registry by name.\n * @param name Name of the store.\n * @returns The store, if found.\n */\nfunction getStore(name: string): Store<unknown> | undefined {\n  return registry.get(name)?.deref();\n}\n\n/**\n * The DevTools extension instance.\n */\nlet devtools: Devtools | undefined;\n\n/**\n * Initializes the Redux DevTools extension.\n * @param options DevTools options.\n */\nfunction initDevtools(options: DevtoolsOptions = {}): void {\n  devtools = window.__REDUX_DEVTOOLS_EXTENSION__.connect(options);\n  devtools.subscribe(handleDevtoolsMessage);\n}\n\n/**\n * Scavenges and retrieves a snapshot of registered stores.\n * @returns Snapshot of registered stores.\n * @modifies registry - Deletes references to garbage collected stores\n */\nfunction scavengeAndGetStoresSnapshot<T extends Record<string, unknown>>(): T {\n  const stores: T = {} as T;\n\n  registry.forEach((storeRef, name) => {\n    const store = storeRef.deref();\n    if (store) {\n      stores[store.name as keyof T] = store.state() as T[keyof T];\n    } else {\n      registry.delete(name);\n      sendToDevtools({ type: `[${name}] - @Removal` });\n    }\n  });\n\n  return stores;\n}\n\n/**\n * Sends an action to the Redux DevTools extension.\n * @param action Action to send.\n */\nexport function sendToDevtools(action: Action): void {\n  devtools?.send(action, scavengeAndGetStoresSnapshot());\n}\n\n/**\n * Handles messages received from the Redux DevTools extension.\n * @param message DevTools message.\n */\nfunction handleDevtoolsMessage(message: DevtoolsMessage): void {\n  if (devtools) {\n    if (message.type === 'DISPATCH') {\n      const payloadType = message.payload.type;\n\n      if (payloadType === 'COMMIT') {\n        devtools.init(scavengeAndGetStoresSnapshot());\n        return;\n      }\n\n      if (payloadType === 'JUMP_TO_STATE' || payloadType === 'JUMP_TO_ACTION') {\n        const state = JSON.parse(message.state);\n\n        for (const [name, value] of Object.entries(state)) {\n          const store = getStore(name);\n          if (store) {\n            store['_state'].set(value);\n          }\n        }\n      }\n    }\n  }\n}\n\n/**\n * Registers a store for Devtools monitoring.\n *\n * @param store - Store to be registered.\n */\nexport function registerForDevtools<TStore extends Store<unknown>>(\n  store: TStore\n) {\n  if (!devtools) {\n    initDevtools({});\n  }\n  registry.set(store.name, new WeakRef(store));\n  sendToDevtools({ type: `[${store.name}] - @Init` });\n}\n\n/**\n * Removes a store from Devtools monitoring.\n *\n * @param store - Store to be removed.\n */\nexport function removeFromDevtools<TStore extends Store<unknown>>(\n  store: TStore\n) {\n  registry.delete(store.name);\n  sendToDevtools({ type: `[${store.name}] - @Removal` });\n}\n\n/**\n * Enables Storeplugin that links the store activity with the Redux DevTools extension.\n * @returns Devtools Storeplugin\n */\nexport function useDevtools(): StorePlugin {\n  if (!isDevtoolsAvailable()) {\n    return {};\n  }\n\n  return {\n    init(store) {\n      registerForDevtools(store);\n    },\n    postprocessCommand(store, command) {\n      sendToDevtools({\n        type: `[${store.name}] - ${command ?? 'Command'}`,\n      });\n    },\n  };\n}\n","import { StorePlugin } from '../store-plugin';\n\n/**\n * Represents a logger function that can be used for logging messages.\n * @param message - The message to be logged.\n * @param optionalParams - Optional parameters to include in the log.\n */\nexport type Logger = (message?: unknown, ...optionalParams: unknown[]) => void;\n\n/**\n * Options for configuring the Store Logger Plugin.\n */\nexport interface StoreLoggerPluginOptions {\n  /**\n   * Log Function for logging commands and effects. Defaults to `console.log`\n   */\n  logFunction?: Logger;\n}\n\n/**\n * Enables StorePlugin that logs command and effect execution\n * @returns A StorePlugin instance for logging.\n */\nexport function useLogger(\n  options: StoreLoggerPluginOptions = {}\n): StorePlugin & { log: Logger; name: string } {\n  const plugin: StorePlugin & { log: Logger; name: string } = {\n    name: 'StoreLogger',\n    log: options.logFunction ?? console.log,\n  };\n\n  plugin.init = store => plugin.log(`[${store.name}->Init]`, store.state());\n  plugin.postprocessCommand = (store, command) =>\n    plugin.log(\n      `[${store.name}->Command] ${command ?? 'Unspecified'}`,\n      store.state()\n    );\n  plugin.preprocessEffect = (store, effect) =>\n    plugin.log(\n      `[${store.name}->Effect STARTED] ${effect.name ?? 'Unspecified'}`,\n      store.state()\n    );\n  plugin.postprocessEffect = (store, effect, _, invocationId) =>\n    plugin.log(\n      `[${store.name}->Effect FINNISHED in ${Math.floor(\n        performance.now() - invocationId\n      )} ms] ${effect.name ?? 'Unspecified'}`,\n      store.state()\n    );\n\n  return plugin;\n}\n","/**\n * PerformanceCounter class is used to measure and analyze the performance of a process.\n */\nexport class PerformanceCounter {\n  private count = 0;\n  private totalDurationMs = 0;\n  private maxDurationMs = 0;\n  private sumSquares = 0;\n\n  private currentTimer: number | null = null;\n\n  /**\n   * Indicates whether the timer is currently running.\n   */\n  public get isRunning() {\n    return !!this.currentTimer;\n  }\n\n  /**\n   * Adds the specified duration to the counter, updating relevant statistics.\n   * @param duration - The duration to be added in milliseconds.\n   */\n  public addDuration(duration: number): void {\n    this.count++;\n    this.totalDurationMs += duration;\n    this.maxDurationMs = Math.max(this.maxDurationMs, duration);\n    this.sumSquares += duration * duration;\n  }\n\n  /**\n   * Starts the timer, recording the current timestamp.\n   */\n  public startTimer(): void {\n    this.currentTimer = performance.now();\n  }\n\n  /**\n   * Stops the timer, calculates the duration, and adds it to the counter.\n   */\n  public stopTimer(): void {\n    const duration = performance.now() - this.currentTimer!;\n    this.addDuration(duration);\n    this.currentTimer = null;\n  }\n\n  /**\n   * Toggles the timer between start and stop states.\n   */\n  public toggleTimer(): void {\n    if (this.isRunning) {\n      this.stopTimer();\n    } else {\n      this.startTimer();\n    }\n  }\n\n  /**\n   * Calculates and returns the average duration based on the recorded intervals.\n   * @returns The average duration in milliseconds.\n   */\n  private getAverageDuration(): number {\n    return this.count === 0 ? 0 : this.totalDurationMs / this.count;\n  }\n\n  /**\n   * Calculates and returns the standard deviation of durations.\n   * @returns The standard deviation\n   */\n  private getStandardDeviation(): number {\n    if (this.count === 0) {\n      return 0;\n    }\n\n    const count = this.count;\n    const meanSquared = (this.totalDurationMs / count) ** 2;\n    const variance = (this.sumSquares - meanSquared * count) / count;\n\n    return Math.sqrt(variance);\n  }\n\n  /**\n   * Generates and returns a performance report with various statistics.\n   * @returns An object containing performance statistics.\n   */\n  public getReport() {\n    return {\n      count: this.count,\n      maxDurationMs: this.maxDurationMs,\n      averageDurationMs: this.getAverageDuration(),\n      standardDeviation: this.getStandardDeviation(),\n    };\n  }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { StorePlugin } from '../store-plugin';\nimport { registry } from '../store-plugin-devtools/plugin-devtools';\nimport { isDevtoolsAvailable } from '../utility/feature-detection';\nimport { PerformanceCounter } from './performance-counter';\n\n/**\n * Represents a counter associated with a specific store, tracking command execution metrics.\n */\ntype StoreCounter = {\n  name: string;\n  store: string;\n  counter: PerformanceCounter;\n};\n\n// Counters\nconst globalCommandCounter: PerformanceCounter =\n  /*@__PURE__*/ new PerformanceCounter();\nconst globalEffectCounter: PerformanceCounter =\n  /*@__PURE__*/ new PerformanceCounter();\nconst commandCounters: StoreCounter[] = [];\nconst effectCounters: StoreCounter[] = [];\n\n/**\n * Toggles the timer for a specific command, updating the associated counter.\n * @param store - The name of the store.\n * @param command - The name of the command.\n */\nfunction toggleCommandTimer(store: string, command?: string) {\n  const commandName = command ?? 'Unspecified';\n  const counterRegistration = commandCounters.find(\n    c => c.store === store && c.name === commandName\n  );\n  const counter = counterRegistration?.counter ?? new PerformanceCounter();\n\n  if (!counterRegistration) {\n    commandCounters.push({\n      name: commandName,\n      store,\n      counter,\n    });\n  }\n\n  counter.toggleTimer();\n}\n\n/**\n * Adds the duration of an effect to the associated counter.\n * @param store - The name of the store.\n * @param effect - The name of the effect.\n * @param duration - The duration of the effect execution.\n */\nfunction addEffectDuration(\n  store: string,\n  effect: string | undefined,\n  duration: number\n) {\n  const effectName = effect ?? 'Unspecified';\n  const counterRegistration = effectCounters.find(\n    e => e.store === store && e.name === effectName\n  );\n  const counter = counterRegistration?.counter ?? new PerformanceCounter();\n\n  if (!counterRegistration) {\n    effectCounters.push({\n      name: effectName,\n      store,\n      counter,\n    });\n  }\n\n  counter.addDuration(duration);\n}\n\n/**\n * Generates and returns a performance report with various metrics.\n * @returns An object containing performance statistics.\n */\nexport function getReport() {\n  const globalCommandReport = globalCommandCounter.getReport();\n  const globalEffectReport = globalEffectCounter.getReport();\n  return {\n    totalCommandCount: globalCommandReport.count,\n    averageCommandDurationMs: globalCommandReport.averageDurationMs,\n    commandDurationStandartDeviation: globalCommandReport.standardDeviation,\n    totalEffectCount: globalEffectReport.count,\n    averageEffectDurationMs: globalEffectReport.averageDurationMs,\n    effectDurationStandartDeviation: globalEffectReport.standardDeviation,\n    commands: commandCounters\n      .map(c => ({\n        name: c.name,\n        store: c.store,\n        ...c.counter.getReport(),\n      }))\n      .sort((a, b) => b.averageDurationMs - a.averageDurationMs),\n    effects: effectCounters\n      .map(e => ({\n        name: e.name,\n        store: e.store,\n        ...e.counter.getReport(),\n      }))\n      .sort((a, b) => b.averageDurationMs - a.averageDurationMs),\n  };\n}\n\n/**\n * Store-Like object for registering the performance counters in redux devtools\n */\nconst counterStore = {\n  name: '@signalstory/performance-counter',\n  state() {\n    return getReport();\n  },\n};\n\n/**\n * Returns a StorePlugin that includes initialization and hooks for tracking command and effect performance.\n * @returns The StorePlugin for performance tracking.\n */\nexport function usePerformanceCounter(): StorePlugin {\n  return {\n    precedence: 11, // should come early in initialization\n    init() {\n      if (isDevtoolsAvailable() && !registry.has(counterStore.name)) {\n        registry.set(counterStore.name, new WeakRef(counterStore) as any);\n      }\n    },\n    preprocessCommand(store, command) {\n      globalCommandCounter.toggleTimer();\n      toggleCommandTimer(store.name, command);\n    },\n    postprocessCommand(store, command) {\n      globalCommandCounter.toggleTimer();\n      toggleCommandTimer(store.name, command);\n    },\n    postprocessEffect(store, effect, _, invocationId) {\n      const duration = Math.floor(performance.now() - invocationId);\n      globalEffectCounter.addDuration(duration);\n      addEffectDuration(store.name, effect.name, duration);\n    },\n  };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Immutable } from '../../store-immutability/immutable-type';\n\ntype ObjectStoreMigration = (oldVersion: number, oldState: unknown) => unknown;\ntype DbUpdateOperation = ObjectStoreMigration | 'CLEAR' | 'DROP' | undefined;\ntype DbMigration = [string, DbUpdateOperation | IndexedDbStoreMigrator][];\ntype DbMigrationRegistration = {\n  dbVersion: number;\n  migrations: DbMigration;\n};\n\n/**\n * Class for configuring indexedb object stores and their corresponding miggrations\n */\nclass IndexedDbStoreMigrator {\n  private readonly migrations: DbMigration = [];\n\n  /**\n   * Creates an object store if it does not exist\n   * @param objectStoreName - The name of the object store\n   * @returns The IndexedDbStoreRegistrator instance for chaining\n   */\n  createStore(objectStoreName: string) {\n    this.migrations.push([objectStoreName, undefined]);\n    return this;\n  }\n\n  /**\n   * Creates an object store if it does not exist.\n   * If it does exists, the current object store value is cleared\n   * @param objectStoreName - The name of the object store\n   * @returns The IndexedDbStoreRegistrator instance for chaining\n   */\n  createStoreOrClearState(objectStoreName: string) {\n    this.migrations.push([objectStoreName, 'CLEAR']);\n    return this;\n  }\n\n  /**\n   * Creates an object store if it does not exist.\n   * If it does exists, the current object store value can be transformed using the passed transformation function\n   * @param objectStoreName - The name of the object store\n   * @param transformation - Custom transformation function for update\n   * @returns The IndexedDbStoreRegistrator instance for chaining\n   */\n  createStoreOrTransform(\n    objectStoreName: string,\n    transformation: (oldVersion: number, oldState: unknown) => any\n  ) {\n    this.migrations.push([objectStoreName, transformation]);\n    return this;\n  }\n\n  /**\n   * Creates an object store if it does not exist.\n   * If it does exists, the current object store value can be transformed using the passed transformation function\n   * @param objectStoreName - The name of the object store\n   * @param transformation - Custom transformation function for update\n   * @returns The IndexedDbStoreRegistrator instance for chaining\n   */\n  createStoreOrMigrateRecords(\n    objectStoreName: string,\n    migration: (records: IndexedDbStoreMigrator) => IndexedDbStoreMigrator\n  ) {\n    const recordMigration = migration(new IndexedDbStoreMigrator());\n    this.migrations.push([objectStoreName, recordMigration]);\n    return this;\n  }\n\n  /**\n   * Deletes the object store if it does exist.\n   * @param objectStoreName - The name of the object store\n   * @returns The IndexedDbStoreRegistrator instance for chaining\n   */\n  dropStore(objectStoreName: string) {\n    this.migrations.push([objectStoreName, 'DROP']);\n    return this;\n  }\n\n  /**\n   * Get all registrations\n   */\n  getMigrations(): Immutable<DbMigration> {\n    return this.migrations;\n  }\n}\n\n/**\n * Registered indexedDB migrations per databasename\n */\nconst idbMigrations = new Map<string, Immutable<DbMigrationRegistration>>();\n\n/**\n * Retrieves the registered migration for a specific IndexedDB database.\n * @param dbName - The name of the IndexedDB database.\n * @returns The registered migration or undefined if not found.\n */\nexport function getRegisteredMigration(dbName: string) {\n  return idbMigrations.get(dbName);\n}\n\n/**\n * Redeems the migration for a specific IndexedDB database.\n * @param dbName - The name of the IndexedDB database.\n * @param dbVersion - Optional parameter specifying the database version.\n * @returns A function to handle the IDBVersionChangeEvent or undefined if the migration is not found.\n * @throws Error if attempting to open a connection with a version different from the registered migration.\n */\nexport function redeemMigration(dbName: string, dbVersion?: number) {\n  const migration = idbMigrations.get(dbName);\n  if (!migration) {\n    return undefined;\n  }\n\n  if (dbVersion && dbVersion !== migration.dbVersion) {\n    throw new Error(\n      `getMigrationForDb: Attempted to open a connection to IndexedDb ${dbName} with the version ${dbVersion}, but a migration for the version ${migration.dbVersion} has been specified. Please use only one version for a specific db.`\n    );\n  }\n\n  idbMigrations.delete(dbName);\n\n  return (event: IDBVersionChangeEvent) => {\n    const target = event.target as IDBRequest;\n    const db = target.result;\n    const transaction = target.transaction!;\n    const oldVersion = event.oldVersion;\n\n    migration.migrations.forEach(([store, op]) => {\n      if (!db.objectStoreNames.contains(store)) {\n        if (op !== 'DROP') {\n          db.createObjectStore(store);\n        }\n      } else if (op) {\n        if (op === 'DROP') {\n          db.deleteObjectStore(store);\n        } else {\n          const objectStore = transaction.objectStore(store);\n          if (op === 'CLEAR') {\n            objectStore.clear();\n          } else {\n            if (op instanceof IndexedDbStoreMigrator) {\n              // Migrate records of objectStore (one-objectstore-for-mulitple-stores approach)\n              op.getMigrations().forEach(([recordName, recordOp]) => {\n                objectStore.get(recordName).onsuccess = (event: any) => {\n                  if (recordOp === 'DROP') {\n                    objectStore.delete(recordName);\n                  } else if (recordOp === 'CLEAR') {\n                    objectStore.put(undefined, recordName);\n                  } else if (typeof recordOp === 'function') {\n                    const existingData = event.target.result;\n                    if (existingData) {\n                      const newData = recordOp(oldVersion, existingData);\n                      objectStore.put(newData, recordName);\n                    }\n                  }\n                };\n              });\n            } else if (typeof op === 'function') {\n              // Migrate objectStore\n              objectStore.openCursor().onsuccess = (event: any) => {\n                const cursor = event.target.result;\n                if (cursor) {\n                  const existingData = cursor.value;\n                  const newData = op(oldVersion, existingData);\n                  objectStore.put(newData, cursor.primaryKey);\n                }\n              };\n            }\n          }\n        }\n      }\n    });\n  };\n}\n\n/**\n * Configures the IndexedDB with specified store registrations and database migration.\n * @param dbName - The name of the IndexedDB database.\n * @param dbVersion - The version of the IndexedDB database.\n * @param migration - A function defining store registrations and migration operations.\n * @remarks Migrations are registered lazily and applied upon the first use of the database.\n * @throws Throws an error if no stores are registered for migration.\n * @throws Throws an error if a migration for the specified database already exists.\n */\nexport function migrateIndexedDb(\n  dbName: string,\n  dbVersion: number,\n  migration: (model: IndexedDbStoreMigrator) => IndexedDbStoreMigrator\n) {\n  const migrations = migration(new IndexedDbStoreMigrator()).getMigrations();\n\n  if (!migrations || migrations.length === 0) {\n    throw new Error('migrateIndexedDb: Please register at least one Store');\n  }\n\n  if (idbMigrations.has(dbName)) {\n    throw new Error(\n      `migrateIndexedDb: A migration for ${dbName} has already been specified`\n    );\n  }\n\n  idbMigrations.set(dbName, {\n    dbVersion,\n    migrations,\n  });\n}\n","import { BehaviorSubject, Observable } from 'rxjs';\nimport { getRegisteredMigration, redeemMigration } from './idb-migration';\n\n/**\n * Represents possible states of an IndexedDB pool entry.\n */\ntype IndexedDbPoolEntryState =\n  | undefined\n  | 'InitError'\n  | 'Blocked'\n  | IDBDatabase;\n\n/**\n * Type guard for IDBDatabase based on IndexedDbPoolEntryState.\n * @param entry The IndexedDB pool entry to be checked.\n * @returns True if the entry is an IDBDatabase, false otherwise.\n */\nexport function isIDBDatabase(\n  entry: IndexedDbPoolEntryState\n): entry is IDBDatabase {\n  return typeof entry === 'object' && 'name' in IDBDatabase;\n}\n\n/**\n * Represents a mapping of database names to their corresponding cached IndexedDB pool entries.\n */\nconst dbPool = new Map<string, IndexedDbPoolEntry>();\n\n/**\n * Represents an entry in the IndexedDB pool.\n */\nclass IndexedDbPoolEntry {\n  private readonly _db = new BehaviorSubject<IndexedDbPoolEntryState>(\n    undefined\n  );\n\n  public constructor(\n    public readonly dbName: string,\n    public readonly dbVersion: number\n  ) {}\n\n  get db() {\n    return this._db.asObservable();\n  }\n\n  updateEntryState(dbState: IndexedDbPoolEntryState) {\n    this._db.next(dbState);\n  }\n}\n\n/**\n * Retrieves an existing or opens a new connection to an IndexedDB.\n * @param dbName - The name of the database.\n * @param dbVersion - The version of the database.\n * @param migration - A callback function to perform database migration during upgrade.\n * @returns An observable stream representing the state of the IndexedDB entry.\n * @throws Throws an error if attempting to open a connection to a database with conflicting versions.\n */\nexport function getOrOpenDb(\n  dbName: string,\n  dbVersion?: number,\n  migration?: (event: IDBVersionChangeEvent) => void\n): Observable<IndexedDbPoolEntryState> {\n  const cachedDbEntry = dbPool.get(dbName);\n\n  if (cachedDbEntry) {\n    if (dbVersion && cachedDbEntry.dbVersion !== dbVersion) {\n      throw new Error(\n        `getOrOpenDb: Attempted to open a connection to IndexedDb ${dbName} with the version ${dbVersion}, but another connection to the same db with the version ${cachedDbEntry.dbVersion} is already open. Please use only one version for a specific db.`\n      );\n    }\n\n    return cachedDbEntry.db;\n  } else {\n    dbVersion ??= getRegisteredMigration(dbName)?.dbVersion;\n    if (!dbVersion) {\n      throw new Error(\n        `getOrOpenDb: No db version specified. If you want to let the db pool infer the version, you have to setup db migration first using a specific version`\n      );\n    }\n\n    const dbPoolEntry = new IndexedDbPoolEntry(dbName, dbVersion);\n    dbPool.set(dbName, dbPoolEntry);\n\n    const request = indexedDB.open(dbName, dbVersion);\n\n    request.onupgradeneeded = event => {\n      const db = (event.target as IDBRequest)?.result as IDBDatabase;\n\n      if (db) {\n        const registeredMigration = redeemMigration(db.name, db.version);\n\n        registeredMigration?.(event);\n        migration?.(event);\n      }\n    };\n\n    request.onsuccess = event => {\n      dbPoolEntry.updateEntryState((event.target as IDBRequest)?.result);\n    };\n\n    request.onblocked = () => {\n      dbPoolEntry.updateEntryState('Blocked');\n    };\n\n    request.onerror = () => {\n      dbPoolEntry.updateEntryState('InitError');\n    };\n\n    return dbPoolEntry.db;\n  }\n}\n","import { filter, first } from 'rxjs';\nimport { AsyncStorage } from '../persistence-async-storage';\nimport {\n  PersistenceProjection,\n  StorePersistencePluginOptions,\n} from '../plugin-persistence';\nimport { getOrOpenDb, isIDBDatabase } from './idb-pool';\n\n/**\n * Represents the configuration options for IndexedDB setup handlers.\n */\nexport interface IndexedDbSetupHandlers {\n  /**\n   * Callback for handling the 'success' event after successfully connecting to the database.\n   */\n  onSuccess?: () => void;\n\n  /**\n   * Callback for handling the 'blocked' event when a connection request is blocked.\n   */\n  onBlocked?: () => void;\n\n  /**\n   * Callback for handling errors during database initialization.\n   */\n  onInitializationError?: () => void;\n}\n\n/**\n * Represents the options for connecting to an IndexedDB.\n */\nexport interface IndexedDbOptions<TState = never, TProjection = never> {\n  /**\n   * The name of the IndexedDB database.\n   */\n  dbName: string;\n\n  /**\n   * The version of the IndexedDB database. If not provided,\n   * the adapter will attempt to infer the version by inspecting the pool.\n   * This inference relies on prior configuration through the `migrateIndexedDb` function or previous usage of the same database.\n   */\n  dbVersion?: number;\n\n  /**\n   * The name of the object store to connect to within the database.\n   * If not provided, it will use the stores name.\n   */\n  objectStoreName?: string;\n\n  /**\n   * The key to use when connecting to a specific record within the object store. Default is store name.\n   */\n  key?: string;\n\n  /**\n   * Configuration options for IndexedDB setup handlers.\n   */\n  handlers?: IndexedDbSetupHandlers;\n\n  /**\n   * Projection functions which are applied before storing and after loading from storage\n   * This can be useful for obfuscating sensitive data prior to storing or for saving space.\n   * Optional, default nothing.\n   */\n  projection?: PersistenceProjection<TState, TProjection>;\n}\n\n/**\n * configures connection to an IndexedDb\n * @param options - The configuration options for IndexedDB.\n * @returns Store persistence plugin options.\n */\nexport function configureIndexedDb<TState = never, TProjection = never>(\n  options: IndexedDbOptions<TState, TProjection>\n): StorePersistencePluginOptions<TState, TProjection> {\n  return {\n    persistenceStorage: new IndexedDbAdapter(\n      options.dbName,\n      options.dbVersion,\n      options.objectStoreName,\n      options.key,\n      options.handlers\n    ),\n    projection: options.projection,\n  };\n}\n\n/**\n * Represents an adapter for interacting with IndexedDB, implementing AsyncStorage.\n */\nexport class IndexedDbAdapter implements AsyncStorage {\n  private db: IDBDatabase | undefined;\n\n  constructor(\n    private dbName: string,\n    private dbVersion?: number,\n    private _objectStoreName?: string,\n    private _key?: string,\n    private handlers?: IndexedDbSetupHandlers\n  ) {}\n\n  private get objectStoreName() {\n    return this._objectStoreName!;\n  }\n\n  private get key() {\n    return this._key!;\n  }\n\n  initAsync(storeName: string, callback?: () => void) {\n    this._objectStoreName ??= storeName;\n    this._key ??= storeName;\n\n    const db = getOrOpenDb(this.dbName, this.dbVersion, event => {\n      const db = (event.target as IDBRequest)?.result;\n\n      if (db) {\n        if (!db.objectStoreNames.contains(this._objectStoreName)) {\n          db.createObjectStore(this._objectStoreName);\n        }\n      }\n    });\n\n    db.pipe(\n      filter(entry => !!entry),\n      first()\n    ).subscribe(entry => {\n      if (isIDBDatabase(entry)) {\n        this.db = entry;\n        this.dbVersion = entry.version;\n        this.handlers?.onSuccess?.();\n        callback?.();\n      } else if (entry === 'Blocked') {\n        this.handlers?.onBlocked?.();\n      } else if (entry === 'InitError') {\n        this.handlers?.onInitializationError?.();\n      }\n    });\n  }\n\n  getItemAsync(\n    _: string,\n    callback: (value: unknown | null | undefined) => void\n  ): void {\n    const request = this.db\n      ?.transaction([this.objectStoreName])\n      ?.objectStore(this.objectStoreName)\n      ?.get(this.key);\n\n    if (request) {\n      request.onsuccess = (event: Event) => {\n        callback((event.target as IDBRequest).result);\n      };\n    }\n  }\n\n  setItemAsync(_: string, value: unknown, callback?: () => void): void {\n    const request = this.db\n      ?.transaction([this.objectStoreName], 'readwrite')\n      ?.objectStore(this.objectStoreName)\n      ?.put(value, this.key);\n\n    if (request && callback) {\n      request.onsuccess = callback;\n    }\n  }\n\n  removeItemAsync(_: string, callback?: () => void): void {\n    const request = this.db\n      ?.transaction([this.objectStoreName], 'readwrite')\n      ?.objectStore(this.objectStoreName)\n      ?.clear();\n\n    if (request && callback) {\n      request.onsuccess = callback;\n    }\n  }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface AsyncStorage<TValue = unknown> {\n  initAsync(storeName: string, callback?: () => void): void;\n  getItemAsync(key: string, callback: (value: TValue | null) => void): void;\n  setItemAsync(key: string, value: TValue, callback?: () => void): void;\n  removeItemAsync(key: string, callback?: () => void): void;\n}\n\n/**\n * Type guard to check if an object implements the `PersistenceStorageAsynchronous` interface.\n * @param obj - The object to check.\n * @returns True if the object implements the `PersistenceStorageAsynchronous` interface, false otherwise.\n */\nexport function isAsyncStorage(obj: any): obj is AsyncStorage {\n  return (\n    typeof obj === 'object' &&\n    typeof obj.initAsync === 'function' &&\n    typeof obj.getItemAsync === 'function' &&\n    typeof obj.setItemAsync === 'function' &&\n    typeof obj.removeItemAsync === 'function'\n  );\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Represents the interface for store persistence methods with synchronous operations.\n */\nexport interface SyncStorage {\n  getItem(key: string): string | null;\n  setItem(key: string, value: string): void;\n  removeItem(key: string): void;\n}\n\n/**\n * Type guard to check if an object implements the `PersistenceStorageSynchronous` interface.\n * @param obj - The object to check.\n * @returns True if the object implements the `PersistenceStorageSynchronous` interface, false otherwise.\n */\nexport function isSyncStorage(obj: any): obj is SyncStorage {\n  return (\n    typeof obj === 'object' &&\n    typeof obj.getItem === 'function' &&\n    typeof obj.setItem === 'function' &&\n    typeof obj.removeItem === 'function'\n  );\n}\n\n/**\n * Loads a value from storage.\n *\n * @template TState - The type of state to load.\n * @param store - The store instance.\n * @returns The loaded value if available and successfully parsed, otherwise undefined.\n */\nexport function loadFromStorage<TState>(\n  persistenceStorage: SyncStorage,\n  persistenceKey: string\n): TState | undefined {\n  const value = persistenceStorage.getItem(persistenceKey);\n\n  try {\n    return value ? (JSON.parse(value) as TState) : undefined;\n  } catch {\n    return undefined;\n  }\n}\n\n/**\n * Saves a value to local storage.\n *\n * @template TState - The type of state to save.\n * @param store - The store instance.\n * @param value - The store value to store.\n */\nexport function saveToStorage<TState>(\n  persistenceStorage: SyncStorage,\n  persistenceKey: string,\n  value: TState\n): void {\n  persistenceStorage.setItem(persistenceKey, JSON.stringify(value));\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Store } from '../store';\nimport { StorePlugin } from '../store-plugin';\nimport {\n  isIndexedDbAvailable,\n  isLocalStorageAvailable,\n  isSessionStorageAvailable,\n} from '../utility/feature-detection';\nimport { IndexedDbAdapter } from './idb/idb-adapter';\nimport { AsyncStorage, isAsyncStorage } from './persistence-async-storage';\nimport {\n  SyncStorage,\n  isSyncStorage,\n  loadFromStorage,\n  saveToStorage,\n} from './persistence-sync-storage';\n\n/**\n * Projection functions which are applied before storing and after loading from storage\n * This can be useful for obfuscating sensitive data prior to storing or for saving space\n */\nexport interface PersistenceProjection<TState = never, TProjection = never> {\n  /**\n   * Function to transform the state before saving it to storage.\n   * @param state - The current state of the store.\n   * @returns The transformed state to be stored.\n   */\n  onWrite: (state: TState) => TProjection;\n\n  /**\n   * Function to transform the loaded projection from storage before applying it to the store.\n   * @param projection - The loaded projection from storage.\n   * @returns The transformed state to be applied to the store.\n   */\n  onLoad: (projection: TProjection) => TState;\n}\n\n/**\n * Options for configuring the Store Persistence Plugin.\n */\nexport interface StorePersistencePluginOptions<\n  TState = never,\n  TProjection = never,\n> {\n  /**\n   * The key used for storing the state in the persistence storage (Optional, default _persisted_state_of_[storename]).\n   */\n  persistenceKey?: string;\n\n  /**\n   * The storage medium used for persistence (Optional, default localStorage).\n   */\n  persistenceStorage?:\n    | SyncStorage\n    | AsyncStorage\n    | 'LOCAL_STORAGE'\n    | 'SESSION_STORAGE';\n\n  /**\n   * Projection functions which are applied before storing and after loading from storage\n   * This can be useful for obfuscating sensitive data prior to storing or for saving space.\n   * Optional, default nothing.\n   */\n  projection?: PersistenceProjection<TState, TProjection>;\n}\n\n/**\n * Represents the Store Persistence Plugin, enhancing a store with state persistence functionality.\n */\ntype StorePersistencePlugin<TStorage extends SyncStorage | AsyncStorage> =\n  StorePlugin & {\n    storage: TStorage;\n    persistenceKey: string;\n  };\n\n/**\n * typeguard for StorePersistencePlugin.\n * @param obj - The object to check.\n * @returns True if the object is a StorePersistencePlugin, otherwise false.\n */\nfunction isStorePersistencePlugin(\n  obj: StorePlugin\n): obj is StorePersistencePlugin<any> {\n  return (\n    obj &&\n    typeof obj === 'object' &&\n    'name' in obj &&\n    obj['name'] === 'StorePersistence'\n  );\n}\n\n/**\n * Clears the value associated with the provided key from local storage.\n *\n * @template TState - The type of state to clear from local storage.\n * @param store - The store instance.\n *\n */\nexport function clearStoreStorage(store: Store<any>): void {\n  const plugin = store.config.plugins.find(isStorePersistencePlugin);\n  if (plugin) {\n    if (isSyncStorage(plugin.storage)) {\n      plugin.storage.removeItem(plugin.persistenceKey);\n    } else if (isAsyncStorage(plugin.storage)) {\n      plugin.storage.removeItemAsync(plugin.persistenceKey);\n    }\n  } else {\n    throw new Error(\n      `Store persistence plugin is not enabled for store ${store.config.name}`\n    );\n  }\n}\n\nfunction configureSyncStorage<TState = never, TProjection = never>(\n  plugin: StorePersistencePlugin<SyncStorage>,\n  projection?: PersistenceProjection<TState, TProjection>\n) {\n  plugin.init = store => {\n    if (!plugin.persistenceKey) {\n      plugin.persistenceKey = `_persisted_state_of_${store.config.name}`;\n    }\n\n    const persistedState = loadFromStorage(\n      plugin.storage,\n      plugin.persistenceKey\n    );\n    if (persistedState) {\n      store.set(\n        projection\n          ? projection.onLoad(persistedState as TProjection)\n          : persistedState,\n        'Load state from storage'\n      );\n    }\n  };\n\n  plugin.postprocessCommand = projection\n    ? store =>\n        saveToStorage(\n          plugin.storage,\n          plugin.persistenceKey,\n          projection.onWrite(store.state())\n        )\n    : store =>\n        saveToStorage(plugin.storage, plugin.persistenceKey, store.state());\n\n  return plugin;\n}\n\nfunction configureAsyncStorage<TState = never, TProjection = never>(\n  plugin: StorePersistencePlugin<AsyncStorage>,\n  projection?: PersistenceProjection<TState, TProjection>\n) {\n  plugin.init = store => {\n    if (!plugin.persistenceKey) {\n      plugin.persistenceKey = `_persisted_state_of_${store.config.name}`;\n    }\n\n    plugin.storage.initAsync(store.name, () => {\n      plugin.storage.getItemAsync(plugin.persistenceKey, persistedState => {\n        if (persistedState) {\n          store.set(\n            projection\n              ? projection.onLoad(persistedState as TProjection)\n              : persistedState,\n            'Load state from storage'\n          );\n        }\n      });\n    });\n  };\n\n  plugin.postprocessCommand = projection\n    ? store =>\n        plugin.storage.setItemAsync(\n          plugin.persistenceKey,\n          projection.onWrite(store.state())\n        )\n    : store =>\n        plugin.storage.setItemAsync(plugin.persistenceKey, store.state());\n\n  return plugin;\n}\n\n/**\n * Enables Storeplugin that persists the store state to a storage (e.g. local storage).\n * State changes are automatically synced with the storage.\n * @param options - Options for configuring the StorePersistencePlugin.\n * @returns A StorePersistencePlugin instance.\n */\nexport function useStorePersistence<TState = never, TProjection = never>(\n  options: StorePersistencePluginOptions<TState, TProjection> = {}\n): StorePersistencePlugin<any> {\n  const storageProvider = options.persistenceStorage ?? 'LOCAL_STORAGE';\n  if (\n    (storageProvider === 'LOCAL_STORAGE' && !isLocalStorageAvailable()) ||\n    (storageProvider === 'SESSION_STORAGE' && !isSessionStorageAvailable()) ||\n    (storageProvider instanceof IndexedDbAdapter && !isIndexedDbAvailable())\n  ) {\n    return {} as StorePersistencePlugin<any>;\n  }\n\n  const storage =\n    storageProvider === 'LOCAL_STORAGE'\n      ? localStorage\n      : storageProvider === 'SESSION_STORAGE'\n        ? sessionStorage\n        : storageProvider;\n\n  const plugin = <StorePersistencePlugin<any>>{\n    name: 'StorePersistence',\n    storage,\n    persistenceKey: options.persistenceKey ?? '',\n  };\n\n  return isAsyncStorage(storage)\n    ? configureAsyncStorage(plugin, options.projection)\n    : configureSyncStorage(plugin, options.projection);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { Signal, WritableSignal, computed, signal } from '@angular/core';\r\nimport { Store } from '../store';\r\nimport { StoreEffect } from '../store-effect';\r\nimport { StorePlugin } from '../store-plugin';\r\n\r\nconst storeStatusMap = new WeakMap<\r\n  Store<unknown>,\r\n  WritableSignal<{\r\n    hasBeenModified: boolean;\r\n    hasBeenInitialized: boolean;\r\n  }>\r\n>();\r\n\r\nlet _runningEffects: WritableSignal<\r\n  [WeakRef<Store<any>>, StoreEffect<any, any, any>, number][]\r\n> | undefined;\r\n\r\nexport function getRunningEffects(): WritableSignal<\r\n  [WeakRef<Store<any>>, StoreEffect<any, any, any>, number][]\r\n> {\r\n  if (!_runningEffects) {\r\n    _runningEffects = signal([]);\r\n  }\r\n  return _runningEffects;\r\n}\r\n\r\n/**\r\n * Returns a Signal indicating whether the provided store has been modified.\r\n *\r\n * @note A store is initially considered unmodified. Any command (`set`, `update`, `mutate`) applied to the store\r\n * will mark it as modified. Additionally, an effect created with the `setInitializedStatus` flag will reset the store's\r\n * modification status to unmodified.\r\n *\r\n * @param store - The store to check for modification status.\r\n * @returns Signal<boolean> - A signal indicating whether the store has been modified.\r\n */\r\nexport function modified(store: Store<any>): Signal<boolean> {\r\n  const status = storeStatusMap.get(store);\r\n  if (!status) {\r\n    throw new Error(\r\n      `StatusPlugin has not been activated for store ${store.name}`\r\n    );\r\n  }\r\n\r\n  return computed(() => status().hasBeenModified);\r\n}\r\n\r\n/**\r\n * Returns a Signal indicating whether the provided store has been initialized by an initializing effect.\r\n *\r\n * @note A store is initially considered as deinitialized. An effect created with the `setInitializedStatus` flag will set the store's\r\n * initialization status to `true`.\r\n *\r\n * @param store - The store to check for initialization status.\r\n * @returns Signal<boolean> - A signal indicating whether the store has been initialized.\r\n */\r\nexport function initialized(store: Store<any>): Signal<boolean> {\r\n  const status = storeStatusMap.get(store);\r\n  if (!status) {\r\n    throw new Error(\r\n      `StatusPlugin has not been activated for store ${store.name}`\r\n    );\r\n  }\r\n\r\n  return computed(() => status().hasBeenInitialized);\r\n}\r\n\r\n/**\r\n * Manually resets the status indicators for the provided store, marking it as deinitialized and unmodified.\r\n * This means that both `unmodified()` and `initialized()` will return false. For manual reset of the loading status,\r\n * use `markAsHavingNoRunningEffects`.\r\n *\r\n * @note This method is intended for exceptional cases.\r\n *\r\n * @param store - The store to manually reset the status.\r\n * @returns void\r\n */\r\nexport function resetStoreStatus(store: Store<any>): void {\r\n  storeStatusMap.get(store)?.set({\r\n    hasBeenInitialized: false,\r\n    hasBeenModified: false,\r\n  });\r\n}\r\n\r\n/**\r\n * Returns a Signal indicating whether any of the provided stores is in a loading state.\r\n * If no stores are provided, the returned signal indicates if any store is in a loading state.\r\n *\r\n * @note An effect created with `setLoadingStatus` will mark the associated store as loading while the effect is running.\r\n *\r\n * @param stores - Stores to check for loading status. If no stores are provided, the signal checks all stores.\r\n * @returns Signal<boolean> - A signal indicating whether any store is loading.\r\n */\r\nexport function isLoading(...stores: Store<any>[]): Signal<boolean> {\r\n  if (!stores || stores.length === 0) {\r\n    return computed(() =>\r\n     getRunningEffects()().some(effect => effect[1].config.setLoadingStatus)\r\n    );\r\n  } else {\r\n    return computed(() =>\r\n     getRunningEffects()().some(runningEffect => {\r\n        const affectedStore = runningEffect[0].deref();\r\n        return (\r\n          affectedStore &&\r\n          runningEffect[1].config.setLoadingStatus &&\r\n          stores.some(store => store === affectedStore)\r\n        );\r\n      })\r\n    );\r\n  }\r\n}\r\n\r\n/**\r\n * Manually marks the provided store as not having any running effects.\r\n *\r\n * @note This method is intended for exceptional cases, specifically when you observe\r\n * that an effect is not removed from the running state by signalstory automatically.\r\n * If you encounter such a situation, use this method as a temporary workaround and\r\n * be sure to file an issue on GitHub for further investigation and resolution.\r\n *\r\n * @param store - The store to manually mark as not having running effects.\r\n * @returns void\r\n */\r\nexport function markAsHavingNoRunningEffects(store: Store<any>): void {\r\n getRunningEffects().update(state =>\r\n    state.filter(runningEffect => runningEffect[0].deref() !== store)\r\n  );\r\n}\r\n\r\n/**\r\n * Returns a Signal indicating whether any effect is currently running for any of the provided stores.\r\n * If no Store is provided the returned signal indicates if any store has an effect running\r\n * @param stores - Stores to check for running effects.\r\n * @returns Signal<boolean> - A signal indicating whether any effect is running for any store.\r\n */\r\nexport function isAnyEffectRunning(...stores: Store<any>[]): Signal<boolean> {\r\n  if (!stores || stores.length === 0) {\r\n    return computed(() =>getRunningEffects()().length > 0);\r\n  } else {\r\n    return computed(() =>\r\n     getRunningEffects()().some(runningEffect => {\r\n        const affectedStore = runningEffect[0].deref();\r\n        return affectedStore && stores.some(store => store === affectedStore);\r\n      })\r\n    );\r\n  }\r\n}\r\n\r\n/**\r\n * Returns a Signal indicating whether the specified effect is currently running for any of the provided stores.\r\n * If no Store is provided the returned signal indicates if any store has the given effect running\r\n * @param effect - The effect to check for.\r\n * @param stores - Stores to check for the specified effect.\r\n * @returns Signal<boolean> - A signal indicating whether the specified effect is running for any store.\r\n */\r\nexport function isEffectRunning(\r\n  effect: StoreEffect<any, any, any>,\r\n  ...stores: Store<any>[]\r\n): Signal<boolean> {\r\n  if (!stores || stores.length === 0) {\r\n    return computed(() =>getRunningEffects()().some(x => x[1] === effect));\r\n  } else {\r\n    return computed(() =>\r\n     getRunningEffects()()\r\n        .filter(runningEffect => runningEffect[1] === effect)\r\n        .some(runningEffect => {\r\n          const affectedStore = runningEffect[0].deref();\r\n          return affectedStore && stores.some(store => store === affectedStore);\r\n        })\r\n    );\r\n  }\r\n}\r\n\r\n/**\r\n * Enables StorePlugin that tracks the loading and modification status of a store.\r\n * @returns A StorePlugin instance for loading and modification status tracking.\r\n */\r\nexport function useStoreStatus(): StorePlugin {\r\n  return {\r\n    init(store) {\r\n      storeStatusMap.set(\r\n        store,\r\n        signal({\r\n          hasBeenInitialized: false,\r\n          hasBeenModified: false,\r\n        })\r\n      );\r\n    },\r\n    postprocessCommand(store) {\r\n      const status = storeStatusMap.get(store);\r\n      if (status && !status().hasBeenModified) {\r\n        storeStatusMap.get(store)?.update(state => ({\r\n          ...state,\r\n          hasBeenModified: true,\r\n        }));\r\n      }\r\n    },\r\n    preprocessEffect(store, effect, invocationId) {\r\n     getRunningEffects().update(effects => [\r\n        ...effects,\r\n        [new WeakRef(store), effect, invocationId],\r\n      ]);\r\n    },\r\n    postprocessEffect(store, effect, _, invocationId) {\r\n     getRunningEffects().update(effects =>\r\n        effects.filter(x => x[2] !== invocationId)\r\n      );\r\n      if (effect.config.setInitializedStatus) {\r\n        storeStatusMap.get(store)?.set({\r\n          hasBeenInitialized: true,\r\n          hasBeenModified: false,\r\n        });\r\n      }\r\n    },\r\n  };\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ProviderToken } from '@angular/core';\nimport { Store } from './store';\n\n/**\n * Represents a store query with the specified result type, store dependencies, and optional argument.\n */\nexport type StoreQuery<\n  TResult,\n  TStores extends ProviderToken<any>[],\n  TArg = undefined,\n> = {\n  stores: TStores;\n  query: TArg extends undefined\n    ? (\n        ...stores: {\n          [K in keyof TStores]: TStores[K] extends ProviderToken<infer U>\n            ? U\n            : never;\n        }\n      ) => TResult\n    : (\n        ...storesAndArg: {\n          [K in keyof TStores]: TStores[K] extends ProviderToken<infer U>\n            ? U\n            : never;\n        } & { arg: TArg }\n      ) => TResult;\n};\n\n/**\n * Creates a store query with the specified result type and store dependencies.\n * @param stores The store dependencies for the query.\n * @param query The query function that operates on the stores.\n * @returns The created store query.\n */\nexport function createQuery<\n  TResult,\n  TStore1 extends Store<any>,\n  TStore2 extends Store<any>,\n  TStore3 extends Store<any>,\n  TStore4 extends Store<any>,\n  TArg = undefined,\n>(\n  stores: [\n    ProviderToken<TStore1>,\n    ProviderToken<TStore2>,\n    ProviderToken<TStore3>,\n    ProviderToken<TStore4>,\n  ],\n  query: (\n    store1: TStore1,\n    store2: TStore2,\n    store3: TStore3,\n    store4: TStore4,\n    arg: TArg\n  ) => TResult\n): StoreQuery<\n  TResult,\n  [\n    ProviderToken<TStore1>,\n    ProviderToken<TStore2>,\n    ProviderToken<TStore3>,\n    ProviderToken<TStore4>,\n  ],\n  TArg\n>;\n\nexport function createQuery<\n  TResult,\n  TStore1 extends Store<any>,\n  TStore2 extends Store<any>,\n  TStore3 extends Store<any>,\n  TArg = undefined,\n>(\n  stores: [\n    ProviderToken<TStore1>,\n    ProviderToken<TStore2>,\n    ProviderToken<TStore3>,\n  ],\n  query: (\n    store1: TStore1,\n    store2: TStore2,\n    store3: TStore3,\n    arg: TArg\n  ) => TResult\n): StoreQuery<\n  TResult,\n  [ProviderToken<TStore1>, ProviderToken<TStore2>, ProviderToken<TStore3>],\n  TArg\n>;\n\nexport function createQuery<\n  TResult,\n  TStore1 extends Store<any>,\n  TStore2 extends Store<any>,\n  TArg = undefined,\n>(\n  stores: [ProviderToken<TStore1>, ProviderToken<TStore2>],\n  query: (store1: TStore1, store2: TStore2, arg: TArg) => TResult\n): StoreQuery<TResult, [ProviderToken<TStore1>, ProviderToken<TStore2>], TArg>;\n\nexport function createQuery<\n  TResult,\n  TStore1 extends Store<any>,\n  TArg = undefined,\n>(\n  stores: [ProviderToken<TStore1>],\n  query: (store1: TStore1, arg: TArg) => TResult\n): StoreQuery<TResult, [ProviderToken<TStore1>], TArg>;\n\nexport function createQuery<TResult>(\n  stores: ProviderToken<any>[],\n  query: (...stores: any[]) => TResult\n): StoreQuery<TResult, ProviderToken<any>[]> {\n  return {\n    stores: stores,\n    query: query,\n  };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ProviderToken } from '@angular/core';\nimport { Store } from './store';\nimport { ImmutableStore } from './store-immutability/immutable-store';\nimport { deepClone } from './store-immutability/immutable-utility';\nimport { forEachStoreInScope } from './store-registry';\n\n/**\n * Represents the snapshot restore command.\n */\nexport const RestoreCommand = '_SNAPSHOT_RESTORE_';\n\n/**\n * Represents a snapshot of the application state.\n */\nexport interface StateSnapshot {\n  /**\n   * The timestamp when the snapshot was created.\n   */\n  readonly timestamp: number;\n\n  /**\n   * Restores the application state to the captured snapshot.\n   */\n  restore: () => void;\n}\n\n/**\n * Base implementation of the StateSnapshot interface.\n */\nclass StateSnapshotBase implements StateSnapshot {\n  readonly timestamp = performance.now();\n\n  constructor(\n    private readonly storesWithState: WeakMap<Store<unknown>, unknown>\n  ) {}\n\n  restore(): void {\n    forEachStoreInScope(store => {\n      if (this.storesWithState.has(store)) {\n        const snapshotValue = this.storesWithState.get(store);\n        if (snapshotValue !== store.state()) {\n          store.set(snapshotValue, RestoreCommand);\n        }\n      }\n    });\n  }\n}\n\n/**\n * Creates a state snapshot either for specified stores or all stores in scope.\n *\n * If no stores are provided, the snapshot will include all stores currently in scope.\n * Stores can be specified either as instances of Store or as ProviderTokens representing\n * Store classes.\n *\n * @param stores - The stores for which to create a snapshot. Can be either instances\n * of Store or ProviderTokens representing Store classes.\n * @returns A StateSnapshot instance representing the application state snapshot.\n */\nexport function createSnapshot(\n  ...stores: (Store<any> | ProviderToken<Store<any>>)[]\n): StateSnapshot {\n  const storesWithState = new WeakMap<Store<unknown>, unknown>();\n\n  stores ??= [];\n\n  forEachStoreInScope(store => {\n    if (\n      stores.length === 0 ||\n      stores.some(x => x === store || store.constructor === x)\n    ) {\n      const stateSnapshot =\n        store instanceof ImmutableStore\n          ? store.state()\n          : deepClone(store.state());\n      storesWithState.set(store, stateSnapshot);\n    }\n  });\n\n  return new StateSnapshotBase(storesWithState);\n}\n","/*\n * Public API Surface of signalstory\n */\n\nexport { Store } from './lib/store';\nexport { StoreConfig } from './lib/store-config';\nexport { StoreEffect, createEffect } from './lib/store-effect';\nexport { StoreEvent, createEvent } from './lib/store-event';\nexport { HistoryTracker, trackHistory } from './lib/store-history';\nexport { ImmutableStore } from './lib/store-immutability/immutable-store';\nexport { ImmutableStoreConfig } from './lib/store-immutability/immutable-store-config';\nexport { Immutable } from './lib/store-immutability/immutable-type';\nexport { publishStoreEvent } from './lib/store-mediator';\nexport { StorePlugin } from './lib/store-plugin';\nexport { useDeepFreeze } from './lib/store-plugin-deep-freeze/plugin-deep-freeze';\nexport { useDevtools } from './lib/store-plugin-devtools/plugin-devtools';\nexport { useLogger } from './lib/store-plugin-logger/plugin-logger';\nexport {\n  getReport,\n  usePerformanceCounter,\n} from './lib/store-plugin-performance-counter/plugin-performance-counter';\nexport { configureIndexedDb } from './lib/store-plugin-persistence/idb/idb-adapter';\nexport { migrateIndexedDb } from './lib/store-plugin-persistence/idb/idb-migration';\nexport {\n  StorePersistencePluginOptions,\n  clearStoreStorage,\n  useStorePersistence,\n} from './lib/store-plugin-persistence/plugin-persistence';\nexport {\n  initialized,\n  isAnyEffectRunning,\n  isEffectRunning,\n  isLoading,\n  markAsHavingNoRunningEffects,\n  modified,\n  resetStoreStatus,\n  useStoreStatus,\n} from './lib/store-plugin-status/plugin-status';\nexport { StoreQuery, createQuery } from './lib/store-query';\nexport { createSnapshot } from './lib/store-snapshot';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}