GT2/GT2-iOS/node_modules/@segment/loosely-validate-event/index.js

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') + '.'
)
}
}