UNPKG

ngrx-store-localstorage

Version:
1 lines 19.5 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: ` + `Expected type of string, got ${typeof attr}`\n );\n }\n return key;\n });\n};\n\nexport const rehydrateApplicationState = (\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 (typeof curr[key].encrypt === 'function' && typeof curr[key].decrypt === 'function') {\n decrypt = curr[key].decrypt;\n } else {\n console.error(`Either encrypt or decrypt is not a function on '${curr[key]}' key object.`);\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(`Either encrypt or decrypt function is not present on '${curr[key]}' key object.`);\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 (stateSlice === 'null' || stateSlice === 'true' || stateSlice === 'false' || isObjectRegex.test(stateSlice.charAt(0))) {\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(existingSlice: any, filter: (string | number | KeyConfiguration | Options)[]) {\n return filter.reduce(\n (memo: { [x: string]: any; [x: number]: any }, attr: string | number | KeyConfiguration | Options) => {\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: any,\n keys: Keys,\n storage: Storage,\n storageKeySerializer: (key: string | number) => 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((key: string | KeyConfiguration | Options | ((key: string, value: any) => any)): 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' ? stateSlice : JSON.stringify(stateSlice, replacer, space)\n );\n }\n storage.setItem(\n storageKeySerializer(key as string),\n typeof stateSlice === 'string' ? stateSlice : JSON.stringify(stateSlice, replacer, space)\n );\n } catch (e) {\n console.warn('Unable to save state to localStorage:', e);\n }\n } else if (typeof stateSlice === 'undefined' && removeOnUndefined && storage !== undefined) {\n try {\n storage.removeItem(storageKeySerializer(key as string));\n } catch (e) {\n console.warn(`Exception on removing/cleaning undefined '${key}' state`, e);\n }\n }\n });\n};\n\n// Default merge strategy is a full deep merge.\nexport const defaultMergeReducer = (state: any, rehydratedState: any, action: any) => {\n if ((action.type === INIT_ACTION || action.type === UPDATE_ACTION) && rehydratedState) {\n const overwriteMerge = (destinationArray: any, sourceArray: any, options: any) => 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 = (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 stateKeys = validateStateKeys(config.keys);\n const rehydratedState = config.rehydrate\n ? rehydrateApplicationState(stateKeys, config.storage, config.storageKeySerializer, config.restoreDates)\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 syncStateUpdate(\n nextState,\n stateKeys,\n config.storage,\n config.storageKeySerializer as (key: string | number) => string,\n config.removeOnUndefined,\n config.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]: string[] | number[] | KeyConfiguration[] | Options | ((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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"}