@segment/analytics.js-core
Version:
The hassle-free way to integrate analytics into any web application.
107 lines (88 loc) • 2.43 kB
text/typescript
;
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)
);
}
}