{"version":3,"file":"index.cjs","sources":["../../package/react/useSubscriber.ts","../../package/react/neuron.ts","../../package/react/useNeuron.ts","../../package/react/NeuronClient.ts","../../package/react/usePrivateSubscriber.ts","../../package/react/PrivateNeuronClient.tsx","../../package/react/index.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { INeuron } from \"../core\";\n\nexport function useSubscriber<T, A, S>(\n  neuron: INeuron<T, A>,\n  slice?: (state: T) => S\n) {\n  const [state, setState] = useState(\n    slice ? slice(neuron.getRef()) : neuron.getRef()\n  );\n  const set = ((state: T | ((prev: T) => T)) =>\n    neuron.set(state)) as SetState<S>;\n  const setSlice = ((state: S | ((prevSlice: S) => S)) => {\n    if (slice) {\n      const funcToSelectorString = slice\n        ?.toString()\n        .match(/\\(\\w+\\) =>\\s*(\\S+)/)?.[1];\n      const selectorArray =\n        typeof funcToSelectorString === \"string\"\n          ? funcToSelectorString?.split(\".\").slice(1)\n          : [];\n      const prevState = neuron.getRef();\n      const prevSliceState = selectorArray.reduce(\n        (acc, key) => acc[key],\n        prevState\n      ) as unknown as S;\n\n      let sliceState: S;\n      if (typeof state === \"function\") {\n        sliceState = (state as (prevSlice: S) => S)?.(prevSliceState);\n      } else {\n        sliceState = state;\n      }\n      const deepStateUpdateObject = (\n        obj: T,\n        path: string[],\n        value: unknown\n      ): T => {\n        const lastKey = path.pop() as keyof any;\n        const lastObj = path.reduce((o, key) => (o[key] = o[key] || {}), obj);\n        lastObj[lastKey] = value;\n        return obj;\n      };\n      const updatedState = deepStateUpdateObject(\n        prevState,\n        selectorArray,\n        sliceState\n      );\n\n      neuron.set({ ...updatedState });\n    }\n  }) as SetState<S>;\n  const actions = slice\n    ? {\n        ...neuron.getActions(),\n        set,\n        setSlice,\n      }\n    : { ...neuron.getActions(), set };\n  useEffect(() => {\n    neuron.effect((payload) => {\n      if (slice) {\n        setState(slice(payload.state));\n      } else {\n        setState(payload.state);\n      }\n    });\n  }, []);\n  return [state, actions] as [StateOrSlice<S, T>, Actions<T, S, A>];\n}\n\nexport type StateOrSlice<T, S> = unknown extends T\n  ? T extends unknown\n    ? S\n    : T\n  : T;\nexport type Actions<T, S, A> = unknown extends S\n  ? T extends unknown\n    ? { set: SetState<T> } & A\n    : { set: SetState<T>; setSlice: SetState<S> } & A\n  : { set: SetState<T>; setSlice: SetState<S> } & A;\nexport type SetState<T> = T extends boolean\n  ? (state: boolean | ((prev: boolean) => boolean)) => void\n  : (state: T | ((prev: T) => T)) => void;\n","import { NeuronInstance, Neuron, NeuronOptions } from \"../core\";\nimport { useSubscriber } from \"./useSubscriber\";\nexport const neuron = <T, A = unknown>(\n  initialState: T,\n  options?: NeuronOptions<T, A>,\n  clientNeuron?: NeuronInstance\n) => {\n  const neuronCore =\n    clientNeuron?.(initialState, options) ?? new Neuron(initialState, options);\n  return <S>(slice?: (state: T) => S) =>\n    useSubscriber<T, A, S>(neuronCore, slice);\n};\n","import { useEffect, useState } from \"react\";\nimport { ClientMethods, NeuronKey } from \"../core\";\nexport const useNeuron: DynamicNeuronHook = <T = unknown>(\n  key: NeuronKey,\n  client: ClientMethods\n) => {\n  const [state, _setState] = useState<T>(client.getRef(key));\n  const setState = (newState: T | ((prev: T) => T)) => {\n    client.dispatch(key, (payload) => {\n      payload.state =\n        typeof newState === \"function\"\n          ? (newState as any)?.(payload.prevState)\n          : newState;\n    });\n  };\n  useEffect(() => {\n    _setState(client.getRef(key));\n  }, [key]);\n  useEffect(() => {\n    client.listen((payload) => {\n      if (payload.key === key) {\n        _setState(payload.state as T);\n      }\n    });\n  }, [key]);\n  return [state, setState] as [T, typeof setState];\n};\nexport type DynamicNeuronHook = <T = unknown>(\n  key: NeuronKey,\n  client: ClientMethods\n) => [T, (newState: T | ((prev: T) => T)) => void];\n","import {\n  IModule,\n  NeuronOptions,\n  ClientName,\n  ClientMethods,\n  NeuronClient as NeuronClientCore,\n  NeuronKey,\n} from \"../core\";\nimport { neuron as _neuron } from \"./neuron\";\nimport { DynamicNeuronHook, useNeuron } from \"./useNeuron\";\nimport { Actions, StateOrSlice } from \"./useSubscriber\";\n\nexport class NeuronClient implements INeuronClient {\n  neuron: ReactClientNeuron;\n  useNeuron = <T = unknown>(neuronKey: NeuronKey) =>\n    useNeuron<T>(neuronKey, this.client);\n  readonly name?: ClientName;\n  readonly client: ClientMethods;\n  constructor(options?: ClientOptions) {\n    const client = new NeuronClientCore(options);\n    this.name = options?.name;\n    const modules = options?.modules;\n    //neuron and weak neuron need work\n    this.neuron = <T, A>(initialState: T, options?: NeuronOptions<T, A>) =>\n      _neuron(initialState, { modules: modules, ...options }, client.neuron);\n    this.client = {\n      name: client.name,\n      has: client.has,\n      getRef: client.getRef,\n      getSnapshot: client.getSnapshot,\n      listen: client.listen,\n      dispatch: client.dispatch,\n      neuron: client.neuron,\n      getActions: client.getActions,\n      remove: client.remove,\n    };\n  }\n}\n\ninterface INeuronClient {\n  readonly name?: Readonly<ClientName>;\n  readonly client: ClientMethods;\n  readonly neuron: ReactClientNeuron;\n  readonly useNeuron: DynamicNeuronHook;\n}\nexport interface ClientOptions {\n  name?: ClientName;\n  modules?: IModule[];\n}\nexport type ReactClientNeuron = <T, A = unknown>(\n  initialState: T,\n  options?: NeuronOptions<T, A>\n) => <S>(\n  slice?: ((state: T) => S) | undefined\n) => [StateOrSlice<S, T>, Actions<T, S, A>];\n","import { useEffect, useState } from \"react\";\nimport { NeuronKey, INeuronClient } from \"../core\";\n\nexport function usePrivateSubscriber<T, A, S>(\n  neuronClient: INeuronClient,\n  neuronKey: NeuronKey,\n  slice?: (state: T) => S\n) {\n  const [state, setState] = useState(\n    slice\n      ? slice(neuronClient.getRef(neuronKey))\n      : neuronClient.getRef(neuronKey)\n  );\n  const set: SetState<T> = (state: T | ((prev: T) => T)) =>\n    neuronClient.dispatch(neuronKey, (payload) => (payload.state = state));\n  const setSlice: SetState<S> = (state: S | ((prevSlice: S) => S)) => {\n    if (slice) {\n      const funcToSelectorString = slice\n        ?.toString()\n        .match(/\\(\\w+\\) =>\\s*(\\S+)/)?.[1];\n      const selectorArray =\n        typeof funcToSelectorString === \"string\"\n          ? funcToSelectorString?.split(\".\").slice(1)\n          : [];\n      const prevState = neuronClient.getRef<T>(neuronKey);\n      const prevSliceState = selectorArray.reduce(\n        (acc: any, key) => acc[key],\n        prevState\n      ) as unknown as S;\n\n      let sliceState: S;\n      if (typeof state === \"function\") {\n        sliceState = (state as (prevSlice: S) => S)?.(prevSliceState);\n      } else {\n        sliceState = state;\n      }\n      const deepStateUpdateObject = (\n        obj: T,\n        path: string[],\n        value: unknown\n      ): T => {\n        const lastKey = path.pop() as keyof any;\n        const lastObj = path.reduce((o, key) => (o[key] = o[key] || {}), obj);\n        lastObj[lastKey] = value;\n        return obj;\n      };\n      const updatedState = deepStateUpdateObject(\n        prevState,\n        selectorArray,\n        sliceState\n      );\n\n      neuronClient.dispatch(\n        neuronKey,\n        (payload) => (payload.state = { ...updatedState })\n      );\n    }\n  };\n  const actions = slice\n    ? {\n        ...neuronClient.getActions<A>(neuronKey),\n        set,\n        setSlice,\n      }\n    : { ...neuronClient.getActions<A>(neuronKey), set };\n  useEffect(() => {\n    neuronClient.listen((payload) => {\n      if (payload.key === neuronKey) {\n        if (slice) {\n          setState(slice(payload.state as T));\n        } else {\n          setState(payload.state as S);\n        }\n      }\n    });\n  }, []);\n  return [state, actions] as [StateOrSlice<S, T>, Actions<T, S, A>];\n}\n\nexport type StateOrSlice<T, S> = unknown extends T\n  ? T extends unknown\n    ? S\n    : T\n  : T;\nexport type Actions<T, S, A> = unknown extends S\n  ? T extends unknown\n    ? { set: SetState<T> } & A\n    : { set: SetState<T>; setSlice: SetState<S> } & A\n  : { set: SetState<T>; setSlice: SetState<S> } & A;\nexport type SetState<T> = (state: T | ((prev: T) => T)) => void;\n","import { createContext, ReactNode, useContext } from \"react\";\nimport {\n  ClientName,\n  INeuronClient,\n  NeuronClient,\n  NeuronOptions,\n  IModule,\n} from \"../core\";\nimport {\n  Actions,\n  StateOrSlice,\n  usePrivateSubscriber,\n} from \"./usePrivateSubscriber\";\n\nexport class PrivateNeuronClient implements IPrivateNeuronClient {\n  private clientContext: React.Context<INeuronClient>;\n  private modules: IModule[];\n  readonly privateNeuron = <T, A = unknown>(\n    initialState: T,\n    options?: NeuronOptions<T, A>\n  ) => {\n    const neuronKey = options?.key ?? crypto.randomUUID();\n    const useinitNeuron = (client: INeuronClient) => {\n      client.neuron(initialState, { ...options, key: neuronKey });\n    };\n    const useNeuron = <S,>(slice?: (state: T) => S) => {\n      const client = useContext(this.clientContext);\n      return usePrivateSubscriber<T, A, S>(client, neuronKey, slice);\n    };\n    return [useinitNeuron, useNeuron] as [\n      typeof useinitNeuron,\n      typeof useNeuron\n    ];\n  };\n  readonly useNeuronClient = (options?: { name?: ClientName }) => {\n    const client = new NeuronClient({\n      name: options?.name,\n      modules: this.modules,\n    });\n    const Private = ({ children }: PrivateProps) => {\n      const Context = this.clientContext;\n      return <Context.Provider value={client}>{children}</Context.Provider>;\n    };\n    return { client, Private };\n  };\n  constructor(options?: ClientOptions) {\n    this.modules = options?.modules ?? [];\n    this.clientContext = createContext(\n      null\n    ) as unknown as React.Context<INeuronClient>;\n  }\n}\n\ninterface IPrivateNeuronClient {\n  privateNeuron: <T, A>(\n    initialState: T,\n    options?: NeuronOptions<T, A>\n  ) => (\n    | ((client: INeuronClient) => void)\n    | (<S>(slice?: (state: T) => S) => [StateOrSlice<S, T>, Actions<T, S, A>])\n  )[];\n  useNeuronClient: (options?: { name?: ClientName }) => {\n    client: NeuronClient;\n    Private: ({ children }: PrivateProps) => JSX.Element;\n  };\n}\ninterface ClientOptions {\n  modules?: IModule[];\n}\ninterface PrivateProps {\n  children?: ReactNode;\n}\n","import { neuron } from \"./neuron\";\nimport { NeuronClient } from \"./NeuronClient\";\nimport { PrivateNeuronClient } from \"./PrivateNeuronClient\";\n\nexport { neuron, NeuronClient, PrivateNeuronClient };\nglobalThis[\"ReactNeuron\"] = {\n  neuron,\n  NeuronClient,\n  PrivateNeuronClient,\n};\n"],"names":["useSubscriber","neuron","slice","state","setState","useState","set","setSlice","funcToSelectorString","_a","selectorArray","prevState","prevSliceState","acc","key","sliceState","updatedState","obj","path","value","lastKey","lastObj","o","actions","useEffect","payload","initialState","options","clientNeuron","neuronCore","Neuron","useNeuron","client","_setState","newState","NeuronClient","__publicField","neuronKey","NeuronClientCore","modules","_neuron","usePrivateSubscriber","neuronClient","PrivateNeuronClient","useContext","children","Context","createContext"],"mappings":"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"}