Simon LegnerPrettier.ioa905bdf2 years agoHistory
208 lines · 6.3 KB · JavaScript
RawDownload
/* * Cookies.js - 1.2.3 (patched for SameSite=Strict and secure=true) * https://github.com/ScottHamper/Cookies * * This is free and unencumbered software released into the public domain. */(function (global, undefined) {  "use strict";   var factory = function (window) {    if (typeof window.document !== "object") {      throw new Error(        "Cookies.js requires a `window` with a `document` object",      );    }     var Cookies = function (key, value, options) {      return arguments.length === 1        ? Cookies.get(key)        : Cookies.set(key, value, options);    };     // Allows for setter injection in unit tests    Cookies._document = window.document;     // Used to ensure cookie keys do not collide with    // built-in `Object` properties    Cookies._cacheKeyPrefix = "cookey."; // Hurr hurr, :)     Cookies._maxExpireDate = new Date("Fri, 31 Dec 9999 23:59:59 UTC");     Cookies.defaults = {      path: "/",      SameSite: "Strict",      secure: true,    };     Cookies.get = function (key) {      if (Cookies._cachedDocumentCookie !== Cookies._document.cookie) {        Cookies._renewCache();      }       var value = Cookies._cache[Cookies._cacheKeyPrefix + key];       return value === undefined ? undefined : decodeURIComponent(value);    };     Cookies.set = function (key, value, options) {      options = Cookies._getExtendedOptions(options);      options.expires = Cookies._getExpiresDate(        value === undefined ? -1 : options.expires,      );       Cookies._document.cookie = Cookies._generateCookieString(        key,        value,        options,      );       return Cookies;    };     Cookies.expire = function (key, options) {      return Cookies.set(key, undefined, options);    };     Cookies._getExtendedOptions = function (options) {      return {        path: (options && options.path) || Cookies.defaults.path,        domain: (options && options.domain) || Cookies.defaults.domain,        SameSite: (options && options.SameSite) || Cookies.defaults.SameSite,        expires: (options && options.expires) || Cookies.defaults.expires,        secure:          options && options.secure !== undefined            ? options.secure            : Cookies.defaults.secure,      };    };     Cookies._isValidDate = function (date) {      return (        Object.prototype.toString.call(date) === "[object Date]" &&        !isNaN(date.getTime())      );    };     Cookies._getExpiresDate = function (expires, now) {      now = now || new Date();       if (typeof expires === "number") {        expires =          expires === Infinity            ? Cookies._maxExpireDate            : new Date(now.getTime() + expires * 1000);      } else if (typeof expires === "string") {        expires = new Date(expires);      }       if (expires && !Cookies._isValidDate(expires)) {        throw new Error(          "`expires` parameter cannot be converted to a valid Date instance",        );      }       return expires;    };     Cookies._generateCookieString = function (key, value, options) {      key = key.replace(/[^#$&+\^`|]/g, encodeURIComponent);      key = key.replace(/\(/g, "%28").replace(/\)/g, "%29");      value = (value + "").replace(        /[^!#$&-+\--:<-\[\]-~]/g,        encodeURIComponent,      );      options = options || {};       var cookieString = key + "=" + value;      cookieString += options.path ? ";path=" + options.path : "";      cookieString += options.domain ? ";domain=" + options.domain : "";      cookieString += options.SameSite ? ";SameSite=" + options.SameSite : "";      cookieString += options.expires        ? ";expires=" + options.expires.toUTCString()        : "";      cookieString += options.secure ? ";secure" : "";       return cookieString;    };     Cookies._getCacheFromString = function (documentCookie) {      var cookieCache = {};      var cookiesArray = documentCookie ? documentCookie.split("; ") : [];       for (var i = 0; i < cookiesArray.length; i++) {        var cookieKvp = Cookies._getKeyValuePairFromCookieString(          cookiesArray[i],        );         if (          cookieCache[Cookies._cacheKeyPrefix + cookieKvp.key] === undefined        ) {          cookieCache[Cookies._cacheKeyPrefix + cookieKvp.key] =            cookieKvp.value;        }      }       return cookieCache;    };     Cookies._getKeyValuePairFromCookieString = function (cookieString) {      // "=" is a valid character in a cookie value according to RFC6265, so cannot `split('=')`      var separatorIndex = cookieString.indexOf("=");       // IE omits the "=" when the cookie value is an empty string      separatorIndex =        separatorIndex < 0 ? cookieString.length : separatorIndex;       var key = cookieString.substr(0, separatorIndex);      var decodedKey;      try {        decodedKey = decodeURIComponent(key);      } catch (e) {        if (console && typeof console.error === "function") {          console.error('Could not decode cookie with key "' + key + '"', e);        }      }       return {        key: decodedKey,        value: cookieString.substr(separatorIndex + 1), // Defer decoding value until accessed      };    };     Cookies._renewCache = function () {      Cookies._cache = Cookies._getCacheFromString(Cookies._document.cookie);      Cookies._cachedDocumentCookie = Cookies._document.cookie;    };     Cookies._areEnabled = function () {      var testKey = "cookies.js";      var areEnabled = Cookies.set(testKey, 1).get(testKey) === "1";      Cookies.expire(testKey);      return areEnabled;    };     Cookies.enabled = Cookies._areEnabled();     return Cookies;  };  var cookiesExport =    global && typeof global.document === "object" ? factory(global) : factory;   // AMD support  if (typeof define === "function" && define.amd) {    define(function () {      return cookiesExport;    });    // CommonJS/Node.js support  } else if (typeof exports === "object") {    // Support Node.js specific `module.exports` (which can be a function)    if (typeof module === "object" && typeof module.exports === "object") {      exports = module.exports = cookiesExport;    }    // But always support CommonJS module 1.1.1 spec (`exports` cannot be a function)    exports.Cookies = cookiesExport;  } else {    global.Cookies = cookiesExport;  }})(typeof window === "undefined" ? this : window);