bv-ui-core 2.5.0 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +1 -0
- package/lib/cookie/README.md +10 -2
- package/lib/cookie/index.js +17 -4
- package/lib/cookieConsent/README.md +12 -1
- package/lib/cookieConsent/index.js +74 -5
- package/package.json +1 -1
- package/test/unit/cookieConsent/index.spec.js +31 -2
package/README.md
CHANGED
@@ -40,6 +40,7 @@ module's directory.
|
|
40
40
|
- [body](./lib/body)
|
41
41
|
- [checkHighContrast](./lib/checkHighContrast)
|
42
42
|
- [cookie](./lib/cookie)
|
43
|
+
- [cookieConsent](./lib/cookieConsent)
|
43
44
|
- [cssLoadChecker](./lib/cssLoadChecker)
|
44
45
|
- [date.now](./lib/date.now)
|
45
46
|
- [domainPolice](./lib/domainPolice)
|
package/lib/cookie/README.md
CHANGED
@@ -5,12 +5,12 @@ The cookie module provides methods for interacting with browser cookies.
|
|
5
5
|
```js
|
6
6
|
var cookie = require('bv-ui-core/lib/cookie');
|
7
7
|
|
8
|
-
cookie.
|
8
|
+
cookie.create('RememberMe', '1', 365);
|
9
9
|
console.log(cookie.read('RememberMe')); // '1'
|
10
10
|
cookie.remove('RememberMe');
|
11
11
|
```
|
12
12
|
|
13
|
-
The following methods are provided:
|
13
|
+
## The following methods are provided:
|
14
14
|
|
15
15
|
- `read(name)`: Read the cookie with the given name.
|
16
16
|
- `create(name, value, [days, domain, secure])`: Write a cookie with the given
|
@@ -19,3 +19,11 @@ The following methods are provided:
|
|
19
19
|
by passing `true` as the `secure` argument. Note that if one optional
|
20
20
|
argument is provided, all previous arguments must be provided as well.
|
21
21
|
- `remove(name)`: Delete the cookie with the given name.
|
22
|
+
|
23
|
+
## Usage with `cookieConsent`:
|
24
|
+
|
25
|
+
- Call `cookieConsent.initConsent` before calling `cookie.create`.
|
26
|
+
- Cookies will get created only if the consent for that cookie is true.
|
27
|
+
- Each cookie will automatically subscribe to `enable` and `disable` consent events for that cookie.
|
28
|
+
- Cookie will get set when consent is `true`.
|
29
|
+
- Cookie will get removed when consent is `false`.
|
package/lib/cookie/index.js
CHANGED
@@ -55,16 +55,21 @@ function readCookie (name) {
|
|
55
55
|
}
|
56
56
|
}
|
57
57
|
|
58
|
-
return
|
58
|
+
return null;
|
59
59
|
}
|
60
60
|
/**
|
61
61
|
* Remove a cookie.
|
62
62
|
*
|
63
63
|
* @param {String} name The cookie name.
|
64
64
|
*/
|
65
|
-
function removeCookie (name) {
|
65
|
+
function removeCookie (name, domain) {
|
66
66
|
delete store[name];
|
67
|
-
|
67
|
+
if (domain) {
|
68
|
+
createCookie(name, null, -1, domain);
|
69
|
+
}
|
70
|
+
else {
|
71
|
+
createCookie(name, '', -1);
|
72
|
+
}
|
68
73
|
}
|
69
74
|
|
70
75
|
module.exports = {
|
@@ -74,13 +79,21 @@ module.exports = {
|
|
74
79
|
if (consentPresent) {
|
75
80
|
createCookie(name, value, days, domain, secure);
|
76
81
|
}
|
82
|
+
cookieConsent.subscribe(name,'add',function (consent) {
|
83
|
+
if (consent) {
|
84
|
+
createCookie(name,value,days,domain,secure);
|
85
|
+
}
|
86
|
+
else {
|
87
|
+
removeCookie(name,domain)
|
88
|
+
}
|
89
|
+
})
|
77
90
|
|
78
91
|
cookieConsent.subscribe(name, 'enable', function () {
|
79
92
|
createCookie(name, value, days, domain, secure);
|
80
93
|
});
|
81
94
|
|
82
95
|
cookieConsent.subscribe(name, 'disable', function () {
|
83
|
-
removeCookie(name);
|
96
|
+
removeCookie(name, domain);
|
84
97
|
});
|
85
98
|
},
|
86
99
|
read: readCookie,
|
@@ -5,10 +5,14 @@ The cookieConsent module provides methods for controlling cookie consents.
|
|
5
5
|
```js
|
6
6
|
var cookieConsent = require('bv-ui-core/lib/cookieConsent');
|
7
7
|
// Initialize
|
8
|
+
/**
|
9
|
+
* 2nd parameter is to disable/enable consent mechanism.
|
10
|
+
* Passing true will disable the consent mechanism.
|
11
|
+
*/
|
8
12
|
cookieConsent.initConsent({
|
9
13
|
cookie1: false,
|
10
14
|
cookie2: true
|
11
|
-
});
|
15
|
+
}, false);
|
12
16
|
|
13
17
|
// Set cookie consent
|
14
18
|
cookieConsent.setConsent({ cookie1: true });
|
@@ -22,9 +26,16 @@ cookieConsent.subscribe('cookie3', 'add', function (data) {});
|
|
22
26
|
// Subscribe to consent 'enable' event. Triggers when a cookie consent is set to true
|
23
27
|
cookieConsent.subscribe('cookie3', 'enable', function (data) {});
|
24
28
|
|
29
|
+
// Valid events that can be subscribed to are 'add', 'enable', 'disable', and 'change'
|
25
30
|
// Subscribe to consent 'disable' event. Triggers when a cookie consent is set to false
|
26
31
|
var event = cookieConsent.subscribe('cookie3', 'disable', function (data) {});
|
27
32
|
|
33
|
+
// Subscribe to the store change event. The latest consent store object is passed as parameter to the callback function
|
34
|
+
var event = subscribeToConsentStore(function (store){});
|
35
|
+
|
28
36
|
// Unsubscribe events
|
29
37
|
event.unsubscribe();
|
38
|
+
|
39
|
+
// Get cookie consent disabled/enabled value.
|
40
|
+
cookieConsent.getConsentDisabled();
|
30
41
|
```
|
@@ -1,8 +1,12 @@
|
|
1
1
|
var cookieConsent = (function () {
|
2
2
|
var init = false;
|
3
|
+
var consentDisabled = true;
|
3
4
|
var store = {};
|
4
5
|
var subscribers = {};
|
5
|
-
var events = ['add', 'enable', 'disable'];
|
6
|
+
var events = ['add', 'enable', 'disable', 'change'];
|
7
|
+
var storeCallbacks = {};
|
8
|
+
|
9
|
+
|
6
10
|
/**
|
7
11
|
* _publish: Calls subscriber callbacks
|
8
12
|
* @param {String} consentKey Consent key
|
@@ -16,6 +20,18 @@ var cookieConsent = (function () {
|
|
16
20
|
})
|
17
21
|
}
|
18
22
|
}
|
23
|
+
|
24
|
+
/**
|
25
|
+
* _publishStore: calls Callbacks with the store object passed
|
26
|
+
*/
|
27
|
+
|
28
|
+
function _publishStore () {
|
29
|
+
if (Object.values(storeCallbacks).length > 0) {
|
30
|
+
Object.values(storeCallbacks).forEach(function (callback) {
|
31
|
+
callback(Object.assign({}, store));
|
32
|
+
})
|
33
|
+
}
|
34
|
+
}
|
19
35
|
/**
|
20
36
|
* _set: Set store data
|
21
37
|
* @param {String} consentKey Consent key
|
@@ -36,9 +52,14 @@ var cookieConsent = (function () {
|
|
36
52
|
}
|
37
53
|
if (oldValue === true) {
|
38
54
|
_publish(consentKey, 'disable', consentValue);
|
55
|
+
_publish(consentKey, 'change', consentValue);
|
39
56
|
}
|
40
|
-
else {
|
57
|
+
else if (oldValue === false) {
|
41
58
|
_publish(consentKey, 'enable', consentValue);
|
59
|
+
_publish(consentKey, 'change', consentValue);
|
60
|
+
}
|
61
|
+
else {
|
62
|
+
_publish(consentKey, 'change', consentValue);
|
42
63
|
}
|
43
64
|
}
|
44
65
|
}
|
@@ -50,13 +71,37 @@ var cookieConsent = (function () {
|
|
50
71
|
delete subscribers[this.consentKey][this.eventName][this.key];
|
51
72
|
}
|
52
73
|
}
|
74
|
+
|
75
|
+
/**
|
76
|
+
* _unsubscribeStore: Unsubscribes subscribers from the consent store
|
77
|
+
*/
|
78
|
+
function _unsubscribeStore () {
|
79
|
+
if (storeCallbacks[this.key]) {
|
80
|
+
delete storeCallbacks[this.key];
|
81
|
+
}
|
82
|
+
}
|
83
|
+
/**
|
84
|
+
* Get consent disabled
|
85
|
+
* @returns Boolean
|
86
|
+
*/
|
87
|
+
function getConsentDisabled () {
|
88
|
+
return consentDisabled
|
89
|
+
}
|
53
90
|
/**
|
54
91
|
* initConsent: Initialize the consent store
|
55
92
|
* @param {Object} consent Consent object
|
93
|
+
* @param {Boolean} disable Disable consent
|
56
94
|
* @returns Boolean
|
57
95
|
*/
|
58
|
-
function initConsent (consent) {
|
96
|
+
function initConsent (consent, disable) {
|
59
97
|
if (!init) {
|
98
|
+
consentDisabled = !!disable;
|
99
|
+
|
100
|
+
if (consentDisabled) {
|
101
|
+
init = true;
|
102
|
+
return true;
|
103
|
+
}
|
104
|
+
|
60
105
|
if (!(consent && !Array.isArray(consent) && typeof consent === 'object')) {
|
61
106
|
throw new TypeError('cookieConsent (init): consent should be an object.');
|
62
107
|
}
|
@@ -82,6 +127,10 @@ var cookieConsent = (function () {
|
|
82
127
|
* @returns Boolean or Undefined
|
83
128
|
*/
|
84
129
|
function getConsent (consentKey) {
|
130
|
+
if (consentDisabled) {
|
131
|
+
return true;
|
132
|
+
}
|
133
|
+
|
85
134
|
return store[consentKey];
|
86
135
|
}
|
87
136
|
/**
|
@@ -90,14 +139,19 @@ var cookieConsent = (function () {
|
|
90
139
|
* @returns Boolean
|
91
140
|
*/
|
92
141
|
function setConsent (consent) {
|
93
|
-
if (init) {
|
142
|
+
if (init && !consentDisabled) {
|
94
143
|
if (!(consent && !Array.isArray(consent) && typeof consent === 'object')) {
|
95
144
|
throw new TypeError('cookieConsent (setConsent): consent should be an object.')
|
96
145
|
}
|
146
|
+
var store
|
97
147
|
var keys = Object.keys(consent);
|
98
148
|
for (var i = 0; i < keys.length; i++) {
|
99
149
|
_set(keys[i], consent[keys[i]]);
|
100
150
|
}
|
151
|
+
var storeCopy=Object.assign({},store)
|
152
|
+
if (JSON.stringify(storeCopy)!==JSON.stringify(store)) {
|
153
|
+
_publishStore()
|
154
|
+
}
|
101
155
|
return true;
|
102
156
|
}
|
103
157
|
|
@@ -147,11 +201,26 @@ var cookieConsent = (function () {
|
|
147
201
|
};
|
148
202
|
}
|
149
203
|
|
204
|
+
function subscribeToConsentStore (callback) {
|
205
|
+
if (typeof callback !== 'function') {
|
206
|
+
throw new TypeError('cookieConsent (subscribeToConsentStore): callback should be a function.');
|
207
|
+
}
|
208
|
+
|
209
|
+
var key = Math.random().toString(36).substr(2, 5);
|
210
|
+
storeCallbacks[key] = callback;
|
211
|
+
|
212
|
+
return {
|
213
|
+
unsubscribe: _unsubscribeStore.bind({ key: key })
|
214
|
+
}
|
215
|
+
}
|
216
|
+
|
150
217
|
return {
|
151
218
|
initConsent: initConsent,
|
152
219
|
getConsent: getConsent,
|
220
|
+
getConsentDisabled: getConsentDisabled,
|
153
221
|
setConsent: setConsent,
|
154
|
-
subscribe: subscribe
|
222
|
+
subscribe: subscribe,
|
223
|
+
subscribeToConsentStore: subscribeToConsentStore
|
155
224
|
};
|
156
225
|
})();
|
157
226
|
|
package/package.json
CHANGED
@@ -72,7 +72,7 @@ describe('lib/cookieConsent', function () {
|
|
72
72
|
cookieConsent.subscribe('key1', 'delete', null);
|
73
73
|
}
|
74
74
|
|
75
|
-
var events = ['add', 'enable', 'disable'];
|
75
|
+
var events = ['add', 'enable', 'disable', 'change'];
|
76
76
|
expect(test3).to.throw(TypeError, 'cookieConsent (subscribe): event name should be one of ' + events.join(', ') + '.');
|
77
77
|
|
78
78
|
function test4 () {
|
@@ -84,7 +84,36 @@ describe('lib/cookieConsent', function () {
|
|
84
84
|
function test5 () {
|
85
85
|
return cookieConsent.subscribe('key1', 'enable', function () {});
|
86
86
|
}
|
87
|
-
|
88
87
|
expect(test5()).to.be.an('object');
|
89
88
|
});
|
89
|
+
it('cookieConsent.subscribeToConsentStore', function () {
|
90
|
+
// Error checks - Correct errors are thrown
|
91
|
+
function test6 () {
|
92
|
+
cookieConsent.subscribeToConsentStore('Callback')
|
93
|
+
}
|
94
|
+
expect(test6).to.throw(TypeError,'cookieConsent (subscribeToConsentStore): callback should be a function.');
|
95
|
+
// Subscriber creation test - The subscription gets created correctly
|
96
|
+
function test7 () {
|
97
|
+
return cookieConsent.subscribeToConsentStore(function () {});
|
98
|
+
}
|
99
|
+
expect(test7()).to.be.an('object');
|
100
|
+
|
101
|
+
// Event listener test - The subscriber callback fires on store change
|
102
|
+
var fn = sinon.spy()
|
103
|
+
function test8 () {
|
104
|
+
cookieConsent.subscribeToConsentStore(fn)
|
105
|
+
cookieConsent.setConsent({ cookie4: true })
|
106
|
+
}
|
107
|
+
test8 ()
|
108
|
+
sinon.assert.calledOnce(fn)
|
109
|
+
// Unsubscribe test - Should be able to unsubscribe successfully (Should not fire the callback after unsubscription)
|
110
|
+
var fn2 = sinon.spy()
|
111
|
+
function test9 () {
|
112
|
+
var event = cookieConsent.subscribeToConsentStore(fn2)
|
113
|
+
event.unsubscribe()
|
114
|
+
cookieConsent.setConsent({ cookie5: true })
|
115
|
+
}
|
116
|
+
test9()
|
117
|
+
sinon.assert.notCalled(fn2)
|
118
|
+
});
|
90
119
|
});
|