{"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"}