I have a weird and not entirely sensible dislike for doing things manually but given how similar the API is I’d look at using something like recast to automatically transform v2 to v3. You’ll probably still want to test / QA afterwards.
For an input of:
snowplow('trackStructEvent', 'category', 'action', 'label', 'property', 0.0);
snowplow('trackSelfDescribingJson', {
schema: 'iglu:test',
data: {
example: '123'
}
})
The following transform function:
export default function transformer(code, { recast, parsers }) {
const ast = recast.parse(code, { parser: parsers.esprima });
const b = recast.types.builders;
const namespace = "snowplow"
const args = ast.program.body[0].expression;
// convert a structured event
ast.program.body[0] = b.expressionStatement(
b.callExpression(b.identifier(namespace), [b.literal('trackStructEvent'), b.objectExpression([
b.property("init", b.identifier("category"), args.arguments[1]),
b.property("init", b.identifier("action"), args.arguments[2]),
b.property("init", b.identifier("label"), args.arguments[3]),
b.property("init", b.identifier("property"), args.arguments[4]),
b.property("init", b.identifier("value"), args.arguments[5]),
])])
)
// convert a self describing json event
const sdjson = ast.program.body[1];
ast.program.body[1] = b.expressionStatement(
b.callExpression(b.identifier(namespace), [b.literal('trackSelfDescribingEvent'), b.objectExpression([
b.property("init", b.identifier("event"), sdjson.expression.arguments[1]),
])])
)
return recast.print(ast).code;
}
will yield the output
snowplow("trackStructEvent", {
category: 'category',
action: 'action',
label: 'label',
property: 'property',
value: 0.0
});
snowplow("trackSelfDescribingEvent", {
event: {
schema: 'iglu:test',
data: {
example: '123'
}
}
})
You can test this on AST explorer here.