@clef/jql-query-retention
Advanced tools
Comparing version 1.0.1 to 1.1.0
@@ -59,3 +59,3 @@ (function webpackUniversalModuleDefinition(root, factory) { | ||
module.exports = "function main() { var _main = /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _RetentionState = __webpack_require__(1);\n\t\n\tvar _RetentionState2 = _interopRequireDefault(_RetentionState);\n\t\n\tvar _DateHelper = __webpack_require__(2);\n\t\n\tvar DateHelper = _interopRequireWildcard(_DateHelper);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/* globals params */\n\t/* Retention.jql\n\t *\n\t * A JQL query that gets retention data over a time period.\n\t *\n\t * Params:\n\t *\n\t * - fromDate: new Date\n\t * - toDate: new Date\n\t * - startEvents: [ jql.types.Event ]\n\t *\n\t * A series of events which together are the entrance condition. A\n\t * user must complete ALL of these events to be counted as a member\n\t * of the group we are measureing retention for. In other words,\n\t * they must do EventA AND EventB.\n\t *\n\t * - retentionEvents: [ jql.types.Event ]\n\t *\n\t * A set of events of which any can count sa the retention condition.\n\t * A user must complete ANY of these events to be counted\n\t * as retained on a given interval. In other words, they must do\n\t * EventA OR EventB.\n\t *\n\t * - retentionInterval: Number (milliseconds)\n\t *\n\t * The interval within which a user must complete an action to be\n\t * counted as retained. For instance, a retention interval of\n\t * 1 day (8640000) means a user must complete one of the retentionEvents\n\t * in a 1 day interval to be counted as retained.\n\t *\n\t * - retentionBuckets: [ Number ]\n\t *\n\t * The number of intervals after the fromDate on which to measure retention.\n\t * For instance, if you have an interval of 1 day and retention buckets of\n\t * [0, 1, 7, 14, 30], this will return the retention for D0, D1, D7, D14,\n\t * and D30.\n\t */\n\t\n\tfunction main() {\n\t // Normalize from and to date to follow standard Mixpanel\n\t // date format without hours (i.e. 2016-04-26)\n\t params.fromDate = DateHelper.formatDate(params.fromDate);\n\t params.toDate = DateHelper.formatDate(params.toDate);\n\t\n\t return Events({\n\t from_date: params.fromDate,\n\t to_date: params.toDate,\n\t event_selectors: params.startEvents.concat(params.retentionEvents)\n\t })\n\t // Build retention dictionaries for all users that had\n\t // events during the time frame\n\t .groupByUser(function (state, events) {\n\t state = _RetentionState2.default.fromObject(state, params);\n\t state.consume(events);\n\t state.ensureAllBucketsHaveStatus();\n\t return state.toObject();\n\t })\n\t // Filter out users who never completed the Start series\n\t // of retention events\n\t .filter(function (item) {\n\t return item.value.startEpoch;\n\t })\n\t // Group users by when they completed the Start series\n\t // of retention events\n\t .groupBy([function (item) {\n\t return item.value.startEpoch;\n\t }], function (accums, items) {\n\t var res = {};\n\t var i = 0;\n\t var j = 0;\n\t var index = 0;\n\t for (i = 0; i < params.retentionBuckets.length; i++) {\n\t index = params.retentionBuckets[i].toString();\n\t res[index] = {};\n\t res[index].converted = 0;\n\t res[index].total = 0;\n\t for (j = 0; j < items.length; j++) {\n\t if (items[j].value.retention[index] === _RetentionState2.default.STATUS.PRESENT) {\n\t res[index].converted++;\n\t res[index].total++;\n\t } else if (items[j].value.retention[index] === _RetentionState2.default.STATUS.ABSENT) {\n\t res[index].total++;\n\t }\n\t }\n\t for (j = 0; j < accums.length; j++) {\n\t res[index].converted += accums[j][index].converted;\n\t res[index].total += accums[j][index].total;\n\t }\n\t }\n\t return res;\n\t }).reduce(function (accums, items) {\n\t var data = {};\n\t var item, index;\n\t for (var i = 0; i < accums.length; i++) {\n\t for (var key in accums[i]) {\n\t data[key] = accums[i][key];\n\t }\n\t }\n\t for (i = 0; i < items.length; i++) {\n\t for (var j = 0; j < params.retentionBuckets.length; j++) {\n\t index = params.retentionBuckets[j];\n\t if (!data[index]) {\n\t data[index] = {};\n\t }\n\t item = items[i].value[params.retentionBuckets[j]];\n\t if (item.total > 0) {\n\t data[index][DateHelper.formatDate(new Date(items[i].key[0]))] = parseFloat((item.converted / item.total * 100).toFixed(2));\n\t }\n\t }\n\t }\n\t return data;\n\t });\n\t}\n\t\n\texports.default = main;\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _DateHelper = __webpack_require__(2);\n\t\n\tvar DateHelper = _interopRequireWildcard(_DateHelper);\n\t\n\tvar _EventHelper = __webpack_require__(3);\n\t\n\tvar EventHelper = _interopRequireWildcard(_EventHelper);\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tvar RetentionState = function () {\n\t function RetentionState(options) {\n\t _classCallCheck(this, RetentionState);\n\t\n\t this.toDate = options.toDate;\n\t this.fromDate = options.fromDate;\n\t this.startEvents = options.startEvents.slice();\n\t this.retentionEvents = options.retentionEvents;\n\t this.retentionBuckets = options.retentionBuckets;\n\t this.retentionInterval = options.retentionInterval;\n\t\n\t this.retention = options.retention || {};\n\t this.startEpoch = options.startEpoch || null;\n\t }\n\t\n\t _createClass(RetentionState, [{\n\t key: 'getEndDate',\n\t value: function getEndDate() {\n\t var parts = this.toDate.split('-');\n\t return new Date(parts[0], Number(parts[1] - 1), parts[2]).valueOf() + DateHelper.ONE_DAY - DateHelper.getTimezoneOffset();\n\t }\n\t }, {\n\t key: 'getStartDate',\n\t value: function getStartDate() {\n\t var parts = this.fromDate.split('-');\n\t return new Date(parts[0], Number(parts[1] - 1), parts[2]).valueOf() - DateHelper.getTimezoneOffset();\n\t }\n\t }, {\n\t key: 'getBeginningOfBucket',\n\t value: function getBeginningOfBucket(epoch) {\n\t var start = this.getStartDate();\n\t var bucketNum = Math.floor((epoch - start) / this.retentionInterval);\n\t return new Date(start + bucketNum * this.retentionInterval).valueOf();\n\t }\n\t }, {\n\t key: 'hasCompletedAllStartEventsAfterThisEvent',\n\t value: function hasCompletedAllStartEventsAfterThisEvent(event) {\n\t if (EventHelper.equals(this.startEvents[0], event)) this.startEvents.shift();\n\t return this.startEvents.length === 0;\n\t }\n\t }, {\n\t key: 'hasBeenRetainedAfterThisEvent',\n\t value: function hasBeenRetainedAfterThisEvent(event) {\n\t return EventHelper.containsEvent(this.retentionEvents, event);\n\t }\n\t }, {\n\t key: 'hasStarted',\n\t value: function hasStarted() {\n\t return !!this.startEpoch;\n\t }\n\t }, {\n\t key: 'setStartedOnDayOfEvent',\n\t value: function setStartedOnDayOfEvent(event) {\n\t this.startEpoch = this.getBeginningOfBucket(event.time);\n\t }\n\t }, {\n\t key: 'setRetainedOnDayOfEvent',\n\t value: function setRetainedOnDayOfEvent(event) {\n\t var dX = (this.getBeginningOfBucket(event.time) - this.startEpoch) / this.retentionInterval;\n\t if (this.retentionBuckets.indexOf(dX) !== -1) {\n\t this.retention[dX] = RetentionState.STATUS.PRESENT;\n\t }\n\t }\n\t }, {\n\t key: 'consumeEvent',\n\t value: function consumeEvent(event) {\n\t if (!this.hasStarted() && this.hasCompletedAllStartEventsAfterThisEvent(event)) {\n\t return this.setStartedOnDayOfEvent(event);\n\t }\n\t\n\t if (this.hasStarted() && this.hasBeenRetainedAfterThisEvent(event)) {\n\t return this.setRetainedOnDayOfEvent(event);\n\t }\n\t }\n\t }, {\n\t key: 'consume',\n\t value: function consume(events) {\n\t var _iteratorNormalCompletion = true;\n\t var _didIteratorError = false;\n\t var _iteratorError = undefined;\n\t\n\t try {\n\t for (var _iterator = events[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t var event = _step.value;\n\t\n\t this.consumeEvent(event);\n\t }\n\t } catch (err) {\n\t _didIteratorError = true;\n\t _iteratorError = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion && _iterator.return) {\n\t _iterator.return();\n\t }\n\t } finally {\n\t if (_didIteratorError) {\n\t throw _iteratorError;\n\t }\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'toObject',\n\t value: function toObject() {\n\t return {\n\t toDate: this.toDate,\n\t fromDate: this.fromDate,\n\t startEvents: this.startEvents,\n\t retentionEvents: this.retentionEvents,\n\t retentionInterval: this.retentionInterval,\n\t retentionBuckets: this.retentionBuckets,\n\t startEpoch: this.startEpoch,\n\t retention: this.retention\n\t };\n\t }\n\t }, {\n\t key: 'bucketIsInFuture',\n\t value: function bucketIsInFuture(bucket) {\n\t return this.startEpoch + bucket * this.retentionInterval > this.getEndDate();\n\t }\n\t }, {\n\t key: 'ensureAllBucketsHaveStatus',\n\t value: function ensureAllBucketsHaveStatus() {\n\t var _iteratorNormalCompletion2 = true;\n\t var _didIteratorError2 = false;\n\t var _iteratorError2 = undefined;\n\t\n\t try {\n\t for (var _iterator2 = this.retentionBuckets[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n\t var bucket = _step2.value;\n\t\n\t if (this.bucketIsInFuture(bucket)) {\n\t this.retention[bucket] = RetentionState.STATUS.FUTURE;\n\t }\n\t\n\t if (!this.retention[bucket]) {\n\t this.retention[bucket] = RetentionState.STATUS.ABSENT;\n\t }\n\t }\n\t } catch (err) {\n\t _didIteratorError2 = true;\n\t _iteratorError2 = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion2 && _iterator2.return) {\n\t _iterator2.return();\n\t }\n\t } finally {\n\t if (_didIteratorError2) {\n\t throw _iteratorError2;\n\t }\n\t }\n\t }\n\t }\n\t }]);\n\t\n\t return RetentionState;\n\t}();\n\t\n\tRetentionState.fromObject = function (object, params) {\n\t object = object || params;\n\t return new RetentionState(object);\n\t};\n\t\n\tRetentionState.STATUS = {\n\t PRESENT: 'present',\n\t ABSENT: 'absent',\n\t FUTURE: 'future'\n\t};\n\t\n\tmodule.exports = RetentionState;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.formatDate = formatDate;\n\texports.getStartOfWeek = getStartOfWeek;\n\texports.getTimezoneOffset = getTimezoneOffset;\n\tfunction formatDate(date) {\n\t if (!date.toISOString) {\n\t date = new Date(date);\n\t }\n\t return date.toISOString().split('T')[0];\n\t}\n\t\n\tfunction getStartOfWeek(date) {\n\t var d = new Date(+date);\n\t d.setHours(0, 0, 0);\n\t d.setDate(d.getDate() + 1 - (d.getDay() || 7));\n\t return d;\n\t}\n\t\n\tfunction getTimezoneOffset() {\n\t return 60 * new Date().getTimezoneOffset() * 1000;\n\t}\n\t\n\tvar ONE_DAY = exports.ONE_DAY = 60 * 60 * 24 * 1000;\n\tvar THIRTY_DAYS = exports.THIRTY_DAYS = 30 * ONE_DAY;\n\tvar ONE_WEEK = exports.ONE_WEEK = ONE_DAY * 7;\n\tvar SIXTY_DAYS = exports.SIXTY_DAYS = 60 * 60 * 24 * 60 * 1000;\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.equals = equals;\n\texports.containsEvent = containsEvent;\n\tfunction equals(e1, e2) {\n\t var e1name = e1.event || e1.name;\n\t var e2name = e2.event || e2.name;\n\t return e1name === e2name;\n\t}\n\t\n\tfunction containsEvent(eventCollection, event) {\n\t var _iteratorNormalCompletion = true;\n\t var _didIteratorError = false;\n\t var _iteratorError = undefined;\n\t\n\t try {\n\t for (var _iterator = eventCollection[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t var ev = _step.value;\n\t\n\t if (equals(ev, event)) {\n\t return true;\n\t }\n\t }\n\t } catch (err) {\n\t _didIteratorError = true;\n\t _iteratorError = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion && _iterator.return) {\n\t _iterator.return();\n\t }\n\t } finally {\n\t if (_didIteratorError) {\n\t throw _iteratorError;\n\t }\n\t }\n\t }\n\t\n\t return false;\n\t}\n\n/***/ }\n/******/ ]);\n//# sourceMappingURL=d0ea00eb79c1cc4f87db.jql.js.map \n if(_main.default) { return _main.default() } else { return _main() } }"; | ||
module.exports = "function main() { var _main = /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _RetentionState = __webpack_require__(1);\n\t\n\tvar _RetentionState2 = _interopRequireDefault(_RetentionState);\n\t\n\tvar _jqlTools = __webpack_require__(2);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t/* globals params */\n\t/* Retention.jql\n\t *\n\t * A JQL query that gets retention data over a time period.\n\t *\n\t * Params:\n\t *\n\t * - fromDate: new Date\n\t * - toDate: new Date\n\t * - startEvents: [ jql.types.Event ]\n\t *\n\t * A series of events which together are the entrance condition. A\n\t * user must complete ALL of these events to be counted as a member\n\t * of the group we are measureing retention for. In other words,\n\t * they must do EventA AND EventB.\n\t *\n\t * - retentionEvents: [ jql.types.Event ]\n\t *\n\t * A set of events of which any can count sa the retention condition.\n\t * A user must complete ANY of these events to be counted\n\t * as retained on a given interval. In other words, they must do\n\t * EventA OR EventB.\n\t *\n\t * - retentionInterval: Number (milliseconds)\n\t *\n\t * The interval within which a user must complete an action to be\n\t * counted as retained. For instance, a retention interval of\n\t * 1 day (8640000) means a user must complete one of the retentionEvents\n\t * in a 1 day interval to be counted as retained.\n\t *\n\t * - retentionBuckets: [ Number ]\n\t *\n\t * The number of intervals after the fromDate on which to measure retention.\n\t * For instance, if you have an interval of 1 day and retention buckets of\n\t * [0, 1, 7, 14, 30], this will return the retention for D0, D1, D7, D14,\n\t * and D30.\n\t */\n\t\n\tvar DateHelper = _jqlTools.helpers.DateHelper;\n\t\n\tfunction main() {\n\t // Normalize from and to date to follow standard Mixpanel\n\t // date format without hours (i.e. 2016-04-26)\n\t params.fromDate = DateHelper.formatDate(params.fromDate);\n\t params.toDate = DateHelper.formatDate(params.toDate);\n\t\n\t return Events({\n\t from_date: params.fromDate,\n\t to_date: params.toDate,\n\t event_selectors: params.startEvents.concat(params.retentionEvents)\n\t })\n\t // Build retention dictionaries for all users that had\n\t // events during the time frame\n\t .groupByUser(function (state, events) {\n\t state = _RetentionState2.default.fromObject(state, params);\n\t state.consume(events);\n\t state.ensureAllBucketsHaveStatus();\n\t return state.toObject();\n\t })\n\t // Filter out users who never completed the Start series\n\t // of retention events\n\t .filter(function (item) {\n\t return item.value.startEpoch;\n\t })\n\t // Group users by when they completed the Start series\n\t // of retention events\n\t .groupBy([function (item) {\n\t return item.value.startEpoch;\n\t }], function (accums, items) {\n\t var res = {};\n\t var i = 0;\n\t var j = 0;\n\t var index = 0;\n\t for (i = 0; i < params.retentionBuckets.length; i++) {\n\t index = params.retentionBuckets[i].toString();\n\t res[index] = {};\n\t res[index].converted = 0;\n\t res[index].total = 0;\n\t for (j = 0; j < items.length; j++) {\n\t if (items[j].value.retention[index] === _RetentionState2.default.STATUS.PRESENT) {\n\t res[index].converted++;\n\t res[index].total++;\n\t } else if (items[j].value.retention[index] === _RetentionState2.default.STATUS.ABSENT) {\n\t res[index].total++;\n\t }\n\t }\n\t for (j = 0; j < accums.length; j++) {\n\t res[index].converted += accums[j][index].converted;\n\t res[index].total += accums[j][index].total;\n\t }\n\t }\n\t return res;\n\t }).reduce(function (accums, items) {\n\t var data = {};\n\t var item, index;\n\t for (var i = 0; i < accums.length; i++) {\n\t for (var key in accums[i]) {\n\t data[key] = accums[i][key];\n\t }\n\t }\n\t for (i = 0; i < items.length; i++) {\n\t for (var j = 0; j < params.retentionBuckets.length; j++) {\n\t index = params.retentionBuckets[j];\n\t if (!data[index]) {\n\t data[index] = {};\n\t }\n\t item = items[i].value[params.retentionBuckets[j]];\n\t if (item.total > 0) {\n\t data[index][DateHelper.formatDate(new Date(items[i].key[0]))] = parseFloat((item.converted / item.total * 100).toFixed(2));\n\t }\n\t }\n\t }\n\t return data;\n\t });\n\t}\n\t\n\texports.default = main;\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\t\n\tvar _jqlTools = __webpack_require__(2);\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tvar DateHelper = _jqlTools.helpers.DateHelper;\n\tvar EventHelper = _jqlTools.helpers.EventHelper;\n\t\n\tvar RetentionState = function () {\n\t function RetentionState(options) {\n\t _classCallCheck(this, RetentionState);\n\t\n\t this.toDate = options.toDate;\n\t this.fromDate = options.fromDate;\n\t this.startEvents = options.startEvents.slice();\n\t this.retentionEvents = options.retentionEvents;\n\t this.retentionBuckets = options.retentionBuckets;\n\t this.retentionInterval = options.retentionInterval;\n\t\n\t this.retention = options.retention || {};\n\t this.startEpoch = options.startEpoch || null;\n\t }\n\t\n\t _createClass(RetentionState, [{\n\t key: 'getEndDate',\n\t value: function getEndDate() {\n\t var parts = this.toDate.split('-');\n\t return new Date(parts[0], Number(parts[1] - 1), parts[2]).valueOf() + DateHelper.ONE_DAY - DateHelper.getTimezoneOffset();\n\t }\n\t }, {\n\t key: 'getStartDate',\n\t value: function getStartDate() {\n\t var parts = this.fromDate.split('-');\n\t return new Date(parts[0], Number(parts[1] - 1), parts[2]).valueOf() - DateHelper.getTimezoneOffset();\n\t }\n\t }, {\n\t key: 'getBeginningOfBucket',\n\t value: function getBeginningOfBucket(epoch) {\n\t var start = this.getStartDate();\n\t var bucketNum = Math.floor((epoch - start) / this.retentionInterval);\n\t return new Date(start + bucketNum * this.retentionInterval).valueOf();\n\t }\n\t }, {\n\t key: 'hasCompletedAllStartEventsAfterThisEvent',\n\t value: function hasCompletedAllStartEventsAfterThisEvent(event) {\n\t if (EventHelper.equals(this.startEvents[0], event)) this.startEvents.shift();\n\t return this.startEvents.length === 0;\n\t }\n\t }, {\n\t key: 'hasBeenRetainedAfterThisEvent',\n\t value: function hasBeenRetainedAfterThisEvent(event) {\n\t return EventHelper.containsEvent(this.retentionEvents, event);\n\t }\n\t }, {\n\t key: 'hasStarted',\n\t value: function hasStarted() {\n\t return !!this.startEpoch;\n\t }\n\t }, {\n\t key: 'setStartedOnDayOfEvent',\n\t value: function setStartedOnDayOfEvent(event) {\n\t this.startEpoch = this.getBeginningOfBucket(event.time);\n\t }\n\t }, {\n\t key: 'setRetainedOnDayOfEvent',\n\t value: function setRetainedOnDayOfEvent(event) {\n\t var dX = (this.getBeginningOfBucket(event.time) - this.startEpoch) / this.retentionInterval;\n\t if (this.retentionBuckets.indexOf(dX) !== -1) {\n\t this.retention[dX] = RetentionState.STATUS.PRESENT;\n\t }\n\t }\n\t }, {\n\t key: 'consumeEvent',\n\t value: function consumeEvent(event) {\n\t if (!this.hasStarted() && this.hasCompletedAllStartEventsAfterThisEvent(event)) {\n\t return this.setStartedOnDayOfEvent(event);\n\t }\n\t\n\t if (this.hasStarted() && this.hasBeenRetainedAfterThisEvent(event)) {\n\t return this.setRetainedOnDayOfEvent(event);\n\t }\n\t }\n\t }, {\n\t key: 'consume',\n\t value: function consume(events) {\n\t var _iteratorNormalCompletion = true;\n\t var _didIteratorError = false;\n\t var _iteratorError = undefined;\n\t\n\t try {\n\t for (var _iterator = events[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t var event = _step.value;\n\t\n\t this.consumeEvent(event);\n\t }\n\t } catch (err) {\n\t _didIteratorError = true;\n\t _iteratorError = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion && _iterator.return) {\n\t _iterator.return();\n\t }\n\t } finally {\n\t if (_didIteratorError) {\n\t throw _iteratorError;\n\t }\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'toObject',\n\t value: function toObject() {\n\t return {\n\t toDate: this.toDate,\n\t fromDate: this.fromDate,\n\t startEvents: this.startEvents,\n\t retentionEvents: this.retentionEvents,\n\t retentionInterval: this.retentionInterval,\n\t retentionBuckets: this.retentionBuckets,\n\t startEpoch: this.startEpoch,\n\t retention: this.retention\n\t };\n\t }\n\t }, {\n\t key: 'bucketIsInFuture',\n\t value: function bucketIsInFuture(bucket) {\n\t return this.startEpoch + bucket * this.retentionInterval > this.getEndDate();\n\t }\n\t }, {\n\t key: 'ensureAllBucketsHaveStatus',\n\t value: function ensureAllBucketsHaveStatus() {\n\t var _iteratorNormalCompletion2 = true;\n\t var _didIteratorError2 = false;\n\t var _iteratorError2 = undefined;\n\t\n\t try {\n\t for (var _iterator2 = this.retentionBuckets[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n\t var bucket = _step2.value;\n\t\n\t if (this.bucketIsInFuture(bucket)) {\n\t this.retention[bucket] = RetentionState.STATUS.FUTURE;\n\t }\n\t\n\t if (!this.retention[bucket]) {\n\t this.retention[bucket] = RetentionState.STATUS.ABSENT;\n\t }\n\t }\n\t } catch (err) {\n\t _didIteratorError2 = true;\n\t _iteratorError2 = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion2 && _iterator2.return) {\n\t _iterator2.return();\n\t }\n\t } finally {\n\t if (_didIteratorError2) {\n\t throw _iteratorError2;\n\t }\n\t }\n\t }\n\t }\n\t }]);\n\t\n\t return RetentionState;\n\t}();\n\t\n\tRetentionState.fromObject = function (object, params) {\n\t object = object || params;\n\t return new RetentionState(object);\n\t};\n\t\n\tRetentionState.STATUS = {\n\t PRESENT: 'present',\n\t ABSENT: 'absent',\n\t FUTURE: 'future'\n\t};\n\t\n\tmodule.exports = RetentionState;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t(function webpackUniversalModuleDefinition(root, factory) {\n\t\tif(true)\n\t\t\tmodule.exports = factory();\n\t\telse if(typeof define === 'function' && define.amd)\n\t\t\tdefine([], factory);\n\t\telse if(typeof exports === 'object')\n\t\t\texports[\"jql-tools\"] = factory();\n\t\telse\n\t\t\troot[\"jql-tools\"] = factory();\n\t})(this, function() {\n\treturn /******/ (function(modules) { // webpackBootstrap\n\t/******/ \t// The module cache\n\t/******/ \tvar installedModules = {};\n\t\n\t/******/ \t// The require function\n\t/******/ \tfunction __webpack_require__(moduleId) {\n\t\n\t/******/ \t\t// Check if module is in cache\n\t/******/ \t\tif(installedModules[moduleId])\n\t/******/ \t\t\treturn installedModules[moduleId].exports;\n\t\n\t/******/ \t\t// Create a new module (and put it into the cache)\n\t/******/ \t\tvar module = installedModules[moduleId] = {\n\t/******/ \t\t\texports: {},\n\t/******/ \t\t\tid: moduleId,\n\t/******/ \t\t\tloaded: false\n\t/******/ \t\t};\n\t\n\t/******/ \t\t// Execute the module function\n\t/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\t\n\t/******/ \t\t// Flag the module as loaded\n\t/******/ \t\tmodule.loaded = true;\n\t\n\t/******/ \t\t// Return the exports of the module\n\t/******/ \t\treturn module.exports;\n\t/******/ \t}\n\t\n\t\n\t/******/ \t// expose the modules object (__webpack_modules__)\n\t/******/ \t__webpack_require__.m = modules;\n\t\n\t/******/ \t// expose the module cache\n\t/******/ \t__webpack_require__.c = installedModules;\n\t\n\t/******/ \t// __webpack_public_path__\n\t/******/ \t__webpack_require__.p = \"\";\n\t\n\t/******/ \t// Load entry module and return exports\n\t/******/ \treturn __webpack_require__(0);\n\t/******/ })\n\t/************************************************************************/\n\t/******/ ([\n\t/* 0 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t'use strict';\n\t\n\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t value: true\n\t\t});\n\t\texports.helpers = exports.types = undefined;\n\t\n\t\tvar _types = __webpack_require__(1);\n\t\n\t\tvar types = _interopRequireWildcard(_types);\n\t\n\t\tvar _helpers = __webpack_require__(3);\n\t\n\t\tvar helpers = _interopRequireWildcard(_helpers);\n\t\n\t\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\t\texports.types = types;\n\t\texports.helpers = helpers;\n\t\n\t/***/ },\n\t/* 1 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t'use strict';\n\t\n\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t value: true\n\t\t});\n\t\texports.Event = undefined;\n\t\n\t\tvar _Event = __webpack_require__(2);\n\t\n\t\tvar _Event2 = _interopRequireDefault(_Event);\n\t\n\t\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t\texports.Event = _Event2.default;\n\t\n\t/***/ },\n\t/* 2 */\n\t/***/ function(module, exports) {\n\t\n\t\t'use strict';\n\t\n\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t value: true\n\t\t});\n\t\n\t\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\t\n\t\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t\t/* Event\n\t\t *\n\t\t * A class that represents a JQL event in Mixpanel.\n\t\t *\n\t\t */\n\t\n\t\tvar Event = function Event(name) {\n\t\t var properties = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t\n\t\t _classCallCheck(this, Event);\n\t\n\t\t if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {\n\t\t properties = name;\n\t\t }\n\t\t this.event = name;\n\t\t this.selector = properties.selector;\n\t\t};\n\t\n\t\texports.default = Event;\n\t\n\t/***/ },\n\t/* 3 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t'use strict';\n\t\n\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t value: true\n\t\t});\n\t\texports.DateHelper = exports.EventHelper = undefined;\n\t\n\t\tvar _EventHelper = __webpack_require__(4);\n\t\n\t\tvar EventHelper = _interopRequireWildcard(_EventHelper);\n\t\n\t\tvar _DateHelper = __webpack_require__(5);\n\t\n\t\tvar DateHelper = _interopRequireWildcard(_DateHelper);\n\t\n\t\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\t\n\t\texports.EventHelper = EventHelper;\n\t\texports.DateHelper = DateHelper;\n\t\n\t/***/ },\n\t/* 4 */\n\t/***/ function(module, exports) {\n\t\n\t\t\"use strict\";\n\t\n\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t value: true\n\t\t});\n\t\texports.equals = equals;\n\t\texports.containsEvent = containsEvent;\n\t\tfunction equals(e1, e2) {\n\t\t var e1name = e1.event || e1.name;\n\t\t var e2name = e2.event || e2.name;\n\t\t return e1name === e2name;\n\t\t}\n\t\n\t\tfunction containsEvent(eventCollection, event) {\n\t\t var _iteratorNormalCompletion = true;\n\t\t var _didIteratorError = false;\n\t\t var _iteratorError = undefined;\n\t\n\t\t try {\n\t\t for (var _iterator = eventCollection[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t\t var ev = _step.value;\n\t\n\t\t if (equals(ev, event)) {\n\t\t return true;\n\t\t }\n\t\t }\n\t\t } catch (err) {\n\t\t _didIteratorError = true;\n\t\t _iteratorError = err;\n\t\t } finally {\n\t\t try {\n\t\t if (!_iteratorNormalCompletion && _iterator.return) {\n\t\t _iterator.return();\n\t\t }\n\t\t } finally {\n\t\t if (_didIteratorError) {\n\t\t throw _iteratorError;\n\t\t }\n\t\t }\n\t\t }\n\t\n\t\t return false;\n\t\t}\n\t\n\t/***/ },\n\t/* 5 */\n\t/***/ function(module, exports) {\n\t\n\t\t'use strict';\n\t\n\t\tObject.defineProperty(exports, \"__esModule\", {\n\t\t value: true\n\t\t});\n\t\texports.formatDate = formatDate;\n\t\texports.getStartOfWeek = getStartOfWeek;\n\t\texports.getTimezoneOffset = getTimezoneOffset;\n\t\tfunction formatDate(date) {\n\t\t if (!date.toISOString) {\n\t\t date = new Date(date);\n\t\t }\n\t\t return date.toISOString().split('T')[0];\n\t\t}\n\t\n\t\tfunction getStartOfWeek(date) {\n\t\t var d = new Date(+date);\n\t\t d.setHours(0, 0, 0);\n\t\t d.setDate(d.getDate() + 1 - (d.getDay() || 7));\n\t\t return d;\n\t\t}\n\t\n\t\tfunction getTimezoneOffset() {\n\t\t return 60 * new Date().getTimezoneOffset() * 1000;\n\t\t}\n\t\n\t\tvar ONE_DAY = exports.ONE_DAY = 60 * 60 * 24 * 1000;\n\t\tvar THIRTY_DAYS = exports.THIRTY_DAYS = 30 * ONE_DAY;\n\t\tvar ONE_WEEK = exports.ONE_WEEK = ONE_DAY * 7;\n\t\tvar SIXTY_DAYS = exports.SIXTY_DAYS = 60 * 60 * 24 * 60 * 1000;\n\t\n\t/***/ }\n\t/******/ ])\n\t});\n\t;\n\n/***/ }\n/******/ ]);\n//# sourceMappingURL=2ef4b7b1041907016133.jql.js.map \n if(_main.default) { return _main.default() } else { return _main() } }"; | ||
@@ -62,0 +62,0 @@ /***/ } |
{ | ||
"name": "@clef/jql-query-retention", | ||
"version": "1.0.1", | ||
"version": "1.1.0", | ||
"description": "A better Mixpanel retention query, written in JQL", | ||
@@ -40,3 +40,6 @@ "main": "lib/index.js", | ||
"webpack-dev-server": "^1.14.1" | ||
}, | ||
"dependencies": { | ||
"jql-tools": "^1.0.0" | ||
} | ||
} |
@@ -30,3 +30,3 @@ var webpack = require('webpack') | ||
query: { | ||
presets: ['es2015', 'react', 'react-hmre'] | ||
presets: ['es2015'] | ||
} | ||
@@ -33,0 +33,0 @@ }, |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
276929
18
2908
1
1
+ Addedjql-tools@^1.0.0
+ Addedjql-tools@1.1.0(transitive)