UNPKG

@sandstack/neuron

Version:

Neuron is a lightweight framework agnostic global state manager for Javascript apps, with React support

1 lines 7.43 kB
{"version":3,"file":"index.cjs","sources":["../../package/persist/persist.ts","../../package/persist/index.ts"],"sourcesContent":["import { Module, IPayload, NeuronKey, IModule } from \"../core\";\n\nconst moduleName = `@sandstack/neuron-persist`;\n\nconst saveStateToStorage = <T>(\n payload: IPayload<T>,\n storageKey?: string,\n storageType?: \"session\" | \"local\"\n) => {\n const _storageKey = `${moduleName}/${storageKey ?? payload.key}`;\n const _storageType = storageType === \"session\" ? \"session\" : \"local\";\n\n const stateToCache = JSON.stringify(payload.state);\n if (_storageType === \"local\") {\n if (localStorage) {\n localStorage.setItem(_storageKey, stateToCache);\n }\n } else if (_storageType === \"session\") {\n if (sessionStorage) {\n sessionStorage.setItem(_storageKey, stateToCache);\n }\n }\n};\n\nconst getStateFromStorage = <T>(\n payload: IPayload<T>,\n storageKey?: string,\n storageType?: \"session\" | \"local\"\n) => {\n const _storageKey = `${moduleName}/${storageKey ?? payload.key}`;\n const _storageType = storageType === \"session\" ? \"session\" : \"local\";\n if (_storageType === \"local\") {\n if (localStorage) {\n const cachedValue = localStorage?.getItem(_storageKey);\n if (cachedValue !== null) {\n const parsedCachedValue = JSON.parse(cachedValue) as T;\n return parsedCachedValue;\n }\n return null;\n }\n } else if (_storageType === \"session\") {\n if (sessionStorage) {\n const cachedValue = sessionStorage.getItem(_storageKey);\n if (cachedValue !== null) {\n const parsedCachedValue = JSON.parse(cachedValue) as T;\n return parsedCachedValue;\n }\n return null;\n }\n }\n return null;\n};\n\n/**\n * The `Persist` function initializes a persistence module for neuron states.\n * It allows states to be saved to and retrieved from browser storage or a custom storage mechanism.\n *\n * @param options - Configuration options for the `Persist` module.\n * @returns A `Module` instance that handles state persistence.\n */\nexport const Persist = (options?: PersistOptions): IModule =>\n new Module({\n name: moduleName,\n onInit: (payload: IPayload<unknown>) => {\n if (options?.storage?.getItem) {\n const cachedState = options?.storage?.getItem?.(payload.key);\n if (cachedState != null && cachedState != undefined) {\n payload.state = cachedState;\n } else {\n if (options.storage.setItem) {\n options?.storage?.setItem?.(payload.key, payload.state);\n } else {\n saveStateToStorage(\n payload,\n options?.storageKey,\n options.storageType\n );\n }\n }\n } else {\n const cachedState = getStateFromStorage(\n payload,\n options?.storageKey,\n options?.storageType\n );\n if (cachedState != null && cachedState != undefined) {\n payload.state = cachedState;\n } else {\n saveStateToStorage(\n payload,\n options?.storageKey,\n options?.storageType\n );\n }\n }\n },\n onCallback: (payload: IPayload<unknown>) => {\n options?.storage?.setItem?.(payload.key, payload.state) ??\n saveStateToStorage(payload, options?.storageKey, options?.storageType);\n },\n });\n\n/**\n * Interface defining the options for the `Persist` module.\n * Ensures `storageType` and `storage` cannot be used together.\n */\nexport type PersistOptions =\n | {\n /** Custom name for the module. */\n name?: string;\n\n /** storage key to be used Neuron state.\n * This only needs to be used when a Neuron state does not have its own key and the module is instantiated on an individual Neuron instance.\n */\n storageKey?: string;\n storage?: never;\n storageType?: never;\n }\n | {\n /** Custom name for the module. */\n name?: string;\n\n /** storage key to be used Neuron state.\n * This only needs to be used when a Neuron state does not have its own key and the module is instantiated on an individual Neuron instance.\n */\n storageKey?: string;\n\n /** Browser storage type to use: `localStorage` or `sessionStorage`. Defaults to \"local\". */\n storageType: \"session\" | \"local\";\n\n /** Custom storage handlers are not allowed when `storageType` is defined. */\n storage?: never;\n }\n | {\n /** Custom name for the module. */\n name?: string;\n\n /** storage key to be used Neuron state.\n * This only needs to be used when a Neuron state does not have its own key and the module is instantiated on an individual Neuron instance.\n */\n storageKey?: string;\n\n /** Browser storage type is not allowed when `storage` is defined. */\n storageType?: never;\n\n /**\n * Custom storage handlers for saving and retrieving state.\n */\n storage: {\n /**\n * A custom function to retrieve an item from storage.\n * @param key - The key of the item to retrieve.\n * @returns The retrieved state or `null` if not found.\n */\n getItem?: (key: NeuronKey) => unknown | null;\n\n /**\n * A custom function to save an item to storage.\n * @param key - The key of the item to save.\n * @param newState - The new state to save.\n */\n setItem?: (key: NeuronKey, newState: unknown) => void;\n };\n };\n","import { Persist } from \"./persist\";\n\nexport { Persist };\n\nglobalThis[\"NeuronPersist\"] = {\n Persist,\n};\n"],"names":["moduleName","saveStateToStorage","payload","storageKey","storageType","_storageKey","_storageType","stateToCache","getStateFromStorage","cachedValue","Persist","options","Module","_a","cachedState","_c","_b","_e","_d"],"mappings":"2GAEMA,EAAa,4BAEbC,EAAqB,CACzBC,EACAC,EACAC,IACG,CACH,MAAMC,EAAc,GAAGL,CAAU,IAAIG,GAAcD,EAAQ,GAAG,GACxDI,EAAeF,IAAgB,UAAY,UAAY,QAEvDG,EAAe,KAAK,UAAUL,EAAQ,KAAK,EAC7CI,IAAiB,QACf,cACW,aAAA,QAAQD,EAAaE,CAAY,EAEvCD,IAAiB,WACtB,gBACa,eAAA,QAAQD,EAAaE,CAAY,CAGtD,EAEMC,EAAsB,CAC1BN,EACAC,EACAC,IACG,CACH,MAAMC,EAAc,GAAGL,CAAU,IAAIG,GAAcD,EAAQ,GAAG,GACxDI,EAAeF,IAAgB,UAAY,UAAY,QAC7D,GAAIE,IAAiB,SACnB,GAAI,aAAc,CACV,MAAAG,EAAc,uCAAc,QAAQJ,GAC1C,OAAII,IAAgB,KACQ,KAAK,MAAMA,CAAW,EAG3C,IACT,UACSH,IAAiB,WACtB,eAAgB,CACZ,MAAAG,EAAc,eAAe,QAAQJ,CAAW,EACtD,OAAII,IAAgB,KACQ,KAAK,MAAMA,CAAW,EAG3C,IACT,CAEK,OAAA,IACT,EASaC,EAAWC,GACtB,IAAIC,SAAO,CACT,KAAMZ,EACN,OAASE,GAA+B,eAClC,IAAAW,EAAAF,GAAA,YAAAA,EAAS,UAAT,MAAAE,EAAkB,QAAS,CAC7B,MAAMC,GAAcC,GAAAC,EAAAL,GAAA,YAAAA,EAAS,UAAT,YAAAK,EAAkB,UAAlB,YAAAD,EAAA,KAAAC,EAA4Bd,EAAQ,KACpDY,GAAe,MAAQA,GAAe,KACxCZ,EAAQ,MAAQY,EAEZH,EAAQ,QAAQ,SAClBM,GAAAC,EAAAP,GAAA,YAAAA,EAAS,UAAT,YAAAO,EAAkB,UAAlB,MAAAD,EAAA,KAAAC,EAA4BhB,EAAQ,IAAKA,EAAQ,OAEjDD,EACEC,EACAS,GAAA,YAAAA,EAAS,WACTA,EAAQ,WAAA,CAGd,KACK,CACL,MAAMG,EAAcN,EAClBN,EACAS,GAAA,YAAAA,EAAS,WACTA,GAAA,YAAAA,EAAS,WAAA,EAEPG,GAAe,MAAQA,GAAe,KACxCZ,EAAQ,MAAQY,EAEhBb,EACEC,EACAS,GAAA,YAAAA,EAAS,WACTA,GAAA,YAAAA,EAAS,WAAA,CAGf,CACF,EACA,WAAaT,GAA+B,WAC1Cc,GAAAH,EAAAF,GAAA,YAAAA,EAAS,UAAT,YAAAE,EAAkB,UAAlB,YAAAG,EAAA,KAAAH,EAA4BX,EAAQ,IAAKA,EAAQ,SAC/CD,EAAmBC,EAASS,GAAA,YAAAA,EAAS,WAAYA,GAAA,YAAAA,EAAS,WAAW,CACzE,CACF,CAAC,EChGH,WAAW,cAAmB,CAC5B,QAAAD,CACF"}