/* * 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);