122 lines
2.8 KiB
JavaScript
122 lines
2.8 KiB
JavaScript
|
var type = require('component-type')
|
||
|
var join = require('join-component')
|
||
|
var assert = require('assert')
|
||
|
|
||
|
module.exports = looselyValidateEvent
|
||
|
|
||
|
/**
|
||
|
* Validate an event.
|
||
|
*/
|
||
|
|
||
|
function looselyValidateEvent (event, type) {
|
||
|
validateGenericEvent(event)
|
||
|
type = type || event.type
|
||
|
assert(type, 'You must pass an event type.')
|
||
|
switch (type) {
|
||
|
case 'track':
|
||
|
return validateTrackEvent(event)
|
||
|
case 'group':
|
||
|
return validateGroupEvent(event)
|
||
|
case 'identify':
|
||
|
return validateIdentifyEvent(event)
|
||
|
case 'page':
|
||
|
return validatePageEvent(event)
|
||
|
case 'screen':
|
||
|
return validateScreenEvent(event)
|
||
|
case 'alias':
|
||
|
return validateAliasEvent(event)
|
||
|
default:
|
||
|
assert(0, 'Invalid event type: "' + type + '"')
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Validate a "track" event.
|
||
|
*/
|
||
|
|
||
|
function validateTrackEvent (event) {
|
||
|
assert(event.anonymousId || event.userId, 'You must pass either an "anonymousId" or a "userId".')
|
||
|
assert(event.event, 'You must pass an "event".')
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Validate a "group" event.
|
||
|
*/
|
||
|
|
||
|
function validateGroupEvent (event) {
|
||
|
assert(event.anonymousId || event.userId, 'You must pass either an "anonymousId" or a "userId".')
|
||
|
assert(event.groupId, 'You must pass a "groupId".')
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Validate a "identify" event.
|
||
|
*/
|
||
|
|
||
|
function validateIdentifyEvent (event) {
|
||
|
assert(event.anonymousId || event.userId, 'You must pass either an "anonymousId" or a "userId".')
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Validate a "page" event.
|
||
|
*/
|
||
|
|
||
|
function validatePageEvent (event) {
|
||
|
assert(event.anonymousId || event.userId, 'You must pass either an "anonymousId" or a "userId".')
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Validate a "screen" event.
|
||
|
*/
|
||
|
|
||
|
function validateScreenEvent (event) {
|
||
|
assert(event.anonymousId || event.userId, 'You must pass either an "anonymousId" or a "userId".')
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Validate an "alias" event.
|
||
|
*/
|
||
|
|
||
|
function validateAliasEvent (event) {
|
||
|
assert(event.userId, 'You must pass a "userId".')
|
||
|
assert(event.previousId, 'You must pass a "previousId".')
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Validation rules.
|
||
|
*/
|
||
|
|
||
|
var genericValidationRules = {
|
||
|
anonymousId: [ 'string', 'number' ],
|
||
|
category: 'string',
|
||
|
context: 'object',
|
||
|
event: 'string',
|
||
|
groupId: [ 'string', 'number' ],
|
||
|
integrations: 'object',
|
||
|
name: 'string',
|
||
|
previousId: [ 'string', 'number' ],
|
||
|
timestamp: 'date',
|
||
|
userId: [ 'string', 'number' ],
|
||
|
type: 'string'
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Validate an event object.
|
||
|
*/
|
||
|
|
||
|
function validateGenericEvent (event) {
|
||
|
assert(type(event) === 'object', 'You must pass a message object.')
|
||
|
for (var key in genericValidationRules) {
|
||
|
var val = event[key]
|
||
|
if (!val) continue
|
||
|
var rule = genericValidationRules[key]
|
||
|
if (type(rule) !== 'array') {
|
||
|
rule = [ rule ]
|
||
|
}
|
||
|
var a = rule[0] === 'object' ? 'an' : 'a'
|
||
|
assert(
|
||
|
rule.some(function (e) { return type(val) === e }),
|
||
|
'"' + key + '" must be ' + a + ' ' + join(rule, 'or') + '.'
|
||
|
)
|
||
|
}
|
||
|
}
|