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