@sandstack/neuron
Version:
Neuron is a lightweight framework agnostic global state manager for Javascript apps, with React support
1 lines • 15.8 kB
Source Map (JSON)
{"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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"}