@osano/osano-cmp-react-native 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/services/consent.js +91 -28
- package/lib/commonjs/services/consent.js.map +1 -1
- package/lib/module/services/consent.js +90 -28
- package/lib/module/services/consent.js.map +1 -1
- package/lib/typescript/lib/commonjs/services/consent.d.ts +1 -0
- package/lib/typescript/lib/commonjs/services/consent.d.ts.map +1 -1
- package/lib/typescript/lib/module/services/consent.d.ts +1 -0
- package/lib/typescript/lib/module/services/consent.d.ts.map +1 -1
- package/lib/typescript/src/services/consent.d.ts +10 -4
- package/lib/typescript/src/services/consent.d.ts.map +1 -1
- package/package.json +13 -9
- package/src/services/consent.ts +135 -41
- package/lib/typescript/webdriverio-appium/common/commonCommands.d.ts +0 -21
- package/lib/typescript/webdriverio-appium/common/commonCommands.d.ts.map +0 -1
- package/lib/typescript/webdriverio-appium/config/wdio.conf.android.d.cts +0 -3
- package/lib/typescript/webdriverio-appium/config/wdio.conf.android.d.cts.map +0 -1
- package/lib/typescript/webdriverio-appium/config/wdio.conf.d.cts +0 -21
- package/lib/typescript/webdriverio-appium/config/wdio.conf.d.cts.map +0 -1
- package/lib/typescript/webdriverio-appium/config/wdio.conf.ios.d.cts +0 -3
- package/lib/typescript/webdriverio-appium/config/wdio.conf.ios.d.cts.map +0 -1
- package/lib/typescript/webdriverio-appium/test/android/six-drawer.d.ts +0 -2
- package/lib/typescript/webdriverio-appium/test/android/six-drawer.d.ts.map +0 -1
- package/lib/typescript/webdriverio-appium/test/ios/one.d.ts +0 -2
- package/lib/typescript/webdriverio-appium/test/ios/one.d.ts.map +0 -1
- package/lib/typescript/webdriverio-appium/test/ios/six.d.ts +0 -2
- package/lib/typescript/webdriverio-appium/test/ios/six.d.ts.map +0 -1
- package/lib/typescript/webdriverio-appium/test/ios/three.d.ts +0 -2
- package/lib/typescript/webdriverio-appium/test/ios/three.d.ts.map +0 -1
- package/lib/typescript/webdriverio-appium/test/ios/two-iab.d.ts +0 -2
- package/lib/typescript/webdriverio-appium/test/ios/two-iab.d.ts.map +0 -1
- package/lib/typescript/webdriverio-appium/test/ios/two.d.ts +0 -2
- package/lib/typescript/webdriverio-appium/test/ios/two.d.ts.map +0 -1
- package/lib/typescript/webdriverio-appium/test/one.d.ts +0 -2
- package/lib/typescript/webdriverio-appium/test/one.d.ts.map +0 -1
- package/lib/typescript/webdriverio-appium/test/six-iab.d.ts +0 -2
- package/lib/typescript/webdriverio-appium/test/six-iab.d.ts.map +0 -1
- package/lib/typescript/webdriverio-appium/test/three.d.ts +0 -2
- package/lib/typescript/webdriverio-appium/test/three.d.ts.map +0 -1
- package/lib/typescript/webdriverio-appium/test/two-iab.d.ts +0 -2
- package/lib/typescript/webdriverio-appium/test/two-iab.d.ts.map +0 -1
- package/lib/typescript/webdriverio-appium/test/two.d.ts +0 -2
- package/lib/typescript/webdriverio-appium/test/two.d.ts.map +0 -1
|
@@ -3,16 +3,18 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.fetchConsent = exports.fetchConfig = exports.clearConsent = void 0;
|
|
7
|
+
exports.hashExtUsrData = hashExtUsrData;
|
|
8
|
+
exports.recordConsent = void 0;
|
|
7
9
|
var _constants = require("../constants");
|
|
8
|
-
var
|
|
10
|
+
var _OsanoCmp = require("../native/OsanoCmp");
|
|
9
11
|
var _API = _interopRequireDefault(require("../utils/API"));
|
|
12
|
+
var _reactNative = require("react-native");
|
|
13
|
+
var _textEncoding = require("text-encoding");
|
|
10
14
|
var _utils = require("../utils");
|
|
11
|
-
var
|
|
15
|
+
var _jsSha = require("js-sha512");
|
|
12
16
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
-
|
|
14
|
-
// file deepcode ignore DuplicateCaseBody: <please specify a reason of ignoring this>
|
|
15
|
-
|
|
17
|
+
const Buffer = require('buffer').Buffer;
|
|
16
18
|
const {
|
|
17
19
|
CONSENT_URI,
|
|
18
20
|
LOOKUPS_URI,
|
|
@@ -34,7 +36,8 @@ function createConsentPayload(cmp, consent) {
|
|
|
34
36
|
}).filter(([, value]) => value !== undefined));
|
|
35
37
|
}
|
|
36
38
|
function createConsentRecordPayload(cmp, consent) {
|
|
37
|
-
const consentedCategories = consent ?? cmp.consent;
|
|
39
|
+
const consentedCategories = consent ?? cmp.consent ?? [];
|
|
40
|
+
const hashedExtUsrData = hashExtUsrData(cmp.customerId, cmp.configId, cmp.extUsrData);
|
|
38
41
|
return Object.fromEntries(Object.entries({
|
|
39
42
|
osnoCustomerId: cmp.customerId,
|
|
40
43
|
osnoConfigId: cmp.configId,
|
|
@@ -42,7 +45,7 @@ function createConsentRecordPayload(cmp, consent) {
|
|
|
42
45
|
consentingDomain: cmp.consentingDomain,
|
|
43
46
|
consentingPlatform: `${_reactNative.Platform.OS}.react-native`,
|
|
44
47
|
userConsentId: cmp.deviceId,
|
|
45
|
-
extUsrData:
|
|
48
|
+
extUsrData: hashedExtUsrData
|
|
46
49
|
}).filter(([, value]) => value !== undefined));
|
|
47
50
|
}
|
|
48
51
|
const STORAGE_KEY = 'osano_consentmanager';
|
|
@@ -56,7 +59,9 @@ const storeConsent = async (cmp, consent) => {
|
|
|
56
59
|
switch (_reactNative.Platform.OS) {
|
|
57
60
|
case 'ios':
|
|
58
61
|
case 'android':
|
|
59
|
-
(0, _OsanoCmp.setStorage)(`${STORAGE_KEY}
|
|
62
|
+
(0, _OsanoCmp.setStorage)(`${STORAGE_KEY}_last_recorded_consent_date`, JSON.stringify(new Date())).then(() => {
|
|
63
|
+
(0, _OsanoCmp.setStorage)(`${STORAGE_KEY}_${cmp.configId}`, JSON.stringify(cmp.consent)).then(resConsent).catch(reject);
|
|
64
|
+
}).catch(reject);
|
|
60
65
|
break;
|
|
61
66
|
}
|
|
62
67
|
});
|
|
@@ -74,7 +79,6 @@ const clearConsent = async cmp => {
|
|
|
74
79
|
(0, _OsanoCmp.clearStorage)(`${STORAGE_KEY}_${cmp.configId}`).then(resConsent);
|
|
75
80
|
break;
|
|
76
81
|
default:
|
|
77
|
-
window.localStorage.removeItem(`${STORAGE_KEY}_${cmp.configId}`);
|
|
78
82
|
break;
|
|
79
83
|
}
|
|
80
84
|
});
|
|
@@ -104,11 +108,29 @@ const retrieveConsent = async cmp => {
|
|
|
104
108
|
});
|
|
105
109
|
break;
|
|
106
110
|
default:
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
const retrieveLastConsentTimestamp = async () => {
|
|
116
|
+
return new Promise(resolve => {
|
|
117
|
+
const resValue = consentJson => {
|
|
118
|
+
if (consentJson) {
|
|
119
|
+
const timestamp = JSON.parse(consentJson);
|
|
120
|
+
resolve(timestamp);
|
|
121
|
+
return timestamp;
|
|
122
|
+
} else {
|
|
123
|
+
resolve('');
|
|
124
|
+
return '';
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
switch (_reactNative.Platform.OS) {
|
|
128
|
+
case 'ios':
|
|
129
|
+
case 'android':
|
|
130
|
+
(0, _OsanoCmp.getStorage)(`${STORAGE_KEY}_last_recorded_consent_date`).then(resValue);
|
|
131
|
+
break;
|
|
132
|
+
default:
|
|
133
|
+
// nothing
|
|
112
134
|
break;
|
|
113
135
|
}
|
|
114
136
|
});
|
|
@@ -123,24 +145,65 @@ const recordConsent = (cmp, consent) => {
|
|
|
123
145
|
});
|
|
124
146
|
};
|
|
125
147
|
exports.recordConsent = recordConsent;
|
|
126
|
-
|
|
148
|
+
function hashExtUsrData(customerId, configId, extUsrData) {
|
|
149
|
+
if (extUsrData === '' || customerId === '' || configId === '') {
|
|
150
|
+
return '';
|
|
151
|
+
} else {
|
|
152
|
+
try {
|
|
153
|
+
const encoder = new _textEncoding.TextEncoder();
|
|
154
|
+
const data = encoder.encode(`${customerId}/${configId}/${extUsrData}`);
|
|
155
|
+
const hash = _jsSha.sha512.arrayBuffer(data);
|
|
156
|
+
const base64 = Buffer.from(hash).toString('base64');
|
|
157
|
+
const hashUrlSafe = base64.replace(/\+/g, '-').replace(/\//g, '_');
|
|
158
|
+
return hashUrlSafe;
|
|
159
|
+
} catch (error) {
|
|
160
|
+
// something went wrong
|
|
161
|
+
return '';
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const fetchConsent = async cmp => {
|
|
127
166
|
const {
|
|
128
167
|
customerId,
|
|
129
168
|
configId,
|
|
130
|
-
extUsrData
|
|
169
|
+
extUsrData
|
|
131
170
|
} = cmp;
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
171
|
+
try {
|
|
172
|
+
const consent = await retrieveConsent(cmp);
|
|
173
|
+
const hashedUserData = hashExtUsrData(customerId, configId, extUsrData);
|
|
174
|
+
|
|
175
|
+
// No user data or remote consent disabled
|
|
176
|
+
if (hashedUserData === '' || cmp.config.remoteConsent === false) {
|
|
138
177
|
return consent;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
178
|
+
}
|
|
179
|
+
const response = await _API.default.get(`${LOOKUPS_URI}/customer/${customerId}/config/${configId}/user/${hashedUserData}/consent`);
|
|
180
|
+
const {
|
|
181
|
+
consented,
|
|
182
|
+
lastConsentTimestamp
|
|
183
|
+
} = response;
|
|
184
|
+
if (!consented || !lastConsentTimestamp) {
|
|
185
|
+
// No remote consent found, use local consent
|
|
186
|
+
await storeConsent(cmp, consent);
|
|
187
|
+
return consent;
|
|
188
|
+
}
|
|
189
|
+
const internalTimestamp = await retrieveLastConsentTimestamp();
|
|
190
|
+
try {
|
|
191
|
+
if (new Date(lastConsentTimestamp) > new Date(internalTimestamp) || internalTimestamp === '') {
|
|
192
|
+
// Remote consent is newer or we haven't recorded any consent yet. Store remote consent.
|
|
193
|
+
const remoteConsentCategories = consented.map(category => _constants.ConsentCategory[category]);
|
|
194
|
+
await storeConsent(cmp, remoteConsentCategories);
|
|
195
|
+
return remoteConsentCategories;
|
|
196
|
+
}
|
|
197
|
+
} catch (error) {
|
|
198
|
+
// Error parsing timestamp
|
|
199
|
+
}
|
|
200
|
+
return consent;
|
|
201
|
+
} catch (error) {
|
|
202
|
+
console.error('Error fetching consent:', error);
|
|
203
|
+
// Consent not found or network/server error.
|
|
204
|
+
const consent = await retrieveConsent(cmp);
|
|
205
|
+
return consent;
|
|
206
|
+
}
|
|
144
207
|
};
|
|
145
208
|
exports.fetchConsent = fetchConsent;
|
|
146
209
|
const fetchConfig = (customerId, configId) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_constants","require","
|
|
1
|
+
{"version":3,"names":["_constants","require","_OsanoCmp","_API","_interopRequireDefault","_reactNative","_textEncoding","_utils","_jsSha","e","__esModule","default","Buffer","CONSENT_URI","LOOKUPS_URI","OSANO_ORIGIN","env","overrideConfig","variant","createConsentPayload","cmp","consent","Object","fromEntries","entries","customerId","configId","consented","consentingDomain","consentingPlatform","Platform","OS","deviceId","extUsrData","filter","value","undefined","createConsentRecordPayload","consentedCategories","hashedExtUsrData","hashExtUsrData","osnoCustomerId","osnoConfigId","join","userConsentId","STORAGE_KEY","storeConsent","Promise","resolve","reject","resConsent","setStorage","JSON","stringify","Date","then","catch","clearConsent","ConsentCategory","ESSENTIAL","clearStorage","exports","retrieveConsent","consentJson","parse","length","Error","getStorage","retrieveLastConsentTimestamp","resValue","timestamp","recordConsent","payload","API","post","referrer","consentCategories","error","encoder","TextEncoder","data","encode","hash","sha512","arrayBuffer","base64","from","toString","hashUrlSafe","replace","fetchConsent","hashedUserData","config","remoteConsent","response","get","lastConsentTimestamp","internalTimestamp","remoteConsentCategories","map","category","ConsentCategoryType","console","fetchConfig","headers","json","merge","country","region","gdprApplies"],"sourceRoot":"../../../src","sources":["services/consent.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { env } from '../constants';
|
|
4
|
-
import { Platform } from 'react-native';
|
|
1
|
+
import { ConsentCategory, ConsentCategory as ConsentCategoryType } from '../constants';
|
|
2
|
+
import { clearStorage, getStorage, setStorage } from '../native/OsanoCmp';
|
|
5
3
|
import API from '../utils/API';
|
|
4
|
+
import { Platform } from 'react-native';
|
|
5
|
+
import { TextEncoder } from 'text-encoding';
|
|
6
|
+
import { env } from '../constants';
|
|
6
7
|
import { merge } from '../utils';
|
|
7
|
-
import {
|
|
8
|
-
|
|
8
|
+
import { sha512 } from 'js-sha512';
|
|
9
|
+
const Buffer = require('buffer').Buffer;
|
|
9
10
|
const {
|
|
10
11
|
CONSENT_URI,
|
|
11
12
|
LOOKUPS_URI,
|
|
@@ -27,7 +28,8 @@ function createConsentPayload(cmp, consent) {
|
|
|
27
28
|
}).filter(([, value]) => value !== undefined));
|
|
28
29
|
}
|
|
29
30
|
function createConsentRecordPayload(cmp, consent) {
|
|
30
|
-
const consentedCategories = consent ?? cmp.consent;
|
|
31
|
+
const consentedCategories = consent ?? cmp.consent ?? [];
|
|
32
|
+
const hashedExtUsrData = hashExtUsrData(cmp.customerId, cmp.configId, cmp.extUsrData);
|
|
31
33
|
return Object.fromEntries(Object.entries({
|
|
32
34
|
osnoCustomerId: cmp.customerId,
|
|
33
35
|
osnoConfigId: cmp.configId,
|
|
@@ -35,7 +37,7 @@ function createConsentRecordPayload(cmp, consent) {
|
|
|
35
37
|
consentingDomain: cmp.consentingDomain,
|
|
36
38
|
consentingPlatform: `${Platform.OS}.react-native`,
|
|
37
39
|
userConsentId: cmp.deviceId,
|
|
38
|
-
extUsrData:
|
|
40
|
+
extUsrData: hashedExtUsrData
|
|
39
41
|
}).filter(([, value]) => value !== undefined));
|
|
40
42
|
}
|
|
41
43
|
const STORAGE_KEY = 'osano_consentmanager';
|
|
@@ -49,7 +51,9 @@ const storeConsent = async (cmp, consent) => {
|
|
|
49
51
|
switch (Platform.OS) {
|
|
50
52
|
case 'ios':
|
|
51
53
|
case 'android':
|
|
52
|
-
setStorage(`${STORAGE_KEY}
|
|
54
|
+
setStorage(`${STORAGE_KEY}_last_recorded_consent_date`, JSON.stringify(new Date())).then(() => {
|
|
55
|
+
setStorage(`${STORAGE_KEY}_${cmp.configId}`, JSON.stringify(cmp.consent)).then(resConsent).catch(reject);
|
|
56
|
+
}).catch(reject);
|
|
53
57
|
break;
|
|
54
58
|
}
|
|
55
59
|
});
|
|
@@ -67,7 +71,6 @@ export const clearConsent = async cmp => {
|
|
|
67
71
|
clearStorage(`${STORAGE_KEY}_${cmp.configId}`).then(resConsent);
|
|
68
72
|
break;
|
|
69
73
|
default:
|
|
70
|
-
window.localStorage.removeItem(`${STORAGE_KEY}_${cmp.configId}`);
|
|
71
74
|
break;
|
|
72
75
|
}
|
|
73
76
|
});
|
|
@@ -96,11 +99,29 @@ const retrieveConsent = async cmp => {
|
|
|
96
99
|
});
|
|
97
100
|
break;
|
|
98
101
|
default:
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
const retrieveLastConsentTimestamp = async () => {
|
|
107
|
+
return new Promise(resolve => {
|
|
108
|
+
const resValue = consentJson => {
|
|
109
|
+
if (consentJson) {
|
|
110
|
+
const timestamp = JSON.parse(consentJson);
|
|
111
|
+
resolve(timestamp);
|
|
112
|
+
return timestamp;
|
|
113
|
+
} else {
|
|
114
|
+
resolve('');
|
|
115
|
+
return '';
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
switch (Platform.OS) {
|
|
119
|
+
case 'ios':
|
|
120
|
+
case 'android':
|
|
121
|
+
getStorage(`${STORAGE_KEY}_last_recorded_consent_date`).then(resValue);
|
|
122
|
+
break;
|
|
123
|
+
default:
|
|
124
|
+
// nothing
|
|
104
125
|
break;
|
|
105
126
|
}
|
|
106
127
|
});
|
|
@@ -114,24 +135,65 @@ export const recordConsent = (cmp, consent) => {
|
|
|
114
135
|
throw error;
|
|
115
136
|
});
|
|
116
137
|
};
|
|
117
|
-
export
|
|
138
|
+
export function hashExtUsrData(customerId, configId, extUsrData) {
|
|
139
|
+
if (extUsrData === '' || customerId === '' || configId === '') {
|
|
140
|
+
return '';
|
|
141
|
+
} else {
|
|
142
|
+
try {
|
|
143
|
+
const encoder = new TextEncoder();
|
|
144
|
+
const data = encoder.encode(`${customerId}/${configId}/${extUsrData}`);
|
|
145
|
+
const hash = sha512.arrayBuffer(data);
|
|
146
|
+
const base64 = Buffer.from(hash).toString('base64');
|
|
147
|
+
const hashUrlSafe = base64.replace(/\+/g, '-').replace(/\//g, '_');
|
|
148
|
+
return hashUrlSafe;
|
|
149
|
+
} catch (error) {
|
|
150
|
+
// something went wrong
|
|
151
|
+
return '';
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
export const fetchConsent = async cmp => {
|
|
118
156
|
const {
|
|
119
157
|
customerId,
|
|
120
158
|
configId,
|
|
121
|
-
extUsrData
|
|
159
|
+
extUsrData
|
|
122
160
|
} = cmp;
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
161
|
+
try {
|
|
162
|
+
const consent = await retrieveConsent(cmp);
|
|
163
|
+
const hashedUserData = hashExtUsrData(customerId, configId, extUsrData);
|
|
164
|
+
|
|
165
|
+
// No user data or remote consent disabled
|
|
166
|
+
if (hashedUserData === '' || cmp.config.remoteConsent === false) {
|
|
129
167
|
return consent;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
168
|
+
}
|
|
169
|
+
const response = await API.get(`${LOOKUPS_URI}/customer/${customerId}/config/${configId}/user/${hashedUserData}/consent`);
|
|
170
|
+
const {
|
|
171
|
+
consented,
|
|
172
|
+
lastConsentTimestamp
|
|
173
|
+
} = response;
|
|
174
|
+
if (!consented || !lastConsentTimestamp) {
|
|
175
|
+
// No remote consent found, use local consent
|
|
176
|
+
await storeConsent(cmp, consent);
|
|
177
|
+
return consent;
|
|
178
|
+
}
|
|
179
|
+
const internalTimestamp = await retrieveLastConsentTimestamp();
|
|
180
|
+
try {
|
|
181
|
+
if (new Date(lastConsentTimestamp) > new Date(internalTimestamp) || internalTimestamp === '') {
|
|
182
|
+
// Remote consent is newer or we haven't recorded any consent yet. Store remote consent.
|
|
183
|
+
const remoteConsentCategories = consented.map(category => ConsentCategoryType[category]);
|
|
184
|
+
await storeConsent(cmp, remoteConsentCategories);
|
|
185
|
+
return remoteConsentCategories;
|
|
186
|
+
}
|
|
187
|
+
} catch (error) {
|
|
188
|
+
// Error parsing timestamp
|
|
189
|
+
}
|
|
190
|
+
return consent;
|
|
191
|
+
} catch (error) {
|
|
192
|
+
console.error('Error fetching consent:', error);
|
|
193
|
+
// Consent not found or network/server error.
|
|
194
|
+
const consent = await retrieveConsent(cmp);
|
|
195
|
+
return consent;
|
|
196
|
+
}
|
|
135
197
|
};
|
|
136
198
|
export const fetchConfig = (customerId, configId) => {
|
|
137
199
|
return API.get(`${OSANO_ORIGIN}/${customerId}/${configId}/config.json`, true).then(response => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["ConsentCategory","ConsentCategoryType","clearStorage","getStorage","setStorage","API","Platform","TextEncoder","env","merge","sha512","Buffer","require","CONSENT_URI","LOOKUPS_URI","OSANO_ORIGIN","overrideConfig","variant","createConsentPayload","cmp","consent","Object","fromEntries","entries","customerId","configId","consented","consentingDomain","consentingPlatform","OS","deviceId","extUsrData","filter","value","undefined","createConsentRecordPayload","consentedCategories","hashedExtUsrData","hashExtUsrData","osnoCustomerId","osnoConfigId","join","userConsentId","STORAGE_KEY","storeConsent","Promise","resolve","reject","resConsent","JSON","stringify","Date","then","catch","clearConsent","ESSENTIAL","retrieveConsent","consentJson","parse","length","Error","retrieveLastConsentTimestamp","resValue","timestamp","recordConsent","payload","post","referrer","consentCategories","error","encoder","data","encode","hash","arrayBuffer","base64","from","toString","hashUrlSafe","replace","fetchConsent","hashedUserData","config","remoteConsent","response","get","lastConsentTimestamp","internalTimestamp","remoteConsentCategories","map","category","console","fetchConfig","headers","json","country","region","gdprApplies"],"sourceRoot":"../../../src","sources":["services/consent.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export const __esModule: boolean;
|
|
2
|
+
export function hashExtUsrData(customerId: any, configId: any, extUsrData: any): string;
|
|
2
3
|
export function clearConsent(cmp: any): Promise<any>;
|
|
3
4
|
export function recordConsent(cmp: any, consent: any): any;
|
|
4
5
|
export function fetchConsent(cmp: any): Promise<any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../../../commonjs/services/consent.js"],"names":[],"mappings":";AA
|
|
1
|
+
{"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../../../commonjs/services/consent.js"],"names":[],"mappings":";AAmJA,wFAgBC;AA/FD,qDAgBC;AAqDD,2DAQC;AAmBD,qDA0CC;AAED,iEAiBC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../../../module/services/consent.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../../../module/services/consent.js"],"names":[],"mappings":"AAyIA,wFAgBC;AA7FM,qDAgBN;AAoDM,oEAQN;AAkBM,qDA0CN;AACM,0EAiBN"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { ConsentCategory, ConsentCategory as ConsentCategoryType } from '../constants';
|
|
1
2
|
import type { Config } from '../types/consent-config';
|
|
2
3
|
import type { ConsentManager } from '../ConsentManager';
|
|
3
|
-
import { type ConsentCategory as ConsentCategoryType } from '../constants';
|
|
4
4
|
export type ConsentPayload = {
|
|
5
5
|
customerId: string;
|
|
6
6
|
configId: string;
|
|
@@ -19,8 +19,14 @@ export type ConsentRecordPayload = {
|
|
|
19
19
|
userConsentId: string;
|
|
20
20
|
extUsrData?: string;
|
|
21
21
|
};
|
|
22
|
-
export
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
export type ConsentLookupResponseType = {
|
|
23
|
+
consented: string[];
|
|
24
|
+
lastConsentTimestamp: string;
|
|
25
|
+
userConsentId: string;
|
|
26
|
+
};
|
|
27
|
+
export declare const clearConsent: (cmp: ConsentManager) => Promise<ConsentCategory[]>;
|
|
28
|
+
export declare const recordConsent: (cmp: ConsentManager, consent?: ConsentCategoryType[]) => Promise<ConsentCategory[]>;
|
|
29
|
+
export declare function hashExtUsrData(customerId: string, configId: string, extUsrData: string): string;
|
|
30
|
+
export declare const fetchConsent: (cmp: ConsentManager) => Promise<ConsentCategory[]>;
|
|
25
31
|
export declare const fetchConfig: (customerId: string, configId: string) => Promise<Config | null>;
|
|
26
32
|
//# sourceMappingURL=consent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../../../src/services/consent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../../../src/services/consent.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,eAAe,EACf,eAAe,IAAI,mBAAmB,EACtC,MAAM,cAAc,CAAC;AAItB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAgBxD,MAAM,MAAM,cAAc,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACvC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;CACtB,CAAC;AA2EF,eAAO,MAAM,YAAY,QAAe,cAAc,+BAgBrD,CAAC;AAyDF,eAAO,MAAM,aAAa,QACpB,cAAc,YACT,mBAAmB,EAAE,+BAY/B,CAAC;AAEF,wBAAgB,cAAc,CAC7B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAChB,MAAM,CAgBR;AAED,eAAO,MAAM,YAAY,QAAe,cAAc,+BAmDrD,CAAC;AAEF,eAAO,MAAM,WAAW,eAAgB,MAAM,YAAY,MAAM,2BAsB/D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@osano/osano-cmp-react-native",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Package and example for the react-native Osano CMP SDK",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -23,11 +23,15 @@
|
|
|
23
23
|
"!**/__tests__",
|
|
24
24
|
"!**/__fixtures__",
|
|
25
25
|
"!**/__mocks__",
|
|
26
|
-
"!**/.*"
|
|
26
|
+
"!**/.*",
|
|
27
|
+
"!lib/typescript/webdriverio-appium/**",
|
|
28
|
+
"!lib/typescript/webdriverio-appium/common/**",
|
|
29
|
+
"!lib/typescript/webdriverio-appium/config/**",
|
|
30
|
+
"!lib/typescript/webdriverio-appium/test/**"
|
|
27
31
|
],
|
|
28
32
|
"scripts": {
|
|
29
33
|
"example": "yarn workspace osano-cmp-sdk-example",
|
|
30
|
-
"test": "jest
|
|
34
|
+
"test": "jest src/services/__tests__/consent.test.ts src/__tests__/index.test.tsx",
|
|
31
35
|
"typecheck": "tsc --noEmit",
|
|
32
36
|
"lint": "eslint \"**/*.{js,ts,tsx}\"",
|
|
33
37
|
"clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
|
|
@@ -65,17 +69,20 @@
|
|
|
65
69
|
"@docusaurus/module-type-aliases": "3.5.2",
|
|
66
70
|
"@docusaurus/preset-classic": "3.5.2",
|
|
67
71
|
"@mdx-js/react": "^3.0.1",
|
|
72
|
+
"@testing-library/react-native": "^12.8.1",
|
|
68
73
|
"@types/jest": "^29.5.5",
|
|
69
74
|
"@types/react": "^18.2.44",
|
|
75
|
+
"@types/react-test-renderer": "^18.3.0",
|
|
76
|
+
"@types/text-encoding": "^0.0.39",
|
|
70
77
|
"commitlint": "^17.0.2",
|
|
71
78
|
"del-cli": "^5.1.0",
|
|
72
79
|
"jest": "^29.7.0",
|
|
73
80
|
"prettier": "^3.0.3",
|
|
74
81
|
"prism-react-renderer": "^2.4.0",
|
|
75
82
|
"react": "18.3.1",
|
|
76
|
-
"react-dom": "18.3.1",
|
|
77
83
|
"react-native": "0.74.4",
|
|
78
84
|
"react-native-builder-bob": "^0.23.2",
|
|
85
|
+
"react-test-renderer": "^18.3.1",
|
|
79
86
|
"release-it": "^17.6.0",
|
|
80
87
|
"turbo": "^1.10.7",
|
|
81
88
|
"typescript": "^5.2.2"
|
|
@@ -131,12 +138,9 @@
|
|
|
131
138
|
]
|
|
132
139
|
},
|
|
133
140
|
"dependencies": {
|
|
134
|
-
"
|
|
135
|
-
"@types/react-test-renderer": "^18.3.0",
|
|
136
|
-
"react": "*",
|
|
137
|
-
"react-dom": "^17.0.2",
|
|
141
|
+
"js-sha512": "^0.9.0",
|
|
138
142
|
"react-native-picker-modal-view": "^1.3.2",
|
|
139
143
|
"react-native-svg": "^15.1.0",
|
|
140
|
-
"
|
|
144
|
+
"text-encoding": "^0.7.0"
|
|
141
145
|
}
|
|
142
146
|
}
|
package/src/services/consent.ts
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import {
|
|
2
|
+
ConsentCategory,
|
|
3
|
+
ConsentCategory as ConsentCategoryType,
|
|
4
|
+
} from '../constants';
|
|
5
|
+
import { clearStorage, getStorage, setStorage } from '../native/OsanoCmp';
|
|
5
6
|
|
|
6
7
|
import API from '../utils/API';
|
|
7
8
|
import type { Config } from '../types/consent-config';
|
|
8
9
|
import type { ConsentManager } from '../ConsentManager';
|
|
10
|
+
import { Platform } from 'react-native';
|
|
11
|
+
import { TextEncoder } from 'text-encoding';
|
|
12
|
+
import { env } from '../constants';
|
|
9
13
|
import { merge } from '../utils';
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
} from '../constants';
|
|
14
|
-
import { clearStorage, getStorage, setStorage } from '../native/OsanoCmp';
|
|
14
|
+
import { sha512 } from 'js-sha512';
|
|
15
|
+
|
|
16
|
+
const Buffer = require('buffer').Buffer;
|
|
15
17
|
|
|
16
18
|
const { CONSENT_URI, LOOKUPS_URI, OSANO_ORIGIN } = env;
|
|
17
19
|
|
|
@@ -40,6 +42,12 @@ export type ConsentRecordPayload = {
|
|
|
40
42
|
extUsrData?: string;
|
|
41
43
|
};
|
|
42
44
|
|
|
45
|
+
export type ConsentLookupResponseType = {
|
|
46
|
+
consented: string[];
|
|
47
|
+
lastConsentTimestamp: string;
|
|
48
|
+
userConsentId: string;
|
|
49
|
+
};
|
|
50
|
+
|
|
43
51
|
function createConsentPayload(
|
|
44
52
|
cmp: ConsentManager,
|
|
45
53
|
consent?: ConsentCategoryType[],
|
|
@@ -60,8 +68,13 @@ function createConsentPayload(
|
|
|
60
68
|
function createConsentRecordPayload(
|
|
61
69
|
cmp: ConsentManager,
|
|
62
70
|
consent?: ConsentCategoryType[],
|
|
63
|
-
): ConsentRecordPayload{
|
|
64
|
-
const consentedCategories = consent ?? cmp.consent
|
|
71
|
+
): ConsentRecordPayload {
|
|
72
|
+
const consentedCategories = consent ?? cmp.consent ?? [];
|
|
73
|
+
const hashedExtUsrData = hashExtUsrData(
|
|
74
|
+
cmp.customerId,
|
|
75
|
+
cmp.configId,
|
|
76
|
+
cmp.extUsrData,
|
|
77
|
+
);
|
|
65
78
|
return Object.fromEntries(
|
|
66
79
|
Object.entries({
|
|
67
80
|
osnoCustomerId: cmp.customerId,
|
|
@@ -70,7 +83,7 @@ function createConsentRecordPayload(
|
|
|
70
83
|
consentingDomain: cmp.consentingDomain,
|
|
71
84
|
consentingPlatform: `${Platform.OS}.react-native`,
|
|
72
85
|
userConsentId: cmp.deviceId,
|
|
73
|
-
extUsrData:
|
|
86
|
+
extUsrData: hashedExtUsrData,
|
|
74
87
|
}).filter(([, value]) => value !== undefined),
|
|
75
88
|
) as ConsentRecordPayload;
|
|
76
89
|
}
|
|
@@ -91,10 +104,17 @@ const storeConsent = async (
|
|
|
91
104
|
case 'ios':
|
|
92
105
|
case 'android':
|
|
93
106
|
setStorage(
|
|
94
|
-
`${STORAGE_KEY}
|
|
95
|
-
JSON.stringify(
|
|
107
|
+
`${STORAGE_KEY}_last_recorded_consent_date`,
|
|
108
|
+
JSON.stringify(new Date()),
|
|
96
109
|
)
|
|
97
|
-
.then(
|
|
110
|
+
.then(() => {
|
|
111
|
+
setStorage(
|
|
112
|
+
`${STORAGE_KEY}_${cmp.configId}`,
|
|
113
|
+
JSON.stringify(cmp.consent),
|
|
114
|
+
)
|
|
115
|
+
.then(resConsent)
|
|
116
|
+
.catch(reject);
|
|
117
|
+
})
|
|
98
118
|
.catch(reject);
|
|
99
119
|
break;
|
|
100
120
|
}
|
|
@@ -114,7 +134,6 @@ export const clearConsent = async (cmp: ConsentManager) => {
|
|
|
114
134
|
clearStorage(`${STORAGE_KEY}_${cmp.configId}`).then(resConsent);
|
|
115
135
|
break;
|
|
116
136
|
default:
|
|
117
|
-
window.localStorage.removeItem(`${STORAGE_KEY}_${cmp.configId}`);
|
|
118
137
|
break;
|
|
119
138
|
}
|
|
120
139
|
});
|
|
@@ -146,13 +165,30 @@ const retrieveConsent = async (cmp: ConsentManager) => {
|
|
|
146
165
|
});
|
|
147
166
|
break;
|
|
148
167
|
default:
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const retrieveLastConsentTimestamp = async () => {
|
|
174
|
+
return new Promise<string>((resolve) => {
|
|
175
|
+
const resValue = (consentJson: string | null | undefined) => {
|
|
176
|
+
if (consentJson) {
|
|
177
|
+
const timestamp = JSON.parse(consentJson);
|
|
178
|
+
resolve(timestamp);
|
|
179
|
+
return timestamp;
|
|
180
|
+
} else {
|
|
181
|
+
resolve('');
|
|
182
|
+
return '';
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
switch (Platform.OS) {
|
|
186
|
+
case 'ios':
|
|
187
|
+
case 'android':
|
|
188
|
+
getStorage(`${STORAGE_KEY}_last_recorded_consent_date`).then(resValue);
|
|
189
|
+
break;
|
|
190
|
+
default:
|
|
191
|
+
// nothing
|
|
156
192
|
break;
|
|
157
193
|
}
|
|
158
194
|
});
|
|
@@ -163,7 +199,9 @@ export const recordConsent = (
|
|
|
163
199
|
consent?: ConsentCategoryType[],
|
|
164
200
|
) => {
|
|
165
201
|
const payload = createConsentRecordPayload(cmp, consent);
|
|
166
|
-
return API.post(`${CONSENT_URI}/record`, payload, {
|
|
202
|
+
return API.post(`${CONSENT_URI}/record`, payload, {
|
|
203
|
+
referrer: cmp.consentingDomain,
|
|
204
|
+
})
|
|
167
205
|
.then(() => consent ?? cmp.consent)
|
|
168
206
|
.then((consentCategories) => storeConsent(cmp, consentCategories))
|
|
169
207
|
.catch((error) => {
|
|
@@ -172,23 +210,79 @@ export const recordConsent = (
|
|
|
172
210
|
});
|
|
173
211
|
};
|
|
174
212
|
|
|
175
|
-
export
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
})
|
|
186
|
-
|
|
187
|
-
.
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
213
|
+
export function hashExtUsrData(
|
|
214
|
+
customerId: string,
|
|
215
|
+
configId: string,
|
|
216
|
+
extUsrData: string,
|
|
217
|
+
): string {
|
|
218
|
+
if (extUsrData === '' || customerId === '' || configId === '') {
|
|
219
|
+
return '';
|
|
220
|
+
} else {
|
|
221
|
+
try {
|
|
222
|
+
const encoder = new TextEncoder();
|
|
223
|
+
const data = encoder.encode(`${customerId}/${configId}/${extUsrData}`);
|
|
224
|
+
const hash = sha512.arrayBuffer(data);
|
|
225
|
+
const base64 = Buffer.from(hash).toString('base64');
|
|
226
|
+
const hashUrlSafe = base64.replace(/\+/g, '-').replace(/\//g, '_');
|
|
227
|
+
return hashUrlSafe;
|
|
228
|
+
} catch (error) {
|
|
229
|
+
// something went wrong
|
|
230
|
+
return '';
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export const fetchConsent = async (cmp: ConsentManager) => {
|
|
236
|
+
const { customerId, configId, extUsrData } = cmp;
|
|
237
|
+
|
|
238
|
+
try {
|
|
239
|
+
const consent = await retrieveConsent(cmp);
|
|
240
|
+
|
|
241
|
+
const hashedUserData = hashExtUsrData(customerId, configId, extUsrData);
|
|
242
|
+
|
|
243
|
+
// No user data or remote consent disabled
|
|
244
|
+
if (hashedUserData === '' || cmp.config.remoteConsent === false) {
|
|
245
|
+
return consent;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const response = await API.get(
|
|
249
|
+
`${LOOKUPS_URI}/customer/${customerId}/config/${configId}/user/${hashedUserData}/consent`,
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
const { consented, lastConsentTimestamp } =
|
|
253
|
+
response as ConsentLookupResponseType;
|
|
254
|
+
|
|
255
|
+
if (!consented || !lastConsentTimestamp) {
|
|
256
|
+
// No remote consent found, use local consent
|
|
257
|
+
await storeConsent(cmp, consent);
|
|
258
|
+
return consent;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const internalTimestamp = await retrieveLastConsentTimestamp();
|
|
262
|
+
try {
|
|
263
|
+
if (
|
|
264
|
+
new Date(lastConsentTimestamp) > new Date(internalTimestamp) ||
|
|
265
|
+
internalTimestamp === ''
|
|
266
|
+
) {
|
|
267
|
+
// Remote consent is newer or we haven't recorded any consent yet. Store remote consent.
|
|
268
|
+
const remoteConsentCategories = consented.map(
|
|
269
|
+
(category) =>
|
|
270
|
+
ConsentCategoryType[category as keyof typeof ConsentCategoryType],
|
|
271
|
+
);
|
|
272
|
+
await storeConsent(cmp, remoteConsentCategories);
|
|
273
|
+
return remoteConsentCategories;
|
|
274
|
+
}
|
|
275
|
+
} catch (error) {
|
|
276
|
+
// Error parsing timestamp
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return consent;
|
|
280
|
+
} catch (error) {
|
|
281
|
+
console.error('Error fetching consent:', error);
|
|
282
|
+
// Consent not found or network/server error.
|
|
283
|
+
const consent = await retrieveConsent(cmp);
|
|
284
|
+
return consent;
|
|
285
|
+
}
|
|
192
286
|
};
|
|
193
287
|
|
|
194
288
|
export const fetchConfig = (customerId: string, configId: string) => {
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export function clickElement(ele: any): Promise<void>;
|
|
2
|
-
export function enableIAB(): Promise<void>;
|
|
3
|
-
export function updateConfig(settings: any): Promise<void>;
|
|
4
|
-
export function updateFlavor(flavor: any): Promise<void>;
|
|
5
|
-
export function validateConsentIab(consentProvided: any, consentExpected: any): Promise<void>;
|
|
6
|
-
export function validateConsent(consentProvided: any, consentExpected: any): Promise<void>;
|
|
7
|
-
export function clearConsent(): Promise<void>;
|
|
8
|
-
export function provideConsent(consent: any, bannerText: any, closeButtonExists: any): Promise<void>;
|
|
9
|
-
export function toggleFLC(iabEnabled: any): Promise<void>;
|
|
10
|
-
export function toggleDrawer(iabEnabled: any): Promise<void>;
|
|
11
|
-
export const bannerFlavorOne: "This website utilizes technologies such as cookies to enable essential site functionality, as well as for analytics, personalization, and targeted advertising. To learn more, view the following link:";
|
|
12
|
-
export const bannerFlavorTwo: "This website utilizes technologies such as cookies to enable essential site functionality, as well as for analytics, personalization, and targeted advertising. You may change your settings at any time or accept the default settings. You may close this banner to continue with only essential cookies.";
|
|
13
|
-
export const bannerFlavorTwoIab: "We and our 8 IAB TCF partners store and access information on your device for the following purposes: advertising and content measurement, audience research, and services development, personalised advertising, personalised content. \n\n\nPersonal data may be processed to do the following: use precise geolocation data and actively scan device characteristics for identification. \n\n\nOur third party IAB TCF partners may store and access information on your device such as IP address and device characteristics. Our IAB TCF Partners may process this personal data on the basis of legitimate interest, or with your consent. You may change or withdraw your preferences at any time by clicking on the cookie icon or link; however, as a consequence, you may not see relevant ads or personalized content. You may change your settings at any time or accept the default settings. You may close this banner to continue with only essential cookies.";
|
|
14
|
-
export const bannerFlavorThree: "This website utilizes technologies such as cookies to enable essential site functionality, as well as for analytics, personalization, and targeted advertising.";
|
|
15
|
-
export const bannerFlavorSix: "To improve your experience, we (and our partners) store and/or access information on your terminal (cookie or equivalent) with your consent for all our websites and applications, on your connected terminals.";
|
|
16
|
-
export const bannerFlavorSixCont: "• Measure the audience of the advertising on our website, without profiling • Display personalized ads based on your navigation and your profile • Personalize our editorial content based on your navigation • Allow you to share content on social networks or platforms present on our website • Send you advertising based on your location";
|
|
17
|
-
export const platform: string | undefined;
|
|
18
|
-
export const showConsentVariantButton: "//XCUIElementTypeButton[@name=\"Show Consent Variant\"]" | "~Show Consent Variant";
|
|
19
|
-
export const closeBannerButton: "//XCUIElementTypeStaticText[@name=\"✕\"]" | "//com.horcrux.svg.SvgView";
|
|
20
|
-
export const closeDrawerButton: "-ios predicate string:name == \"✕\" AND label == \"✕\" AND type == \"XCUIElementTypeButton\"" | "android=new UiSelector().className(\"android.view.ViewGroup\").instance(40)";
|
|
21
|
-
//# sourceMappingURL=commonCommands.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"commonCommands.d.ts","sourceRoot":"","sources":["../../../../webdriverio-appium/common/commonCommands.js"],"names":[],"mappings":"AA0BA,sDAGC;AAED,2CAMC;AAED,2DAgBC;AAED,yDASC;AAED,8FAkBC;AAED,2FAsBC;AAED,8CAOC;AAED,qGAaC;AAED,0DAeC;AAED,6DAqBC;AA/JD,wOAAyO;AACzO,4UAA6U;AAC7U,i9BAAk9B;AACl9B,kMAAmM;AACnM,gPAAgP;AAChP,oXAAqX;AACrX,0CAA6C;AAC7C,2HAA+I;AAC/I,yGAA6H;AAC7H,+MAA6N"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wdio.conf.android.d.cts","sourceRoot":"","sources":["../../../../webdriverio-appium/config/wdio.conf.android.cjs"],"names":[],"mappings":""}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export namespace config {
|
|
2
|
-
let runner: string;
|
|
3
|
-
let port: number;
|
|
4
|
-
let specs: string[];
|
|
5
|
-
let exclude: never[];
|
|
6
|
-
let maxInstances: number;
|
|
7
|
-
let capabilities: never[];
|
|
8
|
-
let logLevel: string;
|
|
9
|
-
let bail: number;
|
|
10
|
-
let waitforTimeout: number;
|
|
11
|
-
let connectionRetryTimeout: number;
|
|
12
|
-
let connectionRetryCount: number;
|
|
13
|
-
let services: string[];
|
|
14
|
-
let framework: string;
|
|
15
|
-
let reporters: string[];
|
|
16
|
-
namespace mochaOpts {
|
|
17
|
-
let ui: string;
|
|
18
|
-
let timeout: number;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=wdio.conf.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wdio.conf.d.cts","sourceRoot":"","sources":["../../../../webdriverio-appium/config/wdio.conf.cjs"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wdio.conf.ios.d.cts","sourceRoot":"","sources":["../../../../webdriverio-appium/config/wdio.conf.ios.cjs"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"six-drawer.d.ts","sourceRoot":"","sources":["../../../../../webdriverio-appium/test/android/six-drawer.js"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"one.d.ts","sourceRoot":"","sources":["../../../../../webdriverio-appium/test/ios/one.js"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"six.d.ts","sourceRoot":"","sources":["../../../../../webdriverio-appium/test/ios/six.js"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"three.d.ts","sourceRoot":"","sources":["../../../../../webdriverio-appium/test/ios/three.js"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"two-iab.d.ts","sourceRoot":"","sources":["../../../../../webdriverio-appium/test/ios/two-iab.js"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"two.d.ts","sourceRoot":"","sources":["../../../../../webdriverio-appium/test/ios/two.js"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"one.d.ts","sourceRoot":"","sources":["../../../../webdriverio-appium/test/one.js"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"six-iab.d.ts","sourceRoot":"","sources":["../../../../webdriverio-appium/test/six-iab.js"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"three.d.ts","sourceRoot":"","sources":["../../../../webdriverio-appium/test/three.js"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"two-iab.d.ts","sourceRoot":"","sources":["../../../../webdriverio-appium/test/two-iab.js"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"two.d.ts","sourceRoot":"","sources":["../../../../webdriverio-appium/test/two.js"],"names":[],"mappings":""}
|