{"version":3,"file":"o3r-store-sync.mjs","sources":["../../src/deep-fill/deep-fill.ts","../../src/sync-storage/storage-sync.ts","../../src/sync-storage/index.ts","../../src/core/storage-sync-helpers.ts","../../src/core/storage-sync.ts","../../src/o3r-store-sync.ts"],"sourcesContent":["import {\n  utils,\n} from '@ama-sdk/core';\nimport {\n  deepFill,\n  type PrimitiveReviverMapper,\n} from '@o3r/core';\n\nconst mapper: PrimitiveReviverMapper[] = [\n  {\n    condition: (data) => data instanceof utils.DateTime,\n    construct: (data) => new utils.DateTime(data)\n  },\n  {\n    condition: (data) => data instanceof utils.Date,\n    construct: (data) => new utils.Date(data)\n  }\n];\n\n/**\n * Deep fill of base object using source\n * It will do a deep merge of the objects, overriding arrays\n * All properties not present in source, but present in base, will remain\n * @param base\n * @param source\n */\nexport function deepFillWithDate<T extends { [x: string]: any }>(base: T, source?: { [x: string]: any }): T {\n  return deepFill(base, source, mapper);\n}\n","import {\n  INIT,\n  UPDATE,\n} from '@ngrx/store';\nimport {\n  deepFill,\n} from '@o3r/core';\nimport type {\n  Logger,\n} from '@o3r/core';\nimport type {\n  StorageKeyConfiguration,\n  StorageKeys,\n  SyncStorageConfig,\n  SyncStorageSyncOptions,\n} from './interfaces';\n\n/**\n * Reviver the date from a JSON field if the string is matching iso format. Return the same value otherwise\n * @param _key JSON item key name\n * @param value JSON item value\n */\nexport const dateReviver = (_key: string, value: any) => {\n  if (typeof value === 'string' && /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z/.test(value)) {\n    return new Date(value);\n  }\n  return value;\n};\n\n/**\n * Dummy reviver returning the value of the field as it is\n * @param _key JSON item key name\n * @param value JSON item value\n */\nconst dummyReviver = (_key: string, value: any) => value;\n\n/**\n * Determine if the code is run in a browser\n */\nconst checkIsBrowserEnv = () => {\n  return typeof window !== 'undefined';\n};\n\n/**\n * Validate the keys structure of the registered stores\n * @param keys map of store to synchronize\n */\nconst validateStateKeys = (keys: StorageKeys) => {\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\n/**\n * Rehydrate the state of the whole application store\n * @param keys Keys of the store to rehydrate\n * @param storage storage when getting the data from\n * @param storageKeySerializer storage key transform function\n * @param restoreDates determine if the date need to be restored\n * @param logger\n */\nexport const rehydrateApplicationState = (\n  keys: StorageKeys,\n  storage: Storage | undefined,\n  storageKeySerializer: (key: string) => string,\n  restoreDates: boolean,\n  logger: Logger = console\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) | undefined;\n    let decrypt: ((arg0: string) => string) | undefined;\n    let syncForFeature = false;\n\n    if (typeof key === 'object') {\n      key = Object.keys(key)[0];\n      syncForFeature = !!(curr?.[key] as SyncStorageSyncOptions)?.syncForFeature;\n\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          logger.error(`Either encrypt or decrypt is not a function on '${curr[key] as string}' 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        logger.error(`Either encrypt or decrypt function is not present on '${curr[key] as string}' 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        const rehydratedState = deserialize ? deserialize(raw) : raw;\n\n        return syncForFeature\n          ? rehydratedState\n          : Object.assign({}, acc, {\n            [key]: rehydratedState\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 | StorageKeyConfiguration | SyncStorageSyncOptions)[]) {\n  return filter.reduce(\n    (memo: { [x: string]: any; [x: number]: any }, attr: string | number | StorageKeyConfiguration | SyncStorageSyncOptions) => {\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: any = attr[key as keyof typeof attr];\n            memo[key] = createStateSlice(existingSlice[key], element);\n          }\n        }\n      }\n      return memo;\n    },\n    {}\n  );\n}\n\n/**\n * Update the state of the store after reviving from storage\n * Note: this function is mainly use for internal process of store synchronization\n * @param state store state\n * @param keys key of the store\n * @param storage storage to use for the synchronization\n * @param storageKeySerializer callback to serialize the store key\n * @param removeOnUndefined Define if the store should be clean in the storage if undefined\n * @param syncCondition callback to define if the synchronization should be process\n * @param logger Logger to report messages\n */\nexport const syncStateUpdate = (\n  state: any,\n  keys: StorageKeys,\n  storage: Storage | undefined,\n  storageKeySerializer: (key: string | number) => string,\n  removeOnUndefined = false,\n  syncCondition?: (state: any) => any,\n  logger: Logger = console\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 | StorageKeyConfiguration | SyncStorageSyncOptions | ((key: string, value: any) => any)): void => {\n    let stateSlice = state?.[key as string];\n    let replacer;\n    let space: string | number | undefined;\n    let encrypt;\n    let syncForFeature = false;\n\n    if (typeof key === 'object') {\n      const name = (Object.keys(key) as (keyof typeof key)[])[0];\n      syncForFeature = !!(key?.[name] as SyncStorageSyncOptions)?.syncForFeature;\n      stateSlice = syncForFeature ? state : state?.[name];\n\n      if (typeof stateSlice !== 'undefined' && key[name]) {\n        // use serialize function if specified.\n        if ((key[name] as any).serialize) {\n          stateSlice = (key[name] as SyncStorageSyncOptions).serialize!(stateSlice);\n        } else {\n          // if serialize function is not specified filter on fields if an array has been provided.\n          let filter: StorageKeyConfiguration[] | undefined;\n          if ((key[name] as any).reduce) {\n            filter = key[name] as StorageKeyConfiguration[];\n          } else if ((key[name] as any).filter) {\n            filter = (key[name] as any).filter as StorageKeyConfiguration[];\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] as any).encrypt && (key[name] as any).decrypt) {\n            if (typeof (key[name] as any).encrypt === 'function') {\n              encrypt = (key[name] as any).encrypt;\n            }\n          } else if ((key[name] as any).encrypt || (key[name] as any).decrypt) {\n            // If one of those is not present, then let know that one is missing\n            logger.error(\n              `Either encrypt or decrypt function is not present on '${key[name] as string}' 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] as any).replacer;\n        space = (key[name] as any).space;\n      }\n\n      key = name;\n    } else if (typeof key === 'string') {\n      stateSlice = syncForFeature ? state : state?.[key];\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        logger.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        logger.warn(`Exception on removing/cleaning undefined '${key as string}' state`, e);\n      }\n    }\n  });\n};\n\nconst defaultMergeReducer = (state: any, rehydratedState: any, action: any) => {\n  if ((action.type === INIT || action.type === UPDATE) && rehydratedState) {\n    const allKeys = Array.from(new Set([...Object.keys(state), ...Object.keys(rehydratedState)]));\n    state = Object.fromEntries(allKeys.map((key) => {\n      // No need to create new object reference if no merge is actually needed\n      if (!rehydratedState[key]) {\n        return [key, state[key]];\n      } else if (state[key]) {\n        return [key, deepFill(state[key], rehydratedState[key])];\n      } else {\n        return [key, rehydratedState[key]];\n      }\n    }));\n  }\n\n  return state;\n};\n\n/**\n * Local and Session storage synchronization helper\n * @param config\n */\nexport const syncStorage = (config: SyncStorageConfig) => (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 logger = config.logger || console;\n\n  const stateKeys = validateStateKeys(config.keys);\n  const rehydratedState = config.rehydrate\n    ? rehydrateApplicationState(stateKeys, config.storage, config.storageKeySerializer, config.restoreDates, logger)\n    : undefined;\n\n  return (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    nextState = action.type === INIT && !state ? reducer(state, action) : { ...state };\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) {\n      syncStateUpdate(\n        nextState,\n        (typeof config.syncKeyCondition === 'function')\n          ? stateKeys.filter((key) => {\n            const keyName = typeof key === 'object' ? Object.keys(key)[0] : key;\n            return config.syncKeyCondition!(keyName, nextState);\n          })\n          : stateKeys,\n        config.storage,\n        config.storageKeySerializer as (key: string | number) => string,\n        config.removeOnUndefined,\n        config.syncCondition,\n        logger\n      );\n    }\n    if (config.postProcess) {\n      config.postProcess(nextState);\n    }\n    return nextState;\n  };\n};\n","/*\n * This file is a fork of the package ngrx-store-localstorage (https://github.com/btroncone/ngrx-store-localstorage) - MIT\n * The following update as been added:\n *   - properly export dateReviver function\n *   - add missing comments\n *   - explicit dependency to @ngrx/store for action names\n *   - change interface names to prefix with \"sync\"\n *   - add logger support\n *   - fix lint according to eslint rules\n *   - split code in several files\n *   - migrate tests to Jest\n */\n\nexport * from './interfaces';\nexport * from './storage-sync';\n","import {\n  createAction,\n  props,\n} from '@ngrx/store';\nimport type {\n  Serializer,\n} from '@o3r/core';\nimport type {\n  SyncStorageConfig,\n} from '../sync-storage';\nimport type {\n  StorageSyncOptions,\n} from './interfaces';\n\n/**\n * Defines if an object is a Serializer\n * @param obj Object to test\n * @returns True if the object is a Serializer\n */\nexport const isSerializer = (obj: any): obj is Serializer<any> => !!(obj.serialize || obj.deserialize || obj.reviver || obj.replacer || obj.initialState);\n\n/**\n * Label of the action to rehydrate the store\n */\nexport const REHYDRATE_ACTION_LABEL = '[storeSync] rehydrate';\n\n/**\n * Action to rehydrate the store\n */\nexport const rehydrateAction = createAction(REHYDRATE_ACTION_LABEL, props<{\n  payload: Record<string, any>;\n}>());\n\n/**\n * Defines if the storage is a non-async storage\n * @param options The storage config\n * @returns in case the storage used is a non-async storage\n */\nexport const isLocalStorageConfig = (options: StorageSyncOptions): options is SyncStorageConfig => !options.storage || options.storage instanceof Storage;\n","import {\n  INIT,\n  UPDATE,\n} from '@ngrx/store';\nimport equal from 'fast-deep-equal';\nimport {\n  deepFillWithDate,\n} from '../deep-fill/deep-fill';\nimport {\n  syncStorage,\n} from '../sync-storage';\nimport type {\n  StorageSyncOptions,\n} from './interfaces';\nimport {\n  StorageSyncConstructorOptions,\n} from './interfaces';\nimport {\n  isLocalStorageConfig,\n  isSerializer,\n  rehydrateAction,\n} from './storage-sync-helpers';\n\n/**\n * Storage synchronizer\n */\nexport class StorageSync {\n  private readonly alreadyHydratedStoreSlices: Set<string> = new Set();\n  private hasHydrated = false;\n  private readonly storeImage: { [key: string]: any } = {};\n\n  public options: StorageSyncOptions;\n\n  constructor(options?: StorageSyncConstructorOptions, extraOptions?: { disableSmartSync: boolean }) {\n    this.options = {\n      keys: [],\n      ...(extraOptions?.disableSmartSync\n        ? {}\n        : {\n          syncKeyCondition: (key, state) => !equal(this.storeImage[key], state[key]),\n          postProcess: (state) => {\n            this.options.keys.forEach((key) => {\n              const keyName: string = typeof key === 'object' ? Object.keys(key)[0] : key;\n              this.storeImage[keyName] = state[keyName];\n            });\n          }\n        }),\n      ...options,\n      storage: options?.storage as unknown as Storage,\n      mergeReducer: typeof options?.mergeReducer === 'function' ? options.mergeReducer : this.mergeReducer\n    };\n  }\n\n  /**\n   * Handle state manipulation in case of store storage sync\n   * Merge strategy is a full merge at init; When a new `store slice` is registered, its initial state is merged with its corresponding storage content\n   * Pass it as mergeReducer callback when calling localStorageSync function from 'ngrx-store-localstorage', in the app\n   * @param state actual state\n   * @param rehydratedState state from storage\n   * @param action Triggered action\n   */\n  public readonly mergeReducer = (state: any, rehydratedState: any, action: any) => {\n    if (rehydratedState) {\n      if (action.type === INIT) {\n        state = deepFillWithDate(state, rehydratedState);\n      }\n      if (action.type === UPDATE && Array.isArray(action.features)) {\n        const notHandledFeatures = action.features.filter((featName: string) => !this.alreadyHydratedStoreSlices.has(featName));\n\n        notHandledFeatures.filter((featName: string) => !!rehydratedState[featName]).forEach((fName: string) => {\n          state[fName] = state[fName] ? deepFillWithDate(state[fName], rehydratedState[fName]) : rehydratedState[fName];\n          this.alreadyHydratedStoreSlices.add(fName);\n        });\n      }\n    }\n    return state;\n  };\n\n  /**\n   * Returns a meta reducer that handles storage sync\n   */\n  public localStorageSync = () => {\n    const base = (reducer: any) => syncStorage({\n      ...this.options,\n      rehydrate: false,\n      storage: this.options.storage as unknown as Storage,\n      syncCondition: () => this.hasHydrated\n    })(reducer);\n\n    return (reducer: any) => {\n      if (isLocalStorageConfig(this.options)) {\n        return syncStorage(this.options)(reducer);\n      }\n\n      return (state: any, action: any) => {\n        let hydratedState = state;\n        if (action.type === rehydrateAction.type) {\n          const hasAlreadyHydrated = this.hasHydrated;\n          this.hasHydrated = true;\n          const initialStates = this.options.keys.reduce((acc: Record<string, any>, key) => {\n            const storeName = Object.keys(key)[0];\n            const storeSynchronizer = (key as any)[storeName];\n            if (isSerializer(storeSynchronizer)) {\n              acc[storeName] = storeSynchronizer.initialState;\n            }\n            return acc;\n          }, {});\n          let overrides = {};\n          if (!hasAlreadyHydrated) {\n            overrides = Object.entries(action.payload).reduce<Record<string, any>>((acc, [storeName, value]) => {\n              if (!initialStates[storeName] || initialStates[storeName] === state[storeName]) {\n                acc[storeName] = value;\n              } else if (initialStates[storeName] !== state[storeName]) {\n                (this.options.logger || console).error(`Unable to rehydrate store \"${storeName}\", it has been modified before being hydrated`);\n              }\n              return acc;\n            }, {});\n          }\n          if (Object.keys(overrides).length > 0) {\n            hydratedState = { ...state, ...overrides };\n          }\n        }\n        return base(reducer)(hydratedState, action);\n      };\n    };\n  };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}