-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathjavascript-generator.js
82 lines (61 loc) · 2.5 KB
/
javascript-generator.js
1
2
3
4
5
6
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
const camelCase = require('camel-case');
module.exports = function(importStatements, footerFileContent, metadata) {
return `/*THIS IS AN AUTO GENERATED FILE CREATED BY Dynamo https://github.com/shopyourway/dynamo*/
${importStatements}
${setDeclarations('actions', metadata.eventDefinitions.actionsList)}
${setFunctions(metadata)};
${footerFileContent}`;
};
function setDeclarations(listName, list) {
return `export var ${listName} = {
${list.map(element => `"${camelCase(element)}": "${element}"`).join(',\n ')}
};\nvar ${listName}Values = {
${list.map(element => `"${element}": 1`).join(',\n ')}
};`;
}
function setFunctions(metadata) {
return Object.keys(metadata.definitions).map(key => createFunction(key, metadata.definitions[key])).join('\n')
}
function createFunction(functionName, functionMetadata) {
const { eventType } = functionMetadata;
const eventTypeFunctionName = (eventType === 'event' ? 'link' : 'track');
return `export function ${functionName}(${formatParameters(functionMetadata.parameters).join(', ')}) {
const eventData = {};
${setDimensions(functionMetadata)}
${setMetrics(functionMetadata)}
tagManagerReporter.${eventTypeFunctionName}(${buildReporterParams(eventType)});
}`;
}
function buildReporterParams(eventType) {
if (eventType === 'event')
return `eventData, callback`;
return 'eventData';
}
function formatParameters(parameters) {
let returnedParameters = Object.keys(parameters || {});
returnedParameters.push('callback');
return returnedParameters;
}
function setDimensions(functionMetadata) {
const { dimensions } = functionMetadata;
const { metrics } = functionMetadata;
const separator = typeof(metrics) != 'object' ? '\n' : '';
if (typeof dimensions == 'object')
return Object.keys(dimensions).map(key => `eventData.${key} = ${formatAssignment(dimensions[key])};`).join('\n ') + separator;
return separator;
}
function setMetrics(functionMetadata) {
const { metrics } = functionMetadata;
if (typeof metrics == 'object')
return metrics.map(key => `eventData.${key} = \`1\`;`).join('\n ');
return '';
}
function formatAssignment(value) {
if(Array.isArray(value)) {
return `[ ${value.map(formatAssignmentValue).join(', ')} ]`;
}
return formatAssignmentValue(value);
}
function formatAssignmentValue(value) {
return '`' + value.replace(/{{/g, '${').replace(/}}/g, '}') + '`';
}