/** * Recursively convert an `obj`'s dates to new values. * * @param {Object} obj * @param {Function} convert * @return {Object} */ function convertDates(obj, convert) { obj = clone(obj); each(function(val, key) { if (type(val) === 'date') { obj[key] = convert(val); } if (type(val) === 'object' || type(val) === 'array') { obj[key] = convertDates(val, convert); } }, obj); return obj; }
Analytics.prototype.page = function(category, name, properties, options, fn) { // Argument reshuffling. /* eslint-disable no-unused-expressions, no-sequences */ if (is.fn(options)) (fn = options), (options = null); if (is.fn(properties)) (fn = properties), (options = properties = null); if (is.fn(name)) (fn = name), (options = properties = name = null); if (type(category) === 'object') (options = name), (properties = category), (name = category = null); if (type(name) === 'object') (options = properties), (properties = name), (name = null); if (type(category) === 'string' && type(name) !== 'string') (name = category), (category = null); /* eslint-enable no-unused-expressions, no-sequences */ properties = clone(properties) || {}; if (name) properties.name = name; if (category) properties.category = category; // Ensure properties has baseline spec properties. // TODO: Eventually move these entirely to `options.context.page` var defs = pageDefaults(); defaults(properties, defs); // Mirror user overrides to `options.context.page` (but exclude custom properties) // (Any page defaults get applied in `this.normalize` for consistency.) // Weird, yeah--moving special props to `context.page` will fix this in the long term. var overrides = pick(keys(defs), properties); if (!is.empty(overrides)) { options = options || {}; options.context = options.context || {}; options.context.page = overrides; } var msg = this.normalize({ properties: properties, category: category, options: options, name: name }); // Add the initialize integrations so the server-side ones can be disabled too if (this.options.integrations) { defaults(msg.integrations, this.options.integrations); } this._invoke('page', new Page(msg)); this.emit('page', category, name, properties, options); this._callback(fn); return this; };
this.client.setGlobalProperties(function() { // Clone the props so the Keen Client can't manipulate the ref return clone(props); });
Entity.prototype._getTraits = function() { var ret = this._options.persist ? store.get(this._options.localStorage.key) : this._traits; return ret ? isodateTraverse(clone(ret)) : {}; };