optinout.js
Version:
a simple js framework for handling opt-in and opt-out for tracking & cookies
2 lines • 9.49 kB
JavaScript
/* optinout.js - v1.1.2 | Copyright: fabian todt and other contributors | License: https://gitlab.com/optinout/optinout.js */
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.OptInOut=e()}(this,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 o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o])}return t},n=function(n){var o=e({},{namespace:"optInOut",expiration:1/0,domain:!1,path:!1,secure:!1},n),r=function(t){return o.namespace+"."+t},u=function(t){return!(!t||/^(?:expires|max-age|path|domain|secure)$/i.test(t))&&decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*"+encodeURIComponent(r(t)).replace(/[-.+*]/g,"\\$&")+"\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"))},i=function(t,e){if(!t)return null;var n=u(t)||null,o=void 0;try{o=JSON.parse(n)}catch(t){o=null}return e?o[e]||null:o||null},a=function(t,e,n){document.cookie=encodeURIComponent(t)+"="+encodeURIComponent(JSON.stringify(e))+function(t){var e=t||o.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)+(o.domain?"; domain="+o.domain:"")+(o.path?"; path="+o.path:"")+(o.secure?"; secure":"")},c=function(t,e){if(!t||!function(t){return Boolean(u(t))}(t))return!1;if(e){var n=i(t);return delete n[e],a(r(t),n),!0}return a(r(t),"",new Date("01 Jan 1970")),!0};return{get:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return i(t,e)},set:function(n,o,u){return function(n,o,u,c){if(!n||/^(?:expires|max-age|path|domain|secure)$/i.test(n))return!1;var l=void 0;if(c){var s=t({},o,u),d=i(n);l=e({},d,s)}else l=t({},o,u);return a(r(n),l),!0}(n,o,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)}}},o=function(n){var o=e({},{namespace:"optInOut"},n),r=function(t){return t?o.namespace+"."+t:o.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}}(),i=function(t,e){if(u){var n=void 0;try{n=JSON.parse(localStorage.getItem(r(t)))}catch(t){n=null}return e?n[e]||null:n||null}return null},a=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 i(t,e)},set:function(n,o,c){return function(n,o,c,l){if(u){var s=i(n)||{},d=void 0;if(l){var f=t({},o,c);d=e(s,f)}else(d=s)[o]=c;return a(r(n),JSON.stringify(d))}return!1}(n,o,c,!(arguments.length>3&&void 0!==arguments[3])||arguments[3])},delete:function(t){return function(t,e){if(u){if(e){var n=i(t)||{};delete n[e],a(r(t),JSON.stringify(n))}else localStorage.removeItem(r(t));return!0}return!1}(t,arguments.length>1&&void 0!==arguments[1]&&arguments[1])}}},r=function(n){var o=e({},n),r=function(t,e){return e?o[t][e]||null:o[t]||null};return{get:function(t,e){return r(t,e)},set:function(n,u,i,a){return function(n,u,i,a){var c=r(n)||{},l=void 0;if(a){var s=t({},u,i);l=e(c,s)}else(l=c)[u]=i;return o[n]=l,!0}(n,u,i,a)},delete:function(t,e){return function(t,e){return e?delete o[t][e]:delete o[t],!0}(t,e)},getData:function(){return o}}},u=function(t,e){return t.dataset?t.dataset[e]:t.getAttribute?t.getAttribute("data-"+e):null},i=function(){return Boolean(window&&("1"===window.doNotTrack||window.navigator&&("1"===window.navigator.doNotTrack||"yes"===window.navigator.doNotTrack||"1"===window.navigator.msDoNotTrack)))},a=function(t){var r={},u={storages:{cookie:n(),localStorage:o()},services:{},plugins:[],doNotTrack:!1,language:{undefined:"undefined",optedIn:"opted in",optedOut:"opted out",defaults:{}}},a=void 0,c=void 0,l=void 0,s=void 0,d=void 0,f=function(t,e,n){var o=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];if(!l[t])throw new Error("service "+t+" is not configured for optInOut");o&&c[o]?c[o].set(t,e,n):Object.keys(c).forEach(function(o){c[o].set(t,e,n,r)})},p=function(t,e){var n=s[t];!n||n.length<1||n.forEach(function(n){n.call(r,e,t)})},v=function(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o=void 0,r=void 0;if(!t||!l[t])throw new Error("service "+t+" does not exist/is not configured");if(o=l[t],n&&c[n]){var u=e({},c);delete u[n],r=[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 r=Object.keys(c);var i=null;return r.every(function(e){var n=c[e].get(t);return void 0===n||null==n||("optIn"===o.mode?!1===n.optedIn?i=!1:n.optedIn&&!n.optedOut?i=!0:n.optedOut&&!n.optedIn?i=!1:Date.parse(n.optedOut)<Date.parse(n.optedIn)?i=!0:Date.parse(n.optedOut)>Date.parse(n.optedIn)&&(i=!1):"optOut"===o.mode&&(void 0!==n.optedIn&&n.optedIn?n.optedIn&&!n.optedOut?i=!0:Date.parse(n.optedIn)>Date.parse(n.optedOut)?i=!0:Date.parse(n.optedIn)<Date.parse(n.optedOut)&&(i=!1):i=!n.optedOut),null===i)}),i};return r.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:r.getStatus(t,!0)})},r.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:r.getStatus(t,!1)})},r.getOption=function(t){return a[t]},r.getStorage=function(t){return c[t]},r.getService=function(t){return l[t]},r.getStorages=function(){return c},r.getServices=function(){return l},r.getOptions=function(){return a},r.getPlugins=function(){return a.plugins},r.on=function(t,e){var n=s[t]||[];n.push(e),s[t]=n},r.isAllowed=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=v(t,e),o=l[t],r=o.default?o.default:"optIn"!==o.mode;return null===n&&(n=a.doNotTrack?!i()&&r:r),n},r.isSet=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return null!==v(t,e)||!(!a.doNotTrack||!i())},r.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]},a=e({},u,t),c={},Object.keys(a.storages).forEach(function(t){var e=a.storages[t];return"function"==typeof e.get&&"function"==typeof e.set&&(c[t]=a.storages[t]),!0}),delete a.storages,l={},Object.keys(a.services).forEach(function(t){void 0!==a.services[t].mode&&(l[t]=a.services[t])}),delete a.services,s={},a.plugins.forEach(function(t){"function"==typeof t?t(r):"function"==typeof t.setup&&t.setup(r)}),d=e({},u.language,t.language),p("init",r),r},c=function t(e){return t.instance=a(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:o,dataStorage:r,ajaxDataStorage:function(t,n){var o=r(t),u=e({},{ajaxUrl:!1,additionalData:!1,ajaxFunction:null,ajaxOptions:{}},n),i=function(t,n,r,i){var a=o.get(t)||!1;if(o.set(t,n,r,i),u.ajaxFunction){var c=e({},u.additionalData,{service:t,key:n,value:r,update:i,currentValue:a});return u.ajaxFunction(u.ajaxUrl,c,u.ajaxOptions),!0}return!1};return{get:function(t,e){return o.get(t,e)},set:function(t,e,n,o){return i(t,e,n,o)},delete:function(t,e){return function(t,e){return i(t,e,null,!1),o.delete(t,e),!0}(t,e)},getData:function(){return o.getData()}}}},c.plugins={gtmPlugin:function(t){var n=e({},{dataLayerKey:"dataLayer",eventNamespace:!1},t),o=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",o),t.on("optOut",o)}}},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"),o=u(e,"storage")||!1;n&&e.addEventListener("click",function(){t.optIn(n,o)})}),document.querySelectorAll(n.optOutClickSelector).forEach(function(e){var n=u(e,"service"),o=u(e,"storage")||!1;n&&e.addEventListener("click",function(){t.optOut(n,o)})}))}}},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 o="ga-disable-"+n.propertyId,r=function(t,e){t.service&&t.service===n.serviceKey&&("optOut"===e?window[o]=!0:"optIn"===e&&delete window[o])};return{setup:function(t){t.on("optIn",r),t.on("optOut",r)}}}},c});