Source: store/index.js

/*
 * @Author: zhangyu
 * @Email: zhangdulin@outlook.com
 * @Date: 2021-06-23 20:21:44
 * @LastEditors: zhangyu
 * @LastEditTime: 2021-06-25 17:09:57
 * @Description: 
 */
import { decode_url_param } from '../transfer/jsonString'

//------------------------------- cookie.js -------------------------------
//解析cookie值
function parseCookieValue(s) {
  if (s.indexOf('"') === 0) s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');

  return decode_url_param(s.replace(/\+/g, ' '));
}

//读取cookie值或返回整个对象
/**
 * @description: 
 * @param {*} key
 * @return {*}
 */
function getCookie(key) {
  var result = key ? undefined : {},
    cookies = document.cookie ? document.cookie.split('; ') : [];

  for (var i = 0, len = cookies.length; i < len; i++) {
    var parts = cookies[i].split('='),
      name = decode_url_param(parts[0]),
      cookie = parts.slice(1).join('=');

    if (key && key === name) {
      result = parseCookieValue(cookie);
      break;
    }

    if (!key && (cookie = parseCookieValue(cookie)) !== undefined) {
      result[name] = cookie;
    }
  }

  return result;
}

//设置cookie
function setCookie(key, value, ops) {
  ops = ops || {};

  var expires = ops.expires;
  if (typeof expires === "number") expires = new Date().add("d", expires);

  document.cookie = [
    encode_url_param(key), '=', encode_url_param(value),
    expires ? '; expires=' + expires.toUTCString() : '',
    ops.path ? '; path=' + ops.path : '',
    ops.domain ? '; domain=' + ops.domain : '',
    ops.secure ? '; secure' : ''
  ].join('');
}

//移除cookie
function removeCookie(key) {
  if (getCookie(key) != undefined) setCookie(key, '', { expires: -1 });
}

//清空cookie
function clearCookie() {
  var cookies = document.cookie ? document.cookie.split('; ') : [];
  for (var i = 0, len = cookies.length; i < len; i++) {
    var parts = cookies[i].split('='),
      key = decode_url_param(parts[0]);

    removeCookie(key);
  }
}

/**
 * @description: 获取设置清除cookie 
 * @param {*}
 * @return {object}
 */
export var cookie = {
  get: getCookie,
  set: setCookie,
  remove: removeCookie,
  clear: clearCookie
};

//------------------------------- Storage.js -------------------------------
//type:localStorage | sessionStorage
//useCookie:在其它特性不支持的情况下是否启用cookie模拟
/**
 * @description: 获取设置清除Storage 
 * @param {*} type type:localStorage | sessionStorage
 * @param {*} useCookie 是否用cookie 模拟store
 * @return {object}
 */
export function storage(type, useCookie) {
  var isLocal = type != "sessionStorage";

  if (!isLocal && !location.host) return;

  var STORE_NAME = type,

    storage = window[STORE_NAME],
    adapter = storage && "getItem" in storage ? "storage" : null;

  if (!adapter) {
    var userData = document.documentElement, TEST_KEY = "_TEST_";

    try {
      //ie userdata
      userData.addBehavior('#default#userdata');
      //7天后过期
      if (isLocal) userData.expires = new Date().add("d", 7).toUTCString();

      STORE_NAME = location.hostname || "local";
      userData.save(STORE_NAME);

      storage = {
        getItem: function (key) {
          userData.load(STORE_NAME);
          return userData.getAttribute(key);
        },
        setItem: function (key, value) {
          userData.setAttribute(key, value);
          userData.save(STORE_NAME);
        },
        removeItem: function (key) {
          userData.removeAttribute(key);
          userData.save(STORE_NAME);
        },
        clear: function () {
          userData.load(STORE_NAME);

          var now = new Date().add("d", -1);
          userData.expires = now.toUTCString();
          userData.save(STORE_NAME);
        }
      };

      if (storage.getItem(TEST_KEY) === undefined) {
        storage.setItem(TEST_KEY, 1);
        storage.removeItem(TEST_KEY);
      }

      adapter = "userdata";
    } catch (e) { }

    //cookie 模拟
    if (!adapter && useCookie) {

      storage = {
        getItem: getCookie,
        //setItem: setCookie,
        setItem: isLocal ? function (key, value) {
          setCookie(key, value, { expires: 7 });
        } : setCookie,
        removeItem: removeCookie,
        clear: clearCookie
      };

      adapter = "cookie";
    }
  }

  var support = !!adapter;

  var store = {
    //是否支持本地缓存
    support: support,

    //适配器:storage|userdata|cookie|null
    adapter: adapter,

    //获取本地缓存
    get: function (key, isJSON) {
      if (support) {
        try {
          var value = storage.getItem(key);
          return isJSON ? (value ? JSON.parse(value) : null) : value;
        } catch (e) { }
      }

      return undefined;
    },
    //设置本地缓存
    set: function (key, value) {
      if (support) {
        try {
          storage.setItem(key, typeof value == "string" ? value : JSON.stringify(value));
          return true;
        } catch (e) { }
      }

      return false;
    },
    //删除本地缓存
    remove: function (key) {
      if (support) {
        try {
          storage.removeItem(key);
          return true;
        } catch (e) { }
      }

      return false;
    },
    //清空本地缓存
    clear: function () {
      if (support) {
        try {
          storage.clear();
          return true;
        } catch (e) { }
      }

      return false;
    }
  };

  return store;
}


export default {
  cookie,
  storage
}