@mhubcloud/tms_core 1.7.5 → 2.0.0-beta.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/.eslintignore +3 -0
- package/.eslintrc.cjs +87 -0
- package/.prettierignore +3 -0
- package/.prettierrc +10 -0
- package/.vscode/extensions.json +12 -0
- package/.vscode/settings.json +52 -0
- package/index.js +3 -1
- package/{lib → js/lib}/defaultPublisher.js +26 -24
- package/js/lib/utils.js +349 -0
- package/js/publishers/AffiliatePort.js +78 -0
- package/{publishers → js/publishers}/CJ.js +7 -5
- package/{publishers → js/publishers}/Facebook.js +6 -4
- package/{publishers → js/publishers}/GoogleAnalytics4.js +8 -6
- package/js/publishers/HttpPublisher.js +64 -0
- package/{publishers → js/publishers}/Piano.js +6 -4
- package/{publishers → js/publishers}/UniversalAnalytics.js +7 -5
- package/package.json +46 -29
- package/releasePlan.md +3 -0
- package/src/defaultPublisher.ts +132 -0
- package/src/index.ts +25 -0
- package/src/publishers/affiliatePort.ts +69 -0
- package/src/publishers/cj.ts +67 -0
- package/src/publishers/facebook.ts +49 -0
- package/src/publishers/googleAnalytics4.ts +60 -0
- package/src/publishers/piano.ts +71 -0
- package/src/publishers/universalAnalytics.ts +63 -0
- package/src/types/EventHubMessage.ts +8 -0
- package/src/types/EventPublisher.ts +9 -0
- package/src/types/PlatformPublisher.ts +19 -0
- package/src/types/UtilTypes.ts +1 -0
- package/src/types/global.d.ts +3 -0
- package/src/utils/utils.ts +358 -0
- package/tests/AffiliatePort.js +138 -0
- package/tests/CJ.js +144 -119
- package/tests/Facebook.js +124 -103
- package/tests/GoogleAnalytics4.js +82 -74
- package/tests/Piano.js +112 -99
- package/tests/UniversalAnalytics.js +90 -77
- package/tests/testUtils.js +7 -0
- package/tsconfig.eslint.json +43 -0
- package/tsconfig.json +26 -0
- package/lib/utils.js +0 -307
package/tests/CJ.js
CHANGED
|
@@ -1,135 +1,160 @@
|
|
|
1
|
-
const publisher = require(
|
|
2
|
-
const defaultPublisher = require(
|
|
3
|
-
const utils = require(
|
|
1
|
+
const publisher = require('../dist/index.js').publisher.CJ;
|
|
2
|
+
const defaultPublisher = require('../dist/index.js').DefaultPublisher;
|
|
3
|
+
const utils = require('../dist/index.js').utils;
|
|
4
4
|
var assert = require('assert');
|
|
5
|
+
const testUtils = require('./testUtils');
|
|
5
6
|
|
|
6
7
|
describe('test CJ publisher', function () {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
8
|
+
it('purchase', async function () {
|
|
9
|
+
var eventHubMessages = [
|
|
10
|
+
{
|
|
11
|
+
currencyCode: 'CZK',
|
|
12
|
+
event: {
|
|
13
|
+
region: 'MAIN',
|
|
14
|
+
id: '115169112-4870.1657003407533',
|
|
15
|
+
code: 'purchase',
|
|
16
|
+
},
|
|
17
|
+
session: {
|
|
18
|
+
userAgent:
|
|
19
|
+
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36',
|
|
20
|
+
ip: '89.177.126.237',
|
|
21
|
+
referrer: 'https://crossmasters.com/',
|
|
22
|
+
},
|
|
23
|
+
referrer: 'https://crossmasters.com/',
|
|
24
|
+
permissions: [],
|
|
25
|
+
identity: {
|
|
26
|
+
piano: {
|
|
27
|
+
id: '1657003393413.319297501',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
publisher: {
|
|
31
|
+
code: 'mhubcloud.com',
|
|
32
|
+
tm: 'GTM-N7K9L4X',
|
|
33
|
+
tmv: '494',
|
|
34
|
+
},
|
|
35
|
+
$schema: '/mhub/purchase',
|
|
36
|
+
id: '20162351',
|
|
37
|
+
revenue: 440,
|
|
38
|
+
products: [
|
|
39
|
+
{
|
|
40
|
+
id: 'Car',
|
|
41
|
+
price: 440,
|
|
42
|
+
quantity: 1,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
enqueuedAt: 1657003409370,
|
|
46
|
+
ads: [
|
|
47
|
+
{
|
|
48
|
+
adPlatform: 'cjaffiliate',
|
|
49
|
+
adCodes: {
|
|
50
|
+
cjevent: '816f5670dbf52c3dc27a7e849903c327d705ef643993fbab3',
|
|
51
|
+
},
|
|
52
|
+
visitAt: 1658392668000,
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
currencyCode: 'CZK',
|
|
58
|
+
event: {
|
|
59
|
+
region: 'MAIN',
|
|
60
|
+
id: '115169112-4870.1657003407533',
|
|
61
|
+
code: 'purchase',
|
|
62
|
+
},
|
|
63
|
+
session: {
|
|
64
|
+
userAgent:
|
|
65
|
+
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36',
|
|
66
|
+
ip: '89.177.126.237',
|
|
67
|
+
referrer: 'https://crossmasters.com/',
|
|
68
|
+
},
|
|
69
|
+
referrer: 'https://crossmasters.com/',
|
|
70
|
+
permissions: [],
|
|
71
|
+
identity: {
|
|
72
|
+
piano: {
|
|
73
|
+
id: '1657003393413.319297501',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
publisher: {
|
|
77
|
+
code: 'mhubcloud.com',
|
|
78
|
+
tm: 'GTM-N7K9L4X',
|
|
79
|
+
tmv: '494',
|
|
80
|
+
},
|
|
81
|
+
$schema: '/mhub/purchase',
|
|
82
|
+
id: '20162351',
|
|
83
|
+
revenue: 440,
|
|
84
|
+
products: [
|
|
85
|
+
{
|
|
86
|
+
id: 'Car',
|
|
87
|
+
price: 440,
|
|
88
|
+
quantity: 1,
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
enqueuedAt: 1657003409370,
|
|
92
|
+
ads: [
|
|
93
|
+
{
|
|
94
|
+
adPlatform: 'cjaffiliate',
|
|
95
|
+
adCodes: {
|
|
96
|
+
cjevent: '816f5670dbf52c3dc27a7e849903c327d705ef643993fbab3',
|
|
97
|
+
},
|
|
98
|
+
visitAt: 1658392668000,
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
await test(eventHubMessages);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
87
106
|
|
|
88
107
|
/**
|
|
89
108
|
* Test function
|
|
90
109
|
* @param [object] object obsahující nastavení testovací parametry
|
|
91
110
|
*/
|
|
92
111
|
async function test(eventHubMessages) {
|
|
93
|
-
|
|
112
|
+
await defaultPublisher(
|
|
113
|
+
testUtils.context,
|
|
114
|
+
eventHubMessages,
|
|
115
|
+
'CJ',
|
|
116
|
+
publisher,
|
|
117
|
+
trigger,
|
|
118
|
+
);
|
|
94
119
|
}
|
|
95
120
|
|
|
96
121
|
function trigger(data) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
122
|
+
const publishers = [];
|
|
123
|
+
if (data.event.code === 'purchase') {
|
|
124
|
+
let publisher = CJPurchasePublisher;
|
|
100
125
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
126
|
+
publisher.register(publishers, { cid: 1, type: 1111111 });
|
|
127
|
+
}
|
|
128
|
+
return publishers;
|
|
129
|
+
}
|
|
105
130
|
|
|
106
131
|
class CJPurchasePublisher extends utils.EventPublisherBase {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
return ret;
|
|
132
|
+
/**
|
|
133
|
+
* Converts input data to publishing payload data understood by the publisher
|
|
134
|
+
* @param {Object} data `purchase` event data
|
|
135
|
+
* @returns {Object} Data mapped from incomming Event Hub message to platform payload
|
|
136
|
+
*/
|
|
137
|
+
map(data) {
|
|
138
|
+
const ret = {
|
|
139
|
+
cjevent: utils.extractAdCode(data, 'cjaffiliate', 'cjevent')?.code,
|
|
140
|
+
cust_status: data.user?.ts?.indexOf('customer') >= 0 ? 'return' : 'new',
|
|
141
|
+
coupon: data.coupon,
|
|
142
|
+
discount: data.localDiscount,
|
|
143
|
+
method: 'S2S',
|
|
144
|
+
currency: data.localCurrencyCode,
|
|
145
|
+
oid: data.id,
|
|
146
|
+
// eventTime: "" // This parameters is ignored, as the time is determined by the CJ server
|
|
147
|
+
};
|
|
148
|
+
if (data.products instanceof Array) {
|
|
149
|
+
let i = 0;
|
|
150
|
+
for (const product of data.products) {
|
|
151
|
+
i++;
|
|
152
|
+
ret[`item${i}`] = product.id;
|
|
153
|
+
ret[`amt${i}`] = product.localPrice;
|
|
154
|
+
ret[`qty${i}`] = product.quantity;
|
|
155
|
+
}
|
|
134
156
|
}
|
|
135
|
-
|
|
157
|
+
|
|
158
|
+
return ret;
|
|
159
|
+
}
|
|
160
|
+
}
|
package/tests/Facebook.js
CHANGED
|
@@ -1,118 +1,139 @@
|
|
|
1
|
-
const publisher = require(
|
|
2
|
-
const defaultPublisher = require(
|
|
3
|
-
const utils = require(
|
|
1
|
+
const publisher = require('../dist/index.js').publisher.Facebook;
|
|
2
|
+
const defaultPublisher = require('../dist/index.js').DefaultPublisher;
|
|
3
|
+
const utils = require('../dist/index.js').utils;
|
|
4
4
|
var assert = require('assert');
|
|
5
|
+
const testUtils = require('./testUtils');
|
|
5
6
|
|
|
6
7
|
describe('test Facebook publisher', function () {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
})
|
|
8
|
+
it('purchase', async function () {
|
|
9
|
+
var eventHubMessages = [
|
|
10
|
+
{
|
|
11
|
+
currencyCode: 'CZK',
|
|
12
|
+
event: {
|
|
13
|
+
region: 'MAIN',
|
|
14
|
+
id: '115169112-4870.1657003407533',
|
|
15
|
+
code: 'purchase',
|
|
16
|
+
},
|
|
17
|
+
session: {
|
|
18
|
+
userAgent:
|
|
19
|
+
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36',
|
|
20
|
+
ip: '89.177.126.237',
|
|
21
|
+
referrer: 'https://crossmasters.com/',
|
|
22
|
+
},
|
|
23
|
+
referrer: 'https://crossmasters.com/',
|
|
24
|
+
permissions: [],
|
|
25
|
+
identity: {
|
|
26
|
+
piano: {
|
|
27
|
+
id: '1657003393413.319297501',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
publisher: {
|
|
31
|
+
code: 'mhubcloud.com',
|
|
32
|
+
tm: 'GTM-N7K9L4X',
|
|
33
|
+
tmv: '494',
|
|
34
|
+
},
|
|
35
|
+
$schema: '/mhub/purchase',
|
|
36
|
+
id: '20162351',
|
|
37
|
+
revenue: 440,
|
|
38
|
+
products: [
|
|
39
|
+
{
|
|
40
|
+
id: 'Car',
|
|
41
|
+
price: 440,
|
|
42
|
+
quantity: 1,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
enqueuedAt: 1657003409370,
|
|
46
|
+
ads: [],
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
await test(eventHubMessages);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
50
52
|
|
|
51
53
|
/**
|
|
52
54
|
* Test function
|
|
53
55
|
* @param [object] object obsahující nastavení testovací parametry
|
|
54
56
|
*/
|
|
55
57
|
async function test(eventHubMessages) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
try {
|
|
59
|
+
await defaultPublisher(
|
|
60
|
+
testUtils.context,
|
|
61
|
+
eventHubMessages,
|
|
62
|
+
'Facebook',
|
|
63
|
+
publisher,
|
|
64
|
+
trigger,
|
|
65
|
+
);
|
|
66
|
+
} catch (err) {
|
|
67
|
+
assert.equal(
|
|
68
|
+
err
|
|
69
|
+
.toString()
|
|
70
|
+
.indexOf(
|
|
71
|
+
'Error: HTTP Error code: 400, event: purchase, body: {"error":{"message":"Invalid OAuth access token - Cannot parse access token","type":"OAuthException","code":190',
|
|
72
|
+
),
|
|
73
|
+
0,
|
|
74
|
+
);
|
|
75
|
+
}
|
|
61
76
|
}
|
|
62
77
|
|
|
63
78
|
function trigger(data) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
79
|
+
const publishers = [];
|
|
80
|
+
let publisher;
|
|
81
|
+
|
|
82
|
+
// Dummy config, replace with your own
|
|
83
|
+
const config = {
|
|
84
|
+
id: 'fffff',
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
86
|
+
access_token: 'zzzz',
|
|
87
|
+
};
|
|
72
88
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
89
|
+
switch (data.event?.code) {
|
|
90
|
+
case 'purchase':
|
|
91
|
+
publisher = new FBPurchasePublisher(config);
|
|
92
|
+
publishers.push(publisher);
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
return publishers;
|
|
96
|
+
}
|
|
81
97
|
|
|
82
98
|
class FBPurchasePublisher extends utils.EventPublisherBase {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
|
|
99
|
+
/**
|
|
100
|
+
* Maps `purchase` event data to Facebook payload
|
|
101
|
+
* @param {Object} data `purchase` event data
|
|
102
|
+
* @returns {Object} Data mapped from incomming Event Hub message to platform payload
|
|
103
|
+
*/
|
|
104
|
+
map(data) {
|
|
105
|
+
return {
|
|
106
|
+
event_name: 'Purchase', // Constant
|
|
107
|
+
event_time: Math.floor(data.enqueuedAt / 1000), // convert to seconds
|
|
108
|
+
action_source: 'website', // Constant
|
|
109
|
+
event_id: data.id, // e.g. OBJ1248035
|
|
110
|
+
event_source_url: data.location, // e.g. https://eshop.com/checkoutSuccess
|
|
111
|
+
opt_out: false, // Constant
|
|
112
|
+
user_data: {
|
|
113
|
+
client_user_agent: data.session?.userAgent, // e.g. Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
|
|
114
|
+
fbc:
|
|
115
|
+
utils.extractAdCode(
|
|
116
|
+
data,
|
|
117
|
+
'facebook',
|
|
118
|
+
'fbclid',
|
|
119
|
+
(ad) => `fb.1.${ad.visitAt}.${ad.code}`,
|
|
120
|
+
) || undefined, // e.g. fb.1.1623142020900.IwAR3CoXSdAr4nXyoVGo5H72wAiP8BrgPays0hhH1UgxnW_8D7rDhuHgjvvw0_aem_AXjjss7KoC0VSnBGvyUAkPip4VaZV6qytiIx5s8FQrAy5yzamZNRSC_xaCXEeJ8ecyphjuyQ2zbDAMoaIVayYAHxZgFH8TJsMzysJAIikY0How
|
|
121
|
+
fbp: data.identity?.facebook?.id, // e.g. fb.1.1609144040877.1929163682
|
|
122
|
+
client_ip_address: data.session?.ip, // e.g. 31.30.171.18
|
|
123
|
+
em: utils.encodeEmail(data.user?.email),
|
|
124
|
+
},
|
|
125
|
+
custom_data: {
|
|
126
|
+
currency: data.currencyCode, // e.g. EUR
|
|
127
|
+
value: data.revenue, // e.g. 142.52
|
|
128
|
+
contents: data.products.map((pr) => ({
|
|
129
|
+
id: pr.id, // e.g. PRDCT1248035
|
|
130
|
+
quantity: pr.quantity, // e.g. 1
|
|
131
|
+
item_price: pr.price, // e.g. 109
|
|
132
|
+
})),
|
|
133
|
+
content_type: 'product', // Constant
|
|
134
|
+
order_id: data.id, // e.g. OBJ1248035
|
|
135
|
+
content_category: 'Purchase', // Constant
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|