UNPKG

vanilla-cookieconsent

Version:

🍪 Simple cross-browser cookie-consent plugin written in vanilla js.

8 lines (7 loc) 9.64 kB
/*! * CookieConsent 3.1.0 * https://github.com/orestbida/cookieconsent * Author Orest Bida * Released under the MIT License */ const e='opt-in',t='opt-out',o='data-category';class n{constructor(){this.t={mode:e,revision:0,autoClearCookies:!0,manageScriptTags:!0,hideFromBots:!0,cookie:{name:'cc_cookie',expiresAfterDays:182,domain:'',path:'/',secure:!0,sameSite:'Lax'}},this.o={i:{},l:'',_:{},u:{},p:{},m:[],C:!1,v:null,S:null,h:null,D:'',T:!0,N:!1,k:!0,j:[],O:!1,A:'',I:!1,R:[],F:[],L:[],M:[],P:!1,J:{},U:{},B:{},G:{},H:{},q:[]},this.K={},this.V={W:'cc:onFirstConsent',X:'cc:onConsent',Y:'cc:onChange'}}}const s=new n,c=(e,t)=>e.indexOf(t),a=(e,t)=>-1!==c(e,t),r=e=>Array.isArray(e),i=e=>'string'==typeof e,l=e=>!!e&&'object'==typeof e&&!r(e),d=e=>'function'==typeof e,f=e=>Object.keys(e),_=e=>Array.from(new Set(e)),u=e=>document.createElement(e),p=(e,t,o)=>e.setAttribute(t,o),g=(e,t,o)=>{e.removeAttribute(o?'data-'+t:t)},m=(e,t,o)=>e.getAttribute(o?'data-'+t:t),C=e=>{if('object'!=typeof e)return e;if(e instanceof Date)return new Date(e.getTime());let t=Array.isArray(e)?[]:{};for(let o in e){let n=e[o];t[o]=C(n)}return t},v=()=>{const e={},{R:t,J:o,U:n}=s.o;for(const s of t)e[s]=S(n[s],f(o[s]));return e},y=()=>{const e=s.t.cookie.expiresAfterDays;return d(e)?e(s.o.A):e},S=(e,t)=>{const o=e||[],n=t||[];return o.filter((e=>!a(n,e))).concat(n.filter((e=>!a(o,e))))},h=e=>{s.o.F=_(e),s.o.A=(()=>{let e='custom';const{F:t,R:o,L:n}=s.o,c=t.length;return c===o.length?e='all':c===n.length&&(e='necessary'),e})()},w=(e,t,o)=>{const{Y:n,X:c,W:a,Z:r,$:i,ee:l}=s.K,f=s.V,_={cookie:s.o.p};e===f.W?d(a)&&a(C(_)):e===f.X?d(c)&&c(C(_)):(_.changedCategories=s.o.j,_.changedServices=s.o.G,d(n)&&n(C(_))),((e,t)=>{dispatchEvent(new CustomEvent(e,{detail:t}))})(e,C(_))},D=(e,t)=>{try{return e()}catch(e){return!t&&console.warn('CookieConsent:',e),!1}},b=e=>{const{U:t,G:n,R:c,J:r,q:i,p:l,j:f}=s.o;for(const e of c){const o=n[e]||t[e]||[];for(const n of o){const o=r[e][n];if(!o)continue;const{onAccept:s,onReject:c}=o;!o.te&&a(t[e],n)?(o.te=!0,d(s)&&s()):o.te&&!a(t[e],n)&&(o.te=!1,d(c)&&c())}}if(!s.t.manageScriptTags)return;const _=i,C=e||l.categories||[],v=(e,s)=>{if(s>=e.length)return;const c=i[s];if(c.oe)return v(e,s+1);const r=c.ne,l=c.se,d=c.ce,_=a(C,l),y=!!d&&a(t[l],d);if(!d&&!c.ae&&_||!d&&c.ae&&!_&&a(f,l)||d&&!c.ae&&y||d&&c.ae&&!y&&a(n[l]||[],d)){c.oe=!0;const t=m(r,'type',!0);g(r,'type',!!t),g(r,o);let n=m(r,'src',!0);n&&g(r,'src',!0);const a=u('script');a.textContent=r.innerHTML;for(const{nodeName:e}of r.attributes)p(a,e,r[e]||m(r,e));t&&(a.type=t),n?a.src=n:n=r.src;const i=!!n&&(!t||['text/javascript','module'].includes(t));if(i&&(a.onload=a.onerror=()=>{v(e,++s)}),r.replaceWith(a),i)return}v(e,++s)};v(_,0)},T=e=>D((()=>localStorage.removeItem(e))),N=(e,t)=>{if(t instanceof RegExp)return e.filter((e=>t.test(e)));{const o=c(e,t);return o>-1?[e[o]]:[]}},k=e=>{const{hostname:t,protocol:o}=location,{name:n,path:c,domain:r,sameSite:i,useLocalStorage:l,secure:d}=s.t.cookie,f=e?(()=>{const e=s.o.h,t=e?new Date-e:0;return 864e5*y()-t})():864e5*y(),_=new Date;_.setTime(_.getTime()+f),s.o.p.expirationTime=_.getTime();const u=JSON.stringify(s.o.p);let p=n+'='+encodeURIComponent(u)+(0!==f?'; expires='+_.toUTCString():'')+'; Path='+c+'; SameSite='+i;a(t,'.')&&(p+='; Domain='+r),d&&'https:'===o&&(p+='; Secure'),l?((e,t)=>{D((()=>localStorage.setItem(e,t)))})(n,u):document.cookie=p,s.o.p},j=(e,t,o)=>{if(0===e.length)return;const n=o||s.t.cookie.domain,c=t||s.t.cookie.path,a='www.'===n.slice(0,4),r=a&&n.substring(4),i=(e,t)=>{t&&'.'!==t.slice(0,1)&&(t='.'+t),document.cookie=e+'=; path='+c+(t?'; domain='+t:'')+'; expires=Thu, 01 Jan 1970 00:00:01 GMT;'};for(const t of e)i(t,o),o||i(t,n),a&&i(t,r)},E=e=>{const t=e||s.t.cookie.name,o=s.t.cookie.useLocalStorage;return((e,t)=>{let o;return o=D((()=>JSON.parse(t?e:decodeURIComponent(e))),!0)||{},o})(o?(n=t,D((()=>localStorage.getItem(n)))||''):x(t,!0),o);var n},x=(e,t)=>{const o=document.cookie.match('(^|;)\\s*'+e+'\\s*=\\s*([^;]+)');return o?t?o.pop():e:''},O=e=>{const t=document.cookie.split(/;\s*/),o=[];for(const n of t){let t=n.split('=')[0];e?D((()=>{e.test(t)&&o.push(t)})):o.push(t)}return o},A=(o,n=[])=>{((e,t)=>{const{R:o,F:n,L:c,re:l,B:d,M:_,J:u}=s.o;let p=[];if(e){r(e)?p.push(...e):i(e)&&(p='all'===e?o:[e]);for(const e of o)d[e]=a(p,e)?f(u[e]):[]}else p=[...n,..._];p=p.filter((e=>!a(o,e)||!a(t,e))),p.push(...c),h(p)})(o,n),(()=>{const e=s.o,{B:t,L:o,U:n,J:c,R:r}=e,i=r;e.H=C(n);for(const s of i){const r=c[s],i=f(r),l=t[s]&&t[s].length>0,d=a(o,s);if(0!==i.length){if(n[s]=[],d)n[s].push(...i);else if(l){const e=t[s];n[s].push(...e)}else n[s]=e.B[s];n[s]=_(n[s])}}})(),(()=>{const o=s.o;o.j=s.t.mode===t&&o.T?S(o.M,o.F):S(o.F,o.p.categories);let n=o.j.length>0,c=!1;for(const e of o.R)o.G[e]=S(o.U[e],o.H[e]),o.G[e].length>0&&(c=!0);o.S||(o.S=new Date),o.D||(o.D=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)))),o.p={categories:C(o.F),revision:s.t.revision,data:o.v,consentTimestamp:o.S.toISOString(),consentId:o.D,services:C(o.U),languageCode:s.o.l},o.h&&(o.p.lastConsentTimestamp=o.h.toISOString());let r=!1;const i=n||c;(o.T||i)&&(o.T&&(o.T=!1,r=!0),o.h=o.h?new Date:o.S,o.p.lastConsentTimestamp=o.h.toISOString(),k(),s.t.autoClearCookies&&(r||i)&&(e=>{const t=s.o,o=O(),n=(e=>{const t=s.o;return(e?t.R:t.j).filter((e=>{const o=t.I[e];return!!o&&!o.readOnly&&!!o.autoClear}))})(e);for(const e in t.G)for(const n of t.G[e]){const s=t.J[e][n].cookies;if(!a(t.U[e],n)&&s)for(const e of s){const t=N(o,e.name);j(t,e.path,e.domain)}}for(const s of n){const n=t.I[s].autoClear,c=n&&n.cookies||[],r=a(t.j,s),i=!a(t.F,s),l=r&&i;if(e?i:l){n.reloadPage&&l&&(t.O=!0);for(const e of c){const t=N(o,e.name);j(t,e.path,e.domain)}}}})(r),b()),r&&(w(s.V.W),w(s.V.X),s.t.mode===e)||(i&&w(s.V.Y),o.O&&(o.O=!1,location.reload()))})()},I=e=>{const t=s.o.T?[]:s.o.F;return a(t,e)},R=(e,t)=>{const{R:o,J:n}=s.o;if(!(e&&t&&i(t)&&a(o,t)&&0!==f(n[t]).length))return!1;A()},F=(e,t)=>{const o=s.o.T?[]:s.o.U[t]||[];return a(o,e)},L=e=>''!==x(e,!0),M=(e,t,o)=>{let n=[];const s=e=>{if(i(e)){let t=x(e);''!==t&&n.push(t)}else n.push(...O(e))};if(r(e))for(let t of e)s(t);else s(e);j(n,t,o)},P=()=>{const{A:e,U:t}=s.o,{accepted:o,rejected:n}=(()=>{const{T:e,F:t,R:o}=s.o;return{accepted:t,rejected:e?[]:o.filter((e=>!a(t,e)))}})();return C({acceptType:e,acceptedCategories:o,rejectedCategories:n,acceptedServices:t,rejectedServices:v()})},J=(e,t)=>{let o=document.querySelector('script[src="'+e+'"]');return new Promise((n=>{if(o)return n(!0);if(o=u('script'),l(t))for(const e in t)p(o,e,t[e]);var s,c;o.onload=()=>n(!0),o.onerror=()=>{o.remove(),n(!1)},o.src=e,s=document.head,c=o,s.appendChild(c)}))},U=e=>{let t,o=e.value,n=e.mode,c=!1;const a=s.o;if('update'===n){a.v=t=B('data');const e=typeof t==typeof o;if(e&&'object'==typeof t){!t&&(t={});for(let e in o)t[e]!==o[e]&&(t[e]=o[e],c=!0)}else!e&&t||t===o||(t=o,c=!0)}else t=o,c=!0;return c&&(a.v=t,a.p.data=t,k(!0)),c},B=(e,t)=>{const o=E(t);return e?o[e]:o},G=e=>{const t=s.t,o=s.o.i;return e?t[e]||o[e]:{...t,...o,cookie:{...t.cookie}}},H=()=>!s.o.T,q=async e=>{const{o:n,t:c,V:d}=s,_=window;if(!_._ccRun){if(_._ccRun=!0,(e=>{const{ie:n,t:c,o:r}=s,i=c,d=r,{cookie:_}=i,u=s.K,p=e.cookie,g=e.categories,C=f(g)||[],v=navigator,y=document;n.le=y,_.domain=location.hostname,d.i=e,d.I=g,d.R=C,u.W=e.onFirstConsent,u.X=e.onConsent,u.Y=e.onChange;const{mode:S,autoClearCookies:h,revision:w,manageScriptTags:D,hideFromBots:b}=e;S===t&&(i.mode=S),'boolean'==typeof h&&(i.autoClearCookies=h),'boolean'==typeof D&&(i.manageScriptTags=D),'number'==typeof w&&w>=0&&(i.revision=w,d.N=!0),!1===b&&(i.hideFromBots=!1),!0===i.hideFromBots&&v&&(d.P=v.userAgent&&/bot|crawl|spider|slurp|teoma/i.test(v.userAgent)||v.webdriver),l(p)&&(i.cookie={..._,...p}),i.autoClearCookies,d.N,i.manageScriptTags,(e=>{const{I:t,J:o,U:n,B:c,L:a}=s.o;for(let r of e){const e=t[r],i=e.services||{},d=l(i)&&f(i)||[];o[r]={},n[r]=[],c[r]=[],e.readOnly&&(a.push(r),n[r]=d),s.ie.de[r]={};for(let e of d){const t=i[e];t.te=!1,o[r][e]=t}}})(C),(()=>{if(!s.t.manageScriptTags)return;const e=s.o,t=(n=document,c='script['+o+']',n.querySelectorAll(c));var n,c;for(const n of t){let t=m(n,o),s=n.dataset.service||'',c=!1;if(t&&'!'===t.charAt(0)&&(t=t.slice(1),c=!0),'!'===s.charAt(0)&&(s=s.slice(1),c=!0),a(e.R,t)&&(e.q.push({ne:n,oe:!1,ae:c,se:t,ce:s}),s)){const o=e.J[t];o[s]||(o[s]={te:!1})}}})()})(e),n.P)return;if((()=>{const e=s.o,o=s.t,n=E(),{categories:c,services:a,consentId:l,consentTimestamp:d,lastConsentTimestamp:f,data:_,revision:u}=n,p=r(c);e.p=n,e.D=l;const g=!!l&&i(l);e.S=d,e.S&&(e.S=new Date(d)),e.h=f,e.h&&(e.h=new Date(f)),e.v=void 0!==_?_:null,e.N&&g&&u!==o.revision&&(e.k=!1),e.T=!(g&&e.k&&e.S&&e.h&&p),o.cookie.useLocalStorage&&!e.T&&(e.T=(new Date).getTime()>(n.expirationTime||0),e.T&&T(o.cookie.name)),e.T,(()=>{const e=s.o;for(const o of e.R){const n=e.I[o];if(n.readOnly||n.enabled){e.M.push(o);const n=e.J[o]||{};for(let s in n)e.B[o].push(s),e.i.mode===t&&e.U[o].push(s)}}})(),e.T?o.mode===t&&(e.F=[...e.M]):(e.U={...e.U,...a},e.B={...e.U},h([...e.L,...c]))})(),H())return b(),w(d.X);c.mode===t&&b(n.M)}},z=e=>{const{name:t,path:o,domain:c,useLocalStorage:a}=s.t.cookie;e&&(a?T(t):M(t,o,c));for(const{fe:e,_e:t,ue:o}of s.o.m)e.removeEventListener(t,o);const r=new n;for(const e in s)s[e]=r[e];window._ccRun=!1};export{A as acceptCategory,R as acceptService,I as acceptedCategory,F as acceptedService,M as eraseCookies,G as getConfig,B as getCookie,P as getUserPreferences,J as loadScript,z as reset,q as run,U as setCookieData,H as validConsent,L as validCookie};