UNPKG

ngrx-store-localstorage

Version:
1 lines 19.4 kB
{"version":3,"file":"ngrx-store-localstorage.mjs","sources":["../../../projects/lib/src/lib/index.ts","../../../projects/lib/src/ngrx-store-localstorage.ts"],"sourcesContent":["import deepmerge from \"deepmerge\";\n\n// Cannot import from the @ngrx/store package due to a module resolution issue.\n// See Issue #206.\nconst INIT_ACTION = \"@ngrx/store/init\";\nconst UPDATE_ACTION = \"@ngrx/store/update-reducers\";\n\nconst detectDate = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})/;\n\n// correctly parse dates from local storage\nexport const dateReviver = (_key: string, value: any) => {\n if (typeof value === \"string\" && detectDate.test(value)) {\n return new Date(value);\n }\n return value;\n};\n\nconst dummyReviver = (_key: string, value: any) => value;\n\nconst checkIsBrowserEnv = () => {\n return typeof window !== \"undefined\";\n};\n\nconst validateStateKeys = (keys: Keys) => {\n return (keys as any[]).map((key) => {\n let attr = key;\n\n if (typeof key === \"object\") {\n attr = Object.keys(key)[0];\n }\n\n if (typeof attr !== \"string\") {\n throw new TypeError(\n `localStorageSync Unknown Parameter Type: ` +\n `Expected type of string, got ${typeof attr}`,\n );\n }\n return key;\n });\n};\n\nexport const rehydrateApplicationState = ({\n keys,\n storage,\n storageKeySerializer,\n restoreDates,\n}: {\n keys: Keys;\n storage: Storage;\n storageKeySerializer: (key: string) => string;\n restoreDates: boolean;\n}) => {\n return (keys as any[]).reduce((acc, curr) => {\n let key = curr;\n let reviver = restoreDates ? dateReviver : dummyReviver;\n let deserialize: (arg0: string) => any;\n let decrypt: (arg0: string) => string;\n\n if (typeof key === \"object\") {\n key = Object.keys(key)[0];\n // use the custom reviver function\n if (typeof curr[key] === \"function\") {\n reviver = curr[key];\n } else {\n // use custom reviver function if available\n if (curr[key].reviver) {\n reviver = curr[key].reviver;\n }\n // use custom serialize function if available\n if (curr[key].deserialize) {\n deserialize = curr[key].deserialize;\n }\n }\n\n // Ensure that encrypt and decrypt functions are both present\n if (curr[key].encrypt && curr[key].decrypt) {\n if (\n typeof curr[key].encrypt === \"function\" &&\n typeof curr[key].decrypt === \"function\"\n ) {\n decrypt = curr[key].decrypt;\n } else {\n console.error(\n `Either encrypt or decrypt is not a function on '${curr[key]}' key object.`,\n );\n }\n } else if (curr[key].encrypt || curr[key].decrypt) {\n // Let know that one of the encryption functions is not provided\n console.error(\n `Either encrypt or decrypt function is not present on '${curr[key]}' key object.`,\n );\n }\n }\n if (storage !== undefined) {\n let stateSlice = storage.getItem(storageKeySerializer(key));\n if (stateSlice) {\n // Use provided decrypt function\n if (decrypt) {\n stateSlice = decrypt(stateSlice);\n }\n\n const isObjectRegex = new RegExp(\"{|\\\\[\");\n let raw = stateSlice;\n\n if (\n stateSlice === \"null\" ||\n stateSlice === \"true\" ||\n stateSlice === \"false\" ||\n isObjectRegex.test(stateSlice.charAt(0))\n ) {\n raw = JSON.parse(stateSlice, reviver);\n }\n\n return Object.assign({}, acc, {\n [key]: deserialize ? deserialize(raw) : raw,\n });\n }\n }\n return acc;\n }, {});\n};\n\n// Recursively traverse all properties of the existing slice as defined by the `filter` argument,\n// and output the new object with extraneous properties removed.\nfunction createStateSlice(\n existingSlice: any,\n filter: (string | number | KeyConfiguration | Options)[],\n) {\n return filter.reduce(\n (\n memo: { [x: string]: any; [x: number]: any },\n attr: string | number | KeyConfiguration | Options,\n ) => {\n if (typeof attr === \"string\" || typeof attr === \"number\") {\n const value = existingSlice?.[attr];\n if (value !== undefined) {\n memo[attr] = value;\n }\n } else {\n for (const key in attr) {\n if (Object.prototype.hasOwnProperty.call(attr, key)) {\n const element = attr[key];\n memo[key] = createStateSlice(existingSlice[key], element);\n }\n }\n }\n return memo;\n },\n {},\n );\n}\n\nexport const syncStateUpdate = ({\n state,\n keys,\n storage,\n storageKeySerializer,\n removeOnUndefined,\n syncCondition,\n}: {\n state: any;\n keys: Keys;\n storage: Storage;\n storageKeySerializer: (key: string) => string;\n removeOnUndefined: boolean;\n syncCondition?: (state: any) => any;\n}) => {\n if (syncCondition) {\n try {\n if (syncCondition(state) !== true) {\n return;\n }\n } catch (e) {\n // Treat TypeError as do not sync\n if (e instanceof TypeError) {\n return;\n }\n throw e;\n }\n }\n\n keys.forEach(\n (\n key:\n | string\n | KeyConfiguration\n | Options\n | ((key: string, value: any) => any),\n ): void => {\n let stateSlice = state[key as string];\n let replacer;\n let space: string | number;\n let encrypt;\n\n if (typeof key === \"object\") {\n let name = Object.keys(key)[0];\n stateSlice = state[name];\n\n if (typeof stateSlice !== \"undefined\" && key[name]) {\n // use serialize function if specified.\n if (key[name].serialize) {\n stateSlice = key[name].serialize(stateSlice);\n } else {\n // if serialize function is not specified filter on fields if an array has been provided.\n let filter: KeyConfiguration[];\n if (key[name].reduce) {\n filter = key[name];\n } else if (key[name].filter) {\n filter = key[name].filter;\n }\n if (filter) {\n stateSlice = createStateSlice(stateSlice, filter);\n }\n\n // Check if encrypt and decrypt are present, also checked at this#rehydrateApplicationState()\n if (key[name].encrypt && key[name].decrypt) {\n if (typeof key[name].encrypt === \"function\") {\n encrypt = key[name].encrypt;\n }\n } else if (key[name].encrypt || key[name].decrypt) {\n // If one of those is not present, then let know that one is missing\n console.error(\n `Either encrypt or decrypt function is not present on '${key[name]}' key object.`,\n );\n }\n }\n\n /*\n Replacer and space arguments to pass to JSON.stringify.\n If these fields don't exist, undefined will be passed.\n */\n replacer = key[name].replacer;\n space = key[name].space;\n }\n\n key = name;\n }\n\n if (typeof stateSlice !== \"undefined\" && storage !== undefined) {\n try {\n if (encrypt) {\n // ensure that a string message is passed\n stateSlice = encrypt(\n typeof stateSlice === \"string\"\n ? stateSlice\n : JSON.stringify(stateSlice, replacer, space),\n );\n }\n storage.setItem(\n storageKeySerializer(key as string),\n typeof stateSlice === \"string\"\n ? stateSlice\n : JSON.stringify(stateSlice, replacer, space),\n );\n } catch (e) {\n console.warn(\"Unable to save state to localStorage:\", e);\n }\n } else if (\n typeof stateSlice === \"undefined\" &&\n removeOnUndefined &&\n storage !== undefined\n ) {\n try {\n storage.removeItem(storageKeySerializer(key as string));\n } catch (e) {\n console.warn(\n `Exception on removing/cleaning undefined '${key}' state`,\n e,\n );\n }\n }\n },\n );\n};\n\n// Default merge strategy is a full deep merge.\nexport const defaultMergeReducer = (\n state: any,\n rehydratedState: any,\n action: any,\n) => {\n if (\n (action.type === INIT_ACTION || action.type === UPDATE_ACTION) &&\n rehydratedState\n ) {\n const overwriteMerge = (\n destinationArray: any,\n sourceArray: any,\n options: any,\n ) => sourceArray;\n const options: deepmerge.Options = {\n arrayMerge: overwriteMerge,\n };\n\n state = deepmerge(state, rehydratedState, options);\n }\n\n return state;\n};\n\nexport const localStorageSync =\n (config: LocalStorageConfig) => (reducer: any) => {\n if (\n (config.storage === undefined && !config.checkStorageAvailability) ||\n (config.checkStorageAvailability && checkIsBrowserEnv())\n ) {\n config.storage = localStorage || window.localStorage;\n }\n\n if (config.storageKeySerializer === undefined) {\n config.storageKeySerializer = (key) => key;\n }\n\n if (config.restoreDates === undefined) {\n config.restoreDates = true;\n }\n\n // Use default merge reducer.\n let mergeReducer = config.mergeReducer;\n\n if (mergeReducer === undefined || typeof mergeReducer !== \"function\") {\n mergeReducer = defaultMergeReducer;\n }\n\n const keys = validateStateKeys(config.keys);\n const { storage, storageKeySerializer, restoreDates } = config;\n const rehydratedState = config.rehydrate\n ? rehydrateApplicationState({\n keys,\n storage,\n storageKeySerializer,\n restoreDates,\n })\n : undefined;\n\n return function (state: any, action: any) {\n let nextState: any;\n\n // If state arrives undefined, we need to let it through the supplied reducer\n // in order to get a complete state as defined by user\n if (action.type === INIT_ACTION && !state) {\n nextState = reducer(state, action);\n } else {\n nextState = { ...state };\n }\n\n // Merge the store state with the rehydrated state using\n // either a user-defined reducer or the default.\n nextState = mergeReducer(nextState, rehydratedState, action);\n\n nextState = reducer(nextState, action);\n\n if (action.type !== INIT_ACTION) {\n const {\n storage,\n storageKeySerializer,\n removeOnUndefined,\n syncCondition,\n } = config;\n\n syncStateUpdate({\n state: nextState,\n keys,\n storage,\n storageKeySerializer,\n removeOnUndefined,\n syncCondition,\n });\n }\n\n return nextState;\n };\n };\n\nexport interface LocalStorageConfig {\n keys: Keys;\n rehydrate?: boolean;\n storage?: Storage;\n removeOnUndefined?: boolean;\n restoreDates?: boolean;\n storageKeySerializer?: (key: string) => string;\n syncCondition?: (state: any) => any;\n checkStorageAvailability?: boolean;\n mergeReducer?: (state: any, rehydratedState: any, action: any) => any;\n}\n\ninterface KeyConfiguration {\n [key: string]:\n | string[]\n | number[]\n | KeyConfiguration[]\n | Options\n | ((key: string, value: any) => any);\n}\n\ninterface Options {\n serialize?: (state: any) => any;\n deserialize?: (state: any) => any;\n reviver?: (key: string, value: any) => any;\n replacer?: ((key: string, value: any) => any) | string[];\n encrypt?: (message: string) => string;\n decrypt?: (message: string) => string;\n filter?: string[];\n space?: string | number;\n}\n\nexport type Keys = (KeyConfiguration | Options | string)[];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}