UNPKG

@larscom/ngrx-signals-storage

Version:

Save signal state (@ngrx/signals) to localstorage/sessionstorage and restore the state on page load (with SSR support).

1 lines 5.85 kB
{"version":3,"file":"larscom-ngrx-signals-storage.mjs","sources":["../../../projects/ngrx-signals-storage/src/lib/config.ts","../../../projects/ngrx-signals-storage/src/lib/with-storage.ts","../../../projects/ngrx-signals-storage/src/larscom-ngrx-signals-storage.ts"],"sourcesContent":["export interface Config<T> {\n /**\n * These keys will not get saved to storage\n */\n excludeKeys: Array<keyof T>\n\n /**\n * Serializer for the state, by default it uses `JSON.stringify()`\n * @param state the last state known before it gets saved to storage\n */\n serialize: (state: T) => string\n\n /**\n * Deserializer for the state, by default it uses `JSON.parse()`\n * @param state the last state known from the storage location\n */\n deserialize: (state: string) => T\n\n /**\n * Save to storage will only occur when this function returns true\n * @param state the last state known before it gets saved to storage\n */\n saveIf: (state: T) => boolean\n\n /**\n * Function that gets executed on a storage error (get/set)\n * @param error the error that occurred\n */\n error: (error: any) => void\n}\n\nexport const defaultConfig: Config<any> = {\n excludeKeys: [],\n\n serialize: (state: any) => JSON.stringify(state),\n\n deserialize: (state: string) => JSON.parse(state),\n\n saveIf: (state: any) => true,\n\n error: (error: any) => console.error(error)\n}\n","import { isPlatformServer } from '@angular/common'\nimport { effect, inject, PLATFORM_ID } from '@angular/core'\nimport {\n EmptyFeatureResult,\n getState,\n patchState,\n SignalStoreFeature,\n signalStoreFeature,\n SignalStoreFeatureResult,\n withHooks\n} from '@ngrx/signals'\nimport { Config, defaultConfig } from './config'\n\n/**\n * The `withStorage` function that lets you save the state to localstorage/sessionstorage\n * and rehydrate the state upon page load.\n *\n * @param key the key under which the state should be saved into `Storage`\n * @param storage function that returns an implementation of the `Storage` interface, like: `sessionStorage` or `localStorage`\n *\n * @example\n * export const CounterStore = signalStore(\n * withState({\n * count: 0\n * }),\n * withStorage('myKey', () => sessionStorage)\n * )\n */\nexport function withStorage<T extends SignalStoreFeatureResult>(\n key: string,\n storage: () => Storage,\n config?: Partial<Config<T['state']>>\n): SignalStoreFeature<T, EmptyFeatureResult> {\n return signalStoreFeature(\n withHooks({\n onInit(store, platformId = inject(PLATFORM_ID)) {\n if (isPlatformServer(platformId)) {\n return\n }\n\n const cfg = { ...defaultConfig, ...config }\n const item = getFromStorage(key, storage(), cfg)\n const stateFromStorage: T['state'] | null = item ? cfg.deserialize(item) : null\n\n if (stateFromStorage != null) {\n const stateSignalKeys = Object.keys(store)\n const state = stateSignalKeys.reduce((state, key) => {\n const value = stateFromStorage[key as keyof T['state']]\n return value !== undefined\n ? {\n ...state,\n [key]: value\n }\n : state\n }, getState(store))\n\n patchState(store, state)\n }\n\n effect(() => {\n const state = structuredClone<object>(getState(store))\n try {\n if (cfg.saveIf(state)) {\n cfg.excludeKeys.forEach((key) => {\n delete state[key as keyof object]\n })\n storage().setItem(key, cfg.serialize(state))\n }\n } catch (e) {\n cfg.error(e)\n }\n })\n }\n })\n )\n}\n\nfunction getFromStorage<T extends SignalStoreFeatureResult>(\n key: string,\n storage: Storage,\n cfg: Config<T>\n): string | null {\n try {\n return storage.getItem(key)\n } catch (e) {\n cfg.error(e)\n return null\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AA+BO,MAAM,aAAa,GAAgB;AACxC,IAAA,WAAW,EAAE,EAAE;IAEf,SAAS,EAAE,CAAC,KAAU,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IAEhD,WAAW,EAAE,CAAC,KAAa,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AAEjD,IAAA,MAAM,EAAE,CAAC,KAAU,KAAK,IAAI;IAE5B,KAAK,EAAE,CAAC,KAAU,KAAK,OAAO,CAAC,KAAK,CAAC,KAAK;CAC3C;;AC5BD;;;;;;;;;;;;;;AAcG;SACa,WAAW,CACzB,GAAW,EACX,OAAsB,EACtB,MAAoC,EAAA;IAEpC,OAAO,kBAAkB,CACvB,SAAS,CAAC;QACR,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,EAAA;AAC5C,YAAA,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE;gBAChC;;YAGF,MAAM,GAAG,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,EAAE;YAC3C,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC;AAChD,YAAA,MAAM,gBAAgB,GAAsB,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI;AAE/E,YAAA,IAAI,gBAAgB,IAAI,IAAI,EAAE;gBAC5B,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC1C,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;AAClD,oBAAA,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAuB,CAAC;oBACvD,OAAO,KAAK,KAAK;AACf,0BAAE;AACE,4BAAA,GAAG,KAAK;4BACR,CAAC,GAAG,GAAG;AACR;0BACD,KAAK;AACX,iBAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AAEnB,gBAAA,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC;;YAG1B,MAAM,CAAC,MAAK;gBACV,MAAM,KAAK,GAAG,eAAe,CAAS,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtD,gBAAA,IAAI;AACF,oBAAA,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;wBACrB,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAC9B,4BAAA,OAAO,KAAK,CAAC,GAAmB,CAAC;AACnC,yBAAC,CAAC;AACF,wBAAA,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;;;gBAE9C,OAAO,CAAC,EAAE;AACV,oBAAA,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;;AAEhB,aAAC,CAAC;;AAEL,KAAA,CAAC,CACH;AACH;AAEA,SAAS,cAAc,CACrB,GAAW,EACX,OAAgB,EAChB,GAAc,EAAA;AAEd,IAAA,IAAI;AACF,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;;IAC3B,OAAO,CAAC,EAAE;AACV,QAAA,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACZ,QAAA,OAAO,IAAI;;AAEf;;ACxFA;;AAEG;;;;"}