optinout.js
Version:
a simple js framework for handling opt-in and opt-out for tracking & cookies
2 lines • 9.35 kB
JavaScript
/* optinout.js - v1.1.2 | Copyright: fabian todt and other contributors | License: https://gitlab.com/optinout/optinout.js */
var OptInOut=function(){"use strict";var t=function(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t},e=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},n=function(n){var r=e({},{namespace:"optInOut",expiration:1/0,domain:!1,path:!1,secure:!1},n),o=function(t){return r.namespace+"."+t},u=function(t){return!(!t||/^(?:expires|max-age|path|domain|secure)$/i.test(t))&&decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*"+encodeURIComponent(o(t)).replace(/[-.+*]/g,"\\$&")+"\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"))},a=function(t,e){if(!t)return null;var n=u(t)||null,r=void 0;try{r=JSON.parse(n)}catch(t){r=null}return e?r[e]||null:r||null},i=function(t,e,n){document.cookie=encodeURIComponent(t)+"="+encodeURIComponent(JSON.stringify(e))+function(t){var e=t||r.expiration,n=void 0;switch(e.constructor){case Number:n=e===1/0?"; expires=Fri, 31 Dec 9999 23:59:59 GMT":"; max-age="+e;break;case String:n="; expires="+e;break;case Date:n="; expires="+e.toUTCString();break;default:n=""}return n}(n)+(r.domain?"; domain="+r.domain:"")+(r.path?"; path="+r.path:"")+(r.secure?"; secure":"")},c=function(t,e){if(!t||!function(t){return Boolean(u(t))}(t))return!1;if(e){var n=a(t);return delete n[e],i(o(t),n),!0}return i(o(t),"",new Date("01 Jan 1970")),!0};return{get:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return a(t,e)},set:function(n,r,u){return function(n,r,u,c){if(!n||/^(?:expires|max-age|path|domain|secure)$/i.test(n))return!1;var l=void 0;if(c){var s=t({},r,u),d=a(n);l=e({},d,s)}else l=t({},r,u);return i(o(n),l),!0}(n,r,u,!(arguments.length>3&&void 0!==arguments[3])||arguments[3])},delete:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return c(t,e)}}},r=function(n){var r=e({},{namespace:"optInOut"},n),o=function(t){return t?r.namespace+"."+t:r.namespace},u=function(){try{var t="__storage_test__";return localStorage.setItem(t,"__storage_test__"),localStorage.removeItem(t),!0}catch(t){return t instanceof DOMException&&(22===t.code||1014===t.code||"QuotaExceededError"===t.name||"NS_ERROR_DOM_QUOTA_REACHED"===t.name)&&0!==localStorage.length}}(),a=function(t,e){if(u){var n=void 0;try{n=JSON.parse(localStorage.getItem(o(t)))}catch(t){n=null}return e?n[e]||null:n||null}return null},i=function(t,e){return!!u&&(localStorage.setItem(t,e),!0)};return{get:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return a(t,e)},set:function(n,r,c){return function(n,r,c,l){if(u){var s=a(n)||{},d=void 0;if(l){var f=t({},r,c);d=e(s,f)}else(d=s)[r]=c;return i(o(n),JSON.stringify(d))}return!1}(n,r,c,!(arguments.length>3&&void 0!==arguments[3])||arguments[3])},delete:function(t){return function(t,e){if(u){if(e){var n=a(t)||{};delete n[e],i(o(t),JSON.stringify(n))}else localStorage.removeItem(o(t));return!0}return!1}(t,arguments.length>1&&void 0!==arguments[1]&&arguments[1])}}},o=function(n){var r=e({},n),o=function(t,e){return e?r[t][e]||null:r[t]||null};return{get:function(t,e){return o(t,e)},set:function(n,u,a,i){return function(n,u,a,i){var c=o(n)||{},l=void 0;if(i){var s=t({},u,a);l=e(c,s)}else(l=c)[u]=a;return r[n]=l,!0}(n,u,a,i)},delete:function(t,e){return function(t,e){return e?delete r[t][e]:delete r[t],!0}(t,e)},getData:function(){return r}}},u=function(t,e){return t.dataset?t.dataset[e]:t.getAttribute?t.getAttribute("data-"+e):null},a=function(){return Boolean(window&&("1"===window.doNotTrack||window.navigator&&("1"===window.navigator.doNotTrack||"yes"===window.navigator.doNotTrack||"1"===window.navigator.msDoNotTrack)))},i=function(t){var o={},u={storages:{cookie:n(),localStorage:r()},services:{},plugins:[],doNotTrack:!1,language:{undefined:"undefined",optedIn:"opted in",optedOut:"opted out",defaults:{}}},i=void 0,c=void 0,l=void 0,s=void 0,d=void 0,f=function(t,e,n){var r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];if(!l[t])throw new Error("service "+t+" is not configured for optInOut");r&&c[r]?c[r].set(t,e,n):Object.keys(c).forEach(function(r){c[r].set(t,e,n,o)})},p=function(t,e){var n=s[t];!n||n.length<1||n.forEach(function(n){n.call(o,e,t)})},v=function(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=void 0,o=void 0;if(!t||!l[t])throw new Error("service "+t+" does not exist/is not configured");if(r=l[t],n&&c[n]){var u=e({},c);delete u[n],o=[n].concat(function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e<t.length;e++)n[e]=t[e];return n}return Array.from(t)}(Object.keys(u)))}else o=Object.keys(c);var a=null;return o.every(function(e){var n=c[e].get(t);return void 0===n||null==n||("optIn"===r.mode?!1===n.optedIn?a=!1:n.optedIn&&!n.optedOut?a=!0:n.optedOut&&!n.optedIn?a=!1:Date.parse(n.optedOut)<Date.parse(n.optedIn)?a=!0:Date.parse(n.optedOut)>Date.parse(n.optedIn)&&(a=!1):"optOut"===r.mode&&(void 0!==n.optedIn&&n.optedIn?n.optedIn&&!n.optedOut?a=!0:Date.parse(n.optedIn)>Date.parse(n.optedOut)?a=!0:Date.parse(n.optedIn)<Date.parse(n.optedOut)&&(a=!1):a=!n.optedOut),null===a)}),a};return o.optIn=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=new Date;f(t,"optedIn",n,e),p("optIn",{service:t,storage:e,date:n,status:o.getStatus(t,!0)})},o.optOut=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=new Date;f(t,"optedOut",n,e),p("optOut",{service:t,storage:e,date:n,status:o.getStatus(t,!1)})},o.getOption=function(t){return i[t]},o.getStorage=function(t){return c[t]},o.getService=function(t){return l[t]},o.getStorages=function(){return c},o.getServices=function(){return l},o.getOptions=function(){return i},o.getPlugins=function(){return i.plugins},o.on=function(t,e){var n=s[t]||[];n.push(e),s[t]=n},o.isAllowed=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=v(t,e),r=l[t],o=r.default?r.default:"optIn"!==r.mode;return null===n&&(n=i.doNotTrack?!a()&&o:o),n},o.isSet=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return null!==v(t,e)||!(!i.doNotTrack||!a())},o.getStatus=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=null!==e?e:v(t);return!0===n?d.optedIn:!1===n?d.optedOut:[d.undefined,d.defaults[t]||null]},i=e({},u,t),c={},Object.keys(i.storages).forEach(function(t){var e=i.storages[t];return"function"==typeof e.get&&"function"==typeof e.set&&(c[t]=i.storages[t]),!0}),delete i.storages,l={},Object.keys(i.services).forEach(function(t){void 0!==i.services[t].mode&&(l[t]=i.services[t])}),delete i.services,s={},i.plugins.forEach(function(t){"function"==typeof t?t(o):"function"==typeof t.setup&&t.setup(o)}),d=e({},u.language,t.language),p("init",o),o},c=function t(e){return t.instance=i(e)};return c.isAllowed=function(t,e){return void 0!==c.instance?c.instance.isAllowed(t,e):null},c.getStatus=function(t){return void 0!==c.instnace?c.instance.getStatus(t):null},c.optIn=function(t,e){return void 0!==c.instance?c.instance.optIn(t,e):null},c.optOut=function(t,e){return void 0!==c.instance?c.instance.optOut(t,e):null},c.getInstance=function(){return void 0!==c.instance?c.instance:null},c.storageAdapters={cookieStorage:n,localStorage:r,dataStorage:o,ajaxDataStorage:function(t,n){var r=o(t),u=e({},{ajaxUrl:!1,additionalData:!1,ajaxFunction:null,ajaxOptions:{}},n),a=function(t,n,o,a){var i=r.get(t)||!1;if(r.set(t,n,o,a),u.ajaxFunction){var c=e({},u.additionalData,{service:t,key:n,value:o,update:a,currentValue:i});return u.ajaxFunction(u.ajaxUrl,c,u.ajaxOptions),!0}return!1};return{get:function(t,e){return r.get(t,e)},set:function(t,e,n,r){return a(t,e,n,r)},delete:function(t,e){return function(t,e){return a(t,e,null,!1),r.delete(t,e),!0}(t,e)},getData:function(){return r.getData()}}}},c.plugins={gtmPlugin:function(t){var n=e({},{dataLayerKey:"dataLayer",eventNamespace:!1},t),r=function(t,e){window[n.dataLayerKey].push({event:function(t){return n.eventNamespace?n.eventNamespace+"."+t:t}(e),service:t.service||""})};return{setup:function(t){t.on("optIn",r),t.on("optOut",r)}}},linkPlugin:function(t){var n=e({},{optInClickSelector:".optInOut-optIn",optOutClickSelector:".optInOut-optOut"},t);return{setup:function(t){document&&document.querySelectorAll&&n.optInClickSelector&&(document.querySelectorAll(n.optInClickSelector).forEach(function(e){var n=u(e,"service"),r=u(e,"storage")||!1;n&&e.addEventListener("click",function(){t.optIn(n,r)})}),document.querySelectorAll(n.optOutClickSelector).forEach(function(e){var n=u(e,"service"),r=u(e,"storage")||!1;n&&e.addEventListener("click",function(){t.optOut(n,r)})}))}}},reloadPlugin:function(){var t=function(){window.location.reload()};return{setup:function(e){e.on("optIn",t),e.on("optOut",t)}}},analyticsPlugin:function(t){var n=e({},{serviceKey:"analytics",propertyId:!1},t);if(!n.propertyId)throw new Error("propertyId needs to be set in Analytics plugin");var r="ga-disable-"+n.propertyId,o=function(t,e){t.service&&t.service===n.serviceKey&&("optOut"===e?window[r]=!0:"optIn"===e&&delete window[r])};return{setup:function(t){t.on("optIn",o),t.on("optOut",o)}}}},c}();