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