storm-cookie-banner
Advanced tools
Comparing version 1.0.2 to 1.1.0
import CookieBanner from '../src'; | ||
import defaults from '../src/lib/defaults'; | ||
const init = () => { | ||
const defaultSuggestedValues = { | ||
test: false, | ||
performance: false | ||
} | ||
const init = (suggestedValues = defaultSuggestedValues) => { | ||
// Set up our document body | ||
@@ -11,2 +16,3 @@ document.body.innerHTML = `<div class="privacy-banner__form-container"></div>`; | ||
'test': { | ||
suggested: suggestedValues["test"], | ||
title: 'Test title', | ||
@@ -23,2 +29,3 @@ description: 'Test description', | ||
'performance': { | ||
suggested: suggestedValues["performance"], | ||
title: 'Performance preferences', | ||
@@ -38,3 +45,2 @@ description: 'Performance cookies are used to measure the performance of our website and make improvements. Your personal data is not identified.', | ||
describe(`Privacy banner > DOM > form > render`, () => { | ||
@@ -56,2 +62,15 @@ beforeAll(init); | ||
// describe('Privacy banner > DOM > form > pre-select', () => { | ||
// beforeAll(init); | ||
// it('Test type should be pre-selected', async () => { | ||
// expect(document.querySelector('input[name="privacy-test"][value="1"]').checked).toEqual(true); | ||
// }); | ||
// it('Performance type should not be pre-selected', async () => { | ||
// expect(document.querySelector('input[name="privacy-performance"][value="1"]').checked).toEqual(false); | ||
// expect(document.querySelector('input[name="privacy-performance"][value="0"]').checked).toEqual(false); | ||
// }); | ||
// }); | ||
describe(`Privacy banner > DOM > form interactions`, () => { | ||
@@ -82,2 +101,1 @@ beforeAll(init); | ||
}); | ||
@@ -1,2 +0,2 @@ | ||
import { groupValueReducer } from '../src/lib/utils' | ||
import { groupValueReducer, removeSubdomain } from '../src/lib/utils'; | ||
@@ -44,2 +44,32 @@ describe('Validate > Unit > Utils > groupValueReducer', () => { | ||
}); | ||
}); | ||
}); | ||
// describe('Cookie > Utils > removeSubdomain', () => { | ||
// it('should return the same vaule for a root domain', async () => { | ||
// expect(removeSubdomain('stormid.com')).toEqual('stormid.com'); | ||
// }); | ||
// it('should remove www from a url', async () => { | ||
// expect(removeSubdomain('www.stormid.com')).toEqual('stormid.com'); | ||
// }); | ||
// it('should remove sub sub domains from a domain', async () => { | ||
// expect(removeSubdomain('test.demo.stormid.com')).toEqual('stormid.com'); | ||
// }); | ||
// it('should remove subsub sub domains from a domain', async () => { | ||
// expect(removeSubdomain('cookie.test.demo.stormid.com')).toEqual('stormid.com'); | ||
// }); | ||
// it('should handle URLs with multi dot tdls', async () => { | ||
// expect(removeSubdomain('cookie.test.demo.stormid.co.uk')).toEqual('stormid.co.uk'); | ||
// }); | ||
// it('should add handle for azurewebsites.net as a multi dot tdl', async () => { | ||
// expect(removeSubdomain('cookie-test-wip.azurewebsites.net')).toEqual('cookie-test-wip.azurewebsites.net'); | ||
// }); | ||
// it('should add handle for stormid.site as a multi dot tdl', async () => { | ||
// expect(removeSubdomain('cookie-test.stormid.site')).toEqual('stormid.site'); | ||
// }); | ||
// }); |
@@ -1,15 +0,2 @@ | ||
/** | ||
* @name storm-cookie-banner: | ||
* @version 0.4.0: Thu, 26 Sep 2019 12:02:08 GMT | ||
* @author stormid | ||
* @license MIT | ||
*/ | ||
import defaults from './lib/defaults'; | ||
import factory from './lib/factory'; | ||
import { composeTypes } from './lib/utils'; | ||
export default { | ||
init: opts => factory(Object.assign({}, defaults, opts, { | ||
types: Object.keys(opts.types).reduce(composeTypes(opts), defaults.types) | ||
})) | ||
}; | ||
var t=window.PointerEvent?["pointerup","keydown"]:["ontouchstart"in window?"touchstart":"click","keydown"],e=[13,32],n=function(t){document.cookie=[t.settings.name+"="+JSON.stringify(t.consent)+";","expires="+new Date((new Date).getTime()+24*t.settings.expiry*60*60*1e3).toGMTString()+";",t.settings.path?"path="+t.settings.path+";":"",t.settings.domain?"domain="+t.settings.domain+";":"",t.settings.secure?"secure;":""].join("")},s=function(t){document.cookie.split("; ").map(function(t){return{name:t.split("=")[0],value:t.split("=")[1],expiry:"Thu, 01 Jan 1970 00:00:01 GMT"}}).map(function(t){return function(e){return document.cookie=[e.name+"="+e.value+";","expires="+e.expiry+";","path="+t.settings.path+";",t.settings.domain?"domain="+t.settings.domain+";":"",t.settings.secure?"secure":""].join("")}}(t))},i=function(t){return function(e,n){return e[n]=e[n]?Object.assign({},e[n],{fns:e[n].fns.concat(t.types[n].fns)}):t.types[n],e}},a=function(){},r=function(t){return/radio|checkbox/i.test(t.type)},c=function(t,e){return!r(e)&&function(t){return null!=t.value&&t.value.length>0}(e)&&(t=e.value),r(e)&&e.checked&&(Array.isArray(t)?t.push(e.value):t=[e.value]),t},o="ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|be|bf|bg|bh|bi|bj|bm|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|cl|cm|cn|co|cr|cu|cv|cw|cx|cz|de|dj|dk|dm|do|dz|ec|ee|eg|es|et|eu|fi|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|im|in|io|iq|ir|is|it|je|jo|jp|kg|ki|km|kn|kp|kr|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|na|nc|ne|nf|ng|nl|no|nr|nu|nz|om|pa|pe|pf|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|yt".split("|"),l="azurewebsites|com|edu|gov|net|mil|org|nom|sch|caa|res|off|gob|int|tur|ip6|uri|urn|asn|act|nsw|qld|tas|vic|pro|biz|adm|adv|agr|arq|art|ato|bio|bmd|cim|cng|cnt|ecn|eco|emp|eng|esp|etc|eti|far|fnd|fot|fst|g12|ggf|imb|ind|inf|jor|jus|leg|lel|mat|med|mus|not|ntr|odo|ppg|psc|psi|qsl|rec|slg|srv|teo|tmp|trd|vet|zlg|web|ltd|sld|pol|fin|k12|lib|pri|aip|fie|eun|sci|prd|cci|pvt|mod|idv|rel|sex|gen|nic|abr|bas|cal|cam|emr|fvg|laz|lig|lom|mar|mol|pmn|pug|sar|sic|taa|tos|umb|vao|vda|ven|mie|北海道|和歌山|神奈川|鹿児島|ass|rep|tra|per|ngo|soc|grp|plc|its|air|and|bus|can|ddr|jfk|mad|nrw|nyc|ski|spy|tcm|ulm|usa|war|fhs|vgs|dep|eid|fet|fla|flå|gol|hof|hol|sel|vik|cri|iwi|ing|abo|fam|gok|gon|gop|gos|aid|atm|gsm|sos|elk|waw|est|aca|bar|cpa|jur|law|sec|plo|www|bir|cbg|jar|khv|msk|nov|nsk|ptz|rnd|spb|stv|tom|tsk|udm|vrn|cmw|kms|nkz|snz|pub|fhv|red|ens|nat|rns|rnu|bbs|tel|bel|kep|nhs|dni|fed|isa|nsn|gub|e12|tec|орг|обр|упр|alt|nis|jpn|mex|ath|iki|nid|gda|inc".split("|"),u={name:".CookiePreferences",path:"",domain:"localhost"===window.location.hostname?"":"."+function(t){for(var e=(t=t.replace(/^www\./,"")).split(".");e.length>3;)e.shift();return 3===e.length&&-1===l.indexOf(e[1])&&-1===o.indexOf(e[2])&&e.shift(),e.join(".")}(window.location.hostname),secure:!0,expiry:365,types:{},necessary:[],bannerTrigger:!1,policyURL:"/cookie-policy",classNames:{banner:"privacy-banner",acceptBtn:"privacy-banner__accept",submitBtn:"privacy-banner__submit",field:"privacy-banner__field",form:"privacy-banner__form",fieldset:"privacy-banner__fieldset",legend:"privacy-banner__legend",formContainer:"privacy-banner__form-container",formMessage:"privacy-banner__form-msg",title:"privacy-banner__form-title",description:"privacy-banner__form-description"},savedMessage:"Your settings have been saved.",bannerTemplate:function(t){return'<section role="dialog" aria-live="polite" aria-label="You privacy" class="'+t.classNames.banner+'">\n\t\t\t<div class="privacy-content">\n\t\t\t\t<div class="wrap">\n\t\t\t\t\t<div class="row">\n\t\t\t\t\t\t\x3c!--googleoff: all--\x3e\n\t\t\t\t\t\t<div class="privacy-banner__title">Cookies</div>\n\t\t\t\t\t\t<p>We use cookies to improve your experience on our site and show you personalised advertising.</p>\n\t\t\t\t\t\t<p>Find out more from our <a class="privacy-banner__link" rel="noopener noreferrer nofollow" href="/privacy-policy">privacy policy</a> and <a class="privacy-banner__link" rel="noopener noreferrer nofollow" href="'+t.policyURL+'">cookie policy</a>.</p>\n\t\t\t\t\t\t<button class="btn btn--primary '+t.classNames.acceptBtn+'">Accept and close</button>\n\t\t\t\t\t\t<a class="privacy-banner__link" rel="noopener noreferrer nofollow" href="'+t.policyURL+'">Your options</a>\n\t\t\t\t\t\t\x3c!--googleon: all--\x3e\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</section>'},messageTemplate:function(t){return'<div class="'+t.settings.classNames.formMessage+'" aria-role="alert">'+t.settings.savedMessage+"</div>"},formTemplate:function(t){return'<form class="'+t.settings.classNames.form+'" novalidate>\n\t\t\t\t'+Object.keys(t.settings.types).map(function(e){return'<fieldset class="'+t.settings.classNames.fieldset+'">\n\t\t\t\t<legend class="'+t.settings.classNames.legend+'">\n\t\t\t\t\t<span class="'+t.settings.classNames.title+'">'+t.settings.types[e].title+'</span>\n\t\t\t\t\t<span class="'+t.settings.classNames.description+'">'+t.settings.types[e].description+'</span>\n\t\t\t\t</legend>\n\t\t\t\t<div class="form-row">\n\t\t\t\t\t<div class="relative">\n\t\t\t\t\t\t<label class="privacy-banner__label">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tclass="'+t.settings.classNames.field+'"\n\t\t\t\t\t\t\t\ttype="radio"\n\t\t\t\t\t\t\t\tname="privacy-'+e.split(" ")[0].replace(" ","-")+'"\n\t\t\t\t\t\t\t\tvalue="1"\n\t\t\t\t\t\t\t\t'+(1===t.consent[e]?" checked":"")+'>\n\t\t\t\t\t\t\t<span class="privacy-banner__label-text">I am OK with this</span>\n\t\t\t\t\t\t\t<span class="privacy-banner__label-description">'+t.settings.types[e].labels.yes+'</span>\n\t\t\t\t\t\t</label> \n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="form-row">\n\t\t\t\t\t<div class="relative">\n\t\t\t\t\t\t<label class="privacy-banner__label">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tclass="'+t.settings.classNames.field+'"\n\t\t\t\t\t\t\t\ttype="radio"\n\t\t\t\t\t\t\t\tname="privacy-'+e.split(" ")[0].replace(" ","-")+'"\n\t\t\t\t\t\t\t\tvalue="0"\n\t\t\t\t\t\t\t\t'+(0===t.consent[e]?" checked":"")+'>\n\t\t\t\t\t\t\t<span class="privacy-banner__label-text">No thank you</span>\n\t\t\t\t\t\t\t<span class="privacy-banner__label-description">'+t.settings.types[e].labels.no+"</span>\n\t\t\t\t\t\t</label> \n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</fieldset>"}).join("")+'\n\t\t\t<button class="'+t.settings.classNames.submitBtn+'"'+(0===Object.keys(t.consent).length?" disabled":"")+">Save my settings</button>\n\t\t</form>"}},p=function(t,e){return Object.assign({},t,e)},d=function(t,e){return Object.assign({},t,{consent:Object.assign({},t.consent,e)})},m=function(t,e){return Object.assign({},t,{settings:Object.assign({},t.settings,{types:Object.assign({},t.settings.types,e)})})},g=function(t){return function(e){Object.keys(e.consent).forEach(function(t){!0!==e.settings.types[t].executed&&e.consent[t]&&Boolean(e.consent[t])&&e.settings.types[t].fns.forEach(function(t){return t(e)})}),t.update(m,Object.keys(e.settings.types).reduce(function(t,n){return t[n]=Object.assign({},e.settings.types[n],{executed:e.settings.types[n].executed||e.consent[n]&&Boolean(e.consent[n])}),t},{}))}},f=function(t){t.settings.necessary.forEach(function(e){return e(t)})},b=function(s){return function(i){document.body.firstElementChild.insertAdjacentHTML("beforebegin",i.settings.bannerTemplate(i.settings));var a=document.querySelector("."+i.settings.classNames.banner),r=document.querySelector("."+i.settings.classNames.acceptBtn);t.forEach(function(t){r.addEventListener(t,function(t){(function(t){return!!t.keyCode&&!~e.indexOf(t.keyCode)||t.which&&3===t.which})(t)||s.update(d,Object.keys(i.settings.types).reduce(function(t,e){return t[e]=1,t},{}),[n,g(s),v(a),y(s)])})})}},v=function(t){return function(){return t&&t.parentNode&&t.parentNode.removeChild(t)}},y=function(t){return function(e){var i=document.querySelector("."+e.settings.classNames.formContainer);if(i){i.innerHTML=e.settings.formTemplate(function(t){return Object.keys(t.consent).length>0?t:Object.assign({},t,{consent:Object.keys(t.settings.types).reduce(function(e,n){return t.settings.types[n].suggested&&(e[n]=1),e},{})})}(e));var a=document.querySelector("."+e.settings.classNames.form),r=document.querySelector("."+e.settings.classNames.banner),o=document.querySelector("."+e.settings.classNames.submitBtn),l=[].slice.call(document.querySelectorAll("."+e.settings.classNames.field)).reduce(function(t,e){var n=e.getAttribute("name").replace("privacy-","");return t[n]?t[n].push(e):t[n]=[e],t},{}),u=function(){return Object.keys(l).reduce(function(t,e){var n=l[e].reduce(c,"");return n&&(t[e]=parseInt(n)),t},{})},p=function(t){Object.keys(u()).length===Object.keys(l).length&&(o.removeAttribute("disabled"),a.removeEventListener("change",p))};o.hasAttribute("disabled")&&a.addEventListener("change",p),a.addEventListener("submit",function(e){e.preventDefault(),t.update(d,u(),[s,n,g(t),v(r),h(o)])})}}},h=function(t){return function(e){t.insertAdjacentHTML("afterend",e.settings.messageTemplate(e)),t.setAttribute("disabled","disabled"),window.setTimeout(function(){t.parentNode.removeChild(t.nextElementSibling),t.removeAttribute("disabled")},3e3)}};module.exports={init:function(t){return function(t){if(function(){try{document.cookie="cookietest=1";var t=-1!==document.cookie.indexOf("cookietest=");return document.cookie="cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT",t}catch(t){return!1}}()){var e,n=(e={},{update:function(t,n,s){e=t(e,n),s&&s.forEach(function(t){t(e)})},getState:function(){return e}}),s=function(t){var e=document.cookie.split("; ").map(function(t){return{name:t.split("=")[0],value:t.split("=")[1]}}).filter(function(e){return e.name===t.name})[0];return void 0!==e&&e}(t);return n.update(p,{settings:t,consent:s?JSON.parse(s.value):{}},[f,g(n),s?a:b(n),y(n)]),{getState:n.getState}}}(Object.assign({},u,t,{types:Object.keys(t.types).reduce(i(t),u.types)}))}}; | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "storm-cookie-banner", | ||
"version": "1.0.2", | ||
"version": "1.1.0", | ||
"description": "", | ||
@@ -15,3 +15,6 @@ "author": "stormid", | ||
"main": "dist/index.js", | ||
"browser": "dist/storm-cookie-banner.standalone.js", | ||
"source": "src/index.js", | ||
"module": "dist/index.modern.mjs", | ||
"unpkg": "dist/index.umd.js", | ||
"browser": "dist/index.umd.js", | ||
"keywords": [ | ||
@@ -24,49 +27,24 @@ "stormid", | ||
"scripts": { | ||
"build": "node_modules/.bin/gulp build", | ||
"serve": "node_modules/.bin/gulp server", | ||
"start": "node_modules/.bin/gulp server", | ||
"test": "node_modules/.bin/jest" | ||
"build": "microbundle --name CookieBanner", | ||
"test": "node_modules/.bin/jest --coverage", | ||
"dev": "webpack-dev-server --config example/webpack.config.js --mode development", | ||
"prod": "webpack --config example/webpack.config.js --mode production" | ||
}, | ||
"jest": { | ||
"testURL": "http://localhost" | ||
}, | ||
"browserify": { | ||
"transform": [ | ||
[ | ||
"babelify", | ||
{ | ||
"presets": [ | ||
"env" | ||
] | ||
} | ||
] | ||
] | ||
}, | ||
"devDependencies": { | ||
"babel": "^6.5.2", | ||
"babel-core": "^6.7.2", | ||
"babel-plugin-add-module-exports": "^0.2.1", | ||
"babel-preset-env": "^1.6.0", | ||
"babelify": "^7.3.0", | ||
"browser-sync": "^2.17.5", | ||
"browserify": "^13.1.0", | ||
"gulp": "^3.9.1", | ||
"gulp-babel": "^6.1.2", | ||
"gulp-gh-pages": "^0.5.4", | ||
"gulp-header": "^1.2.2", | ||
"gulp-notify": "^2.2.0", | ||
"gulp-plumber": "^1.1.0", | ||
"gulp-rename": "^1.2.2", | ||
"gulp-rollup": "^2.11.0", | ||
"gulp-uglify": "^2.0.0", | ||
"gulp-wrap-umd": "^0.2.1", | ||
"@babel/core": "^7.7.4", | ||
"@babel/node": "^7.7.4", | ||
"@babel/preset-env": "^7.7.4", | ||
"babel-core": "^7.0.0-bridge.0", | ||
"babel-eslint": "^10.0.3", | ||
"babel-jest": "^24.9.0", | ||
"babel-loader": "^8.0.6", | ||
"clean-webpack-plugin": "^1.0.0", | ||
"html-webpack-plugin": "^3.2.0", | ||
"isomorphic-fetch": "^2.2.1", | ||
"jest": "^24.9.0", | ||
"object-assign": "^4.0.1", | ||
"rollup": "^0.41.6", | ||
"rollup-plugin-commonjs": "^8.0.2", | ||
"rollup-plugin-node-resolve": "^3.0.0", | ||
"run-sequence": "^1.1.0", | ||
"vinyl-buffer": "^1.0.0", | ||
"vinyl-source-stream": "^1.1.0" | ||
"microbundle": "^0.11.0", | ||
"webpack": "^4.41.2", | ||
"webpack-cli": "^3.3.10", | ||
"webpack-dev-server": "^3.9.0" | ||
} | ||
} |
@@ -64,14 +64,4 @@ # Storm cookie banner | ||
``` | ||
or aynchronous browser loading (use the .standalone version in the /dist folder) | ||
``` | ||
import Load from 'storm-load'; | ||
Load('/content/js/async/storm-cookie-banner.standalone.js') | ||
.then(() => { | ||
StormCookieBanner.init({ | ||
types: { ... as es6 example } | ||
}); | ||
``` | ||
## Default options | ||
@@ -78,0 +68,0 @@ No cookie types are included by default, you must configure that yourself |
@@ -13,3 +13,3 @@ import { shouldReturn, writeCookie, groupValueReducer, deleteCookies } from './utils'; | ||
acceptBtn.addEventListener(ev, e => { | ||
if(shouldReturn(e)) return; | ||
if (shouldReturn(e)) return; | ||
@@ -35,7 +35,16 @@ Store.update( | ||
const suggestedConsent = state => Object.keys(state.consent).length > 0 | ||
? state | ||
: Object.assign({}, state, { | ||
consent: Object.keys(state.settings.types).reduce((acc, type) => { | ||
if (state.settings.types[type].suggested) acc[type] = 1; | ||
return acc; | ||
}, {}) | ||
}); | ||
export const initForm = Store => state => { | ||
const formContainer = document.querySelector(`.${state.settings.classNames.formContainer}`); | ||
if(!formContainer) return; | ||
if (!formContainer) return; | ||
formContainer.innerHTML = state.settings.formTemplate(state); | ||
formContainer.innerHTML = state.settings.formTemplate(suggestedConsent(state)); | ||
@@ -47,3 +56,3 @@ const form = document.querySelector(`.${state.settings.classNames.form}`); | ||
const groupName = field.getAttribute('name').replace('privacy-', ''); | ||
if(groups[groupName]) groups[groupName].push(field); | ||
if (groups[groupName]) groups[groupName].push(field); | ||
else groups[groupName] = [field]; | ||
@@ -55,3 +64,3 @@ return groups; | ||
const value = groups[key].reduce(groupValueReducer, ''); | ||
if(value) acc[key] = parseInt(value); | ||
if (value) acc[key] = parseInt(value); | ||
return acc; | ||
@@ -61,3 +70,3 @@ }, {}); | ||
const enableButton = e => { | ||
if(Object.keys(extractConsent()).length !== Object.keys(groups).length) return; | ||
if (Object.keys(extractConsent()).length !== Object.keys(groups).length) return; | ||
button.removeAttribute('disabled'); | ||
@@ -67,3 +76,3 @@ form.removeEventListener('change', enableButton); | ||
button.hasAttribute('disabled') && form.addEventListener('change', enableButton); | ||
form.addEventListener('submit', e => { | ||
@@ -70,0 +79,0 @@ e.preventDefault(); |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
15
0
161178
29
1097
173
1