universal-cookie
Version:
Universal cookies for JavaScript
2 lines (1 loc) • 6.77 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).UniversalCookie=t()}(this,(function(){"use strict";var e,t={};function i(){if(e)return t;e=1,Object.defineProperty(t,"__esModule",{value:!0}),t.parseCookie=h,t.parse=h,t.stringifyCookie=function(e,t){const n=t?.encode||encodeURIComponent,s=[];for(const t of Object.keys(e)){const r=e[t];if(void 0===r)continue;if(!i.test(t))throw new TypeError(`cookie name is invalid: ${t}`);const a=n(r);if(!o.test(a))throw new TypeError(`cookie val is invalid: ${r}`);s.push(`${t}=${a}`)}return s.join("; ")},t.stringifySetCookie=u,t.serialize=u,t.parseSetCookie=function(e,t){const i=t?.decode||f,o=e.length,n=l(e,0,o),s=p(e,0,n),a=-1===s?{name:"",value:i(d(e,0,n))}:{name:d(e,0,s),value:i(d(e,s+1,n))};let c=n+1;for(;c<o;){const t=l(e,c,o),i=p(e,c,t),n=d(e,c,-1===i?t:i),s=-1===i?void 0:d(e,i+1,t);switch(n.toLowerCase()){case"httponly":a.httpOnly=!0;break;case"secure":a.secure=!0;break;case"partitioned":a.partitioned=!0;break;case"domain":a.domain=s;break;case"path":a.path=s;break;case"max-age":s&&r.test(s)&&(a.maxAge=Number(s));break;case"expires":if(!s)break;const e=new Date(s);Number.isFinite(e.valueOf())&&(a.expires=e);break;case"priority":if(!s)break;const t=s.toLowerCase();"low"!==t&&"medium"!==t&&"high"!==t||(a.priority=t);break;case"samesite":if(!s)break;const i=s.toLowerCase();"lax"!==i&&"strict"!==i&&"none"!==i||(a.sameSite=i)}c=t+1}return a},t.stringifySetCookie=u,t.serialize=u;const i=/^[\u0021-\u003A\u003C\u003E-\u007E]+$/,o=/^[\u0021-\u003A\u003C-\u007E]*$/,n=/^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i,s=/^[\u0020-\u003A\u003D-\u007E]*$/,r=/^-?\d+$/,a=Object.prototype.toString,c=(()=>{const e=function(){};return e.prototype=Object.create(null),e})();function h(e,t){const i=new c,o=e.length;if(o<2)return i;const n=t?.decode||f;let s=0;do{const t=p(e,s,o);if(-1===t)break;const r=l(e,s,o);if(t>r){s=e.lastIndexOf(";",t-1)+1;continue}const a=d(e,s,t);void 0===i[a]&&(i[a]=n(d(e,t+1,r))),s=r+1}while(s<o);return i}function u(e,t,r){const c="object"==typeof e?e:{...r,name:e,value:String(t)},h="object"==typeof t?t:r,u=h?.encode||encodeURIComponent;if(!i.test(c.name))throw new TypeError(`argument name is invalid: ${c.name}`);const l=c.value?u(c.value):"";if(!o.test(l))throw new TypeError(`argument val is invalid: ${c.value}`);let p=c.name+"="+l;if(void 0!==c.maxAge){if(!Number.isInteger(c.maxAge))throw new TypeError(`option maxAge is invalid: ${c.maxAge}`);p+="; Max-Age="+c.maxAge}if(c.domain){if(!n.test(c.domain))throw new TypeError(`option domain is invalid: ${c.domain}`);p+="; Domain="+c.domain}if(c.path){if(!s.test(c.path))throw new TypeError(`option path is invalid: ${c.path}`);p+="; Path="+c.path}if(c.expires){if(d=c.expires,"[object Date]"!==a.call(d)||!Number.isFinite(c.expires.valueOf()))throw new TypeError(`option expires is invalid: ${c.expires}`);p+="; Expires="+c.expires.toUTCString()}var d;if(c.httpOnly&&(p+="; HttpOnly"),c.secure&&(p+="; Secure"),c.partitioned&&(p+="; Partitioned"),c.priority){switch("string"==typeof c.priority?c.priority.toLowerCase():void 0){case"low":p+="; Priority=Low";break;case"medium":p+="; Priority=Medium";break;case"high":p+="; Priority=High";break;default:throw new TypeError(`option priority is invalid: ${c.priority}`)}}if(c.sameSite){switch("string"==typeof c.sameSite?c.sameSite.toLowerCase():c.sameSite){case!0:case"strict":p+="; SameSite=Strict";break;case"lax":p+="; SameSite=Lax";break;case"none":p+="; SameSite=None";break;default:throw new TypeError(`option sameSite is invalid: ${c.sameSite}`)}}return p}function l(e,t,i){const o=e.indexOf(";",t);return-1===o?i:o}function p(e,t,i){const o=e.indexOf("=",t);return o<i?o:-1}function d(e,t,i){let o=t,n=i;do{const t=e.charCodeAt(o);if(32!==t&&9!==t)break}while(++o<n);for(;n>o;){const t=e.charCodeAt(n-1);if(32!==t&&9!==t)break;n--}return e.slice(o,n)}function f(e){if(-1===e.indexOf("%"))return e;try{return decodeURIComponent(e)}catch(t){return e}}return t}var o=i();function n(e,t={}){const i=function(e){if(e&&"j"===e[0]&&":"===e[1])return e.substr(2);return e}(e);if(!t.doNotParse)try{return JSON.parse(i)}catch(e){}return e}return class{constructor(e,t={}){this.changeListeners=[],this.HAS_DOCUMENT_COOKIE=!1,this.update=()=>{if(!this.HAS_DOCUMENT_COOKIE)return;const e=this.cookies;this.cookies=o.parse(document.cookie),this._checkChanges(e)};const i="undefined"==typeof document?"":document.cookie;this.cookies=function(e){return"string"==typeof e?o.parse(e):"object"==typeof e&&null!==e?e:{}}(e||i),this.defaultSetOptions=t,this.HAS_DOCUMENT_COOKIE=function(){const e="undefined"==typeof global?void 0:global.TEST_HAS_DOCUMENT_COOKIE;return"boolean"==typeof e?e:"object"==typeof document&&"string"==typeof document.cookie}()}_emitChange(e){for(let t=0;t<this.changeListeners.length;++t)this.changeListeners[t](e)}_checkChanges(e){new Set(Object.keys(e).concat(Object.keys(this.cookies))).forEach((t=>{e[t]!==this.cookies[t]&&this._emitChange({name:t,value:n(this.cookies[t])})}))}_startPolling(){this.pollingInterval=setInterval(this.update,300)}_stopPolling(){this.pollingInterval&&clearInterval(this.pollingInterval)}get(e,t={}){return t.doNotUpdate||this.update(),n(this.cookies[e],t)}getAll(e={}){e.doNotUpdate||this.update();const t={};for(let i in this.cookies)t[i]=n(this.cookies[i],e);return t}set(e,t,i){i=i?Object.assign(Object.assign({},this.defaultSetOptions),i):this.defaultSetOptions;const n="string"==typeof t?t:JSON.stringify(t);this.cookies=Object.assign(Object.assign({},this.cookies),{[e]:n}),this.HAS_DOCUMENT_COOKIE&&(document.cookie=o.serialize(e,n,i)),this._emitChange({name:e,value:t,options:i})}remove(e,t){const i=t=Object.assign(Object.assign(Object.assign({},this.defaultSetOptions),t),{expires:new Date(1970,1,1,0,0,1),maxAge:0});this.cookies=Object.assign({},this.cookies),delete this.cookies[e],this.HAS_DOCUMENT_COOKIE&&(document.cookie=o.serialize(e,"",i)),this._emitChange({name:e,value:void 0,options:t})}addChangeListener(e){this.changeListeners.push(e),this.HAS_DOCUMENT_COOKIE&&1===this.changeListeners.length&&("object"==typeof window&&"cookieStore"in window?window.cookieStore.addEventListener("change",this.update):this._startPolling())}removeChangeListener(e){const t=this.changeListeners.indexOf(e);t>=0&&this.changeListeners.splice(t,1),this.HAS_DOCUMENT_COOKIE&&0===this.changeListeners.length&&("object"==typeof window&&"cookieStore"in window?window.cookieStore.removeEventListener("change",this.update):this._stopPolling())}removeAllChangeListeners(){for(;this.changeListeners.length>0;)this.removeChangeListener(this.changeListeners[0])}}}));