UNPKG

@segment/analytics.js-core

Version:

The hassle-free way to integrate analytics into any web application.

107 lines (88 loc) 2.43 kB
'use strict'; import { Message } from './types'; /** * Module Dependencies. */ var debug = require('debug')('analytics.js:normalize'); var defaults = require('@ndhoule/defaults'); var each = require('./utils/each'); var includes = require('@ndhoule/includes'); var map = require('./utils/map'); var type = require('component-type'); var uuid = require('uuid/v4'); var md5 = require('spark-md5').hash; /** * HOP. */ var has = Object.prototype.hasOwnProperty; /** * Expose `normalize` */ module.exports = normalize; /** * Toplevel properties. */ var toplevel = ['integrations', 'anonymousId', 'timestamp', 'context']; /** * Normalize `msg` based on integrations `list`. */ interface NormalizedMessage { integrations?: { [key: string]: string; }; context?: unknown; } function normalize(msg: Message, list: Array<any>): NormalizedMessage { var lower = map(function(s) { return s.toLowerCase(); }, list); var opts: Message = msg.options || {}; var integrations = opts.integrations || {}; var providers = opts.providers || {}; var context = opts.context || {}; var ret: { integrations?: { [key: string]: string }; context?: unknown; } = {}; debug('<-', msg); // integrations. each(function(value: string, key: string) { if (!integration(key)) return; if (!has.call(integrations, key)) integrations[key] = value; delete opts[key]; }, opts); // providers. delete opts.providers; each(function(value: string, key: string) { if (!integration(key)) return; if (type(integrations[key]) === 'object') return; if (has.call(integrations, key) && typeof providers[key] === 'boolean') return; integrations[key] = value; }, providers); // move all toplevel options to msg // and the rest to context. each(function(_value: any, key: string | number) { if (includes(key, toplevel)) { ret[key] = opts[key]; } else { context[key] = opts[key]; } }, opts); // generate and attach a messageId to msg msg.messageId = 'ajs-' + md5(window.JSON.stringify(msg) + uuid()); // cleanup delete msg.options; ret.integrations = integrations; ret.context = context; ret = defaults(ret, msg); debug('->', ret); return ret; function integration(name: string) { return !!( includes(name, list) || name.toLowerCase() === 'all' || includes(name.toLowerCase(), lower) ); } }