UNPKG

@google/dscc

Version:

`dscc` (Data Studio Community Component) is a library to help with the building of community components for Google Data Studio. It can be used as a standalone library, or as a npm dependency.

770 lines (755 loc) 92.4 kB
(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define("dscc", [], factory); else if(typeof exports === 'object') exports["dscc"] = factory(); else root["dscc"] = factory(); })(window, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./src/index.ts"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./src/index.ts": /*!**********************!*\ !*** ./src/index.ts ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function __export(m) { for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } Object.defineProperty(exports, "__esModule", { value: true }); /*! @license Copyright 2019 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ var types_1 = __webpack_require__(/*! ./types */ "./src/types.ts"); // Make all exported types available to external users. __export(__webpack_require__(/*! ./types */ "./src/types.ts")); /** * Returns the width (in pixels) of the vis's iframe. * * Usage: * ``` * var myWidth = dscc.getWidth(); * console.log('My width is: ', myWidth); * ``` */ exports.getWidth = function () { return document.body.clientWidth; }; /** * Returns the height (in pixels) of the vis's iframe. * * Usage: * ``` * var myHeight = dscc.getHeight(); * console.log('My height is: ', myHeight); * ``` */ exports.getHeight = function () { return document.documentElement.clientHeight; }; /** * Returns the componentId of the vis. Component ids uniquely identify a vis to * Data Studio. * * Usage: * ``` * var myComponentId = dscc.getComponentId(); * console.log('My componentId is: ', myComponentId); * ``` */ exports.getComponentId = function () { var params = new URLSearchParams(window.location.search); if (params.get('dscId') !== null) { return params.get('dscId'); } else { throw new Error('dscId must be in the query parameters. ' + 'This is a bug in ds-component, please file a bug: ' + 'https://github.com/googledatastudio/ds-component/issues/new'); } }; /** * Returns the fields indexed by their Data Studio id. */ var fieldsById = function (message) { return message.fields.reduce(function (acc, field) { acc[field.id] = field; return acc; }, {}); }; /** * Zips two arrays together into a new array. Uses the length of the shortest * array. * * Usage: * ``` * const a = [1, 2, 3]; * const b = ['a', 'b', 'c', 'd']; * const zipped = zip2(a, b); * expect(zipped).toEqual([[1, 'a'], [2, 'b'], [3, 'c']]); * ``` */ var zip2 = function (t, u) { if (t.length < u.length) { return t.map(function (tEntry, idx) { return [tEntry, u[idx]]; }); } else { return u.map(function (uEntry, idx) { return [t[idx], uEntry]; }); } }; // `.sort` isn't stable, but if you compare items, and when they are equal use // the original index, it is then stable. var stableSort = function (arr, compare) { return arr .map(function (item, index) { return ({ item: item, index: index }); }) .sort(function (a, b) { return compare(a.item, b.item) || a.index - b.index; }) .map(function (_a) { var item = _a.item; return item; }); }; var dimensionOrMetric = function (cde) { return cde.type === types_1.ConfigDataElementType.DIMENSION || cde.type === types_1.ConfigDataElementType.METRIC; }; var toNum = function (cdet) { return cdet === types_1.ConfigDataElementType.DIMENSION ? -1 : 1; }; var flattenConfigIds = function (message) { var dimnsAndMets = []; message.config.data.forEach(function (configData) { configData.elements .filter(dimensionOrMetric) .forEach(function (configDataElement) { dimnsAndMets.push(configDataElement); }); }); var sorted = stableSort(dimnsAndMets, function (a, b) { return toNum(a.type) - toNum(b.type); }); var configIds = []; sorted.forEach(function (configDataElement) { configDataElement.value.forEach(function () { return configIds.push(configDataElement.id); }); }); return configIds; }; /** * Joins a single table row with the matching `ConfigId` */ var joinObjectRow = function (configIds) { return function (row) { var objectRow = {}; zip2(row, configIds).forEach(function (_a) { var rowVal = _a[0], configId = _a[1]; if (objectRow[configId] === undefined) { objectRow[configId] = []; } objectRow[configId].push(rowVal); }, {}); return objectRow; }; }; /** * Formats tables into the `ObjectTables` format. */ var objectFormatTable = function (message) { var _a; var configIds = flattenConfigIds(message); var objectTables = (_a = {}, _a[types_1.TableType.DEFAULT] = [], _a); message.dataResponse.tables.forEach(function (table) { var objectRows = table.rows.map(joinObjectRow(configIds)); if (table.id === types_1.TableType.DEFAULT) { objectTables[table.id] = objectRows; } else { var current = objectTables[table.id]; if (current === undefined) { objectTables[table.id] = []; } objectTables[table.id] = objectTables[table.id].concat(objectRows); } }); return objectTables; }; /** * Formats tables into the `Tables` format. */ var tableFormatTable = function (message) { var _a; var fieldsBy = exports.fieldsByConfigId(message); var configIds = flattenConfigIds(message); var configIdIdx = {}; var headers = configIds.map(function (configId) { if (configIdIdx[configId] === undefined) { configIdIdx[configId] = 0; } else { configIdIdx[configId]++; } var idx = configIdIdx[configId]; var field = fieldsBy[configId][idx]; var heading = __assign(__assign({}, field), { configId: configId }); return heading; }); var tableTables = (_a = {}, _a[types_1.TableType.DEFAULT] = { headers: [], rows: [] }, _a); message.dataResponse.tables.forEach(function (table) { tableTables[table.id] = { headers: headers, rows: table.rows, }; }); return tableTables; }; /** * Returns the fields indexed by their config id. Since many fields can be in * the same `METRIC`/`DIMENSION` selection, `configId` is mapped to `Field[]`. */ exports.fieldsByConfigId = function (message) { var fieldsByDSId = fieldsById(message); var fieldsBy = {}; message.config.data.forEach(function (configData) { configData.elements .filter(dimensionOrMetric) .forEach(function (configDataElement) { fieldsBy[configDataElement.id] = configDataElement.value.map(function (dsId) { return fieldsByDSId[dsId]; }); }); }); return fieldsBy; }; /** * Flattens the style entries into a single object. `styleId`s should be unique. */ var flattenStyle = function (message) { var styleById = {}; (message.config.style || []).forEach(function (styleEntry) { styleEntry.elements.forEach(function (configStyleElement) { if (styleById[configStyleElement.id] !== undefined) { throw new Error("styleIds must be unique. Your styleId: '" + configStyleElement.id + "' is used more than once."); } styleById[configStyleElement.id] = { value: configStyleElement.value, defaultValue: configStyleElement.defaultValue, }; }); }, {}); return styleById; }; var themeStyle = function (message) { return message.config.themeStyle; }; var mapInteractionTypes = function (dsInteraction) { switch (dsInteraction) { case types_1.DSInteractionType.FILTER: return types_1.InteractionType.FILTER; } }; var transformDSInteraction = function (message) { var dsInteractions = message.config.interactions; // TODO - remove once interactions are live. if (dsInteractions === undefined) { return {}; } return dsInteractions.reduce(function (acc, dsInteraction) { var interactions = dsInteraction.supportedActions.map(mapInteractionTypes); var value = { type: mapInteractionTypes(dsInteraction.value.type), data: dsInteraction.value.data, }; acc[dsInteraction.id] = { value: value, supportedActions: interactions, }; return acc; }, {}); }; /** * Transform for date ranges */ var toDateRanges = function (message) { var dateRanges = message.dataResponse.dateRanges || []; var output = {}; return dateRanges.reduce(function (inProgress, currentDSDateRange) { inProgress[currentDSDateRange.id] = { start: currentDSDateRange.start, end: currentDSDateRange.end, }; return inProgress; }, output); }; /* Transform for color maps */ var toColorsByDimension = function (message) { var colors = message.dataResponse.colorMap || {}; return __assign({}, colors); }; /** * The transform to use for data in a Table format. i.e. `[[1, 2, 3], [4, 5, 6]]` */ exports.tableTransform = function (message) { return ({ tables: tableFormatTable(message), dateRanges: toDateRanges(message), fields: exports.fieldsByConfigId(message), style: flattenStyle(message), theme: themeStyle(message), interactions: transformDSInteraction(message), colorMap: toColorsByDimension(message), }); }; /** * The transform to use for data in an object format. i.e. `[{name: 'john', views: 3}, {name: 'suzie', views: 5}]` */ exports.objectTransform = function (message) { return ({ tables: objectFormatTable(message), dateRanges: toDateRanges(message), fields: exports.fieldsByConfigId(message), style: flattenStyle(message), theme: themeStyle(message), interactions: transformDSInteraction(message), colorMap: toColorsByDimension(message), }); }; /** * Check if the transform is likely the identity function * This is not a supported implementation path * Avoid this if at all possible - please use either objectTransform or tableTransform */ var isProbablyIdentityFunction = function (transform) { var isIdentity = false; if (transform('identity') === 'identity') { isIdentity = true; console.warn("This is an unsupported data format. Please use one of the supported transforms:\n dscc.objectFormat or dscc.tableFormat."); } return isIdentity; }; var isValidTransform = function (transform) { var isValid = false; if (transform === exports.tableTransform || transform === exports.objectTransform) { isValid = true; } else if (isProbablyIdentityFunction(transform)) { isValid = true; } return isValid; }; /* * Subscribes to messages from Data Studio. Calls `cb` for every new * [[MessageType.RENDER]] message. Returns a function that will unsubscribe * `callback` from further invocations. * * Usage - tableTransform: * ``` * var unsubscribe = dscc.subscribeToData(function(message) { * console.log(message.tables) * console.log(message.fields) * console.log(message.style) * }, {transform: dscc.tableTransform}); * * setTimeout(function() { * unsubscribe(); * }, 3000) * ``` * Usage - objectTransform: * ``` * var unsubscribe = dscc.subscribeToData(function(message) { * console.log(message.tables) * console.log(message.fields) * console.log(message.style) * }, {transform: dscc.objectTransform}); * * setTimeout(function() { * unsubscribe(); * }, 3000) * ``` */ exports.subscribeToData = function (cb, options) { if (isValidTransform(options.transform)) { var onMessage_1 = function (message) { if (message.data.type === types_1.MessageType.RENDER) { cb(options.transform(message.data)); } else { console.error("MessageType: " + message.data.type + " is not supported by this version of the library."); } }; window.addEventListener('message', onMessage_1); var componentId = exports.getComponentId(); // Tell DataStudio that the viz is ready to get events. var vizReadyMessage = { componentId: componentId, type: types_1.ToDSMessageType.VIZ_READY, }; window.parent.postMessage(vizReadyMessage, '*'); return function () { return window.removeEventListener('message', onMessage_1); }; } else { throw new Error("Only the built in transform functions are supported."); } }; /* * Does the thing that interactions should do. */ exports.sendInteraction = function (actionId, interaction, data) { var componentId = exports.getComponentId(); var interactionMessage = { type: types_1.ToDSMessageType.INTERACTION, id: actionId, data: data, componentId: componentId, }; window.parent.postMessage(interactionMessage, '*'); }; /* * Clears an interaction */ exports.clearInteraction = function (actionId, interaction) { exports.sendInteraction(actionId, interaction, undefined); }; /***/ }), /***/ "./src/types.ts": /*!**********************!*\ !*** ./src/types.ts ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ConceptType; (function (ConceptType) { ConceptType["METRIC"] = "METRIC"; ConceptType["DIMENSION"] = "DIMENSION"; })(ConceptType = exports.ConceptType || (exports.ConceptType = {})); var MessageType; (function (MessageType) { MessageType["RENDER"] = "RENDER"; })(MessageType = exports.MessageType || (exports.MessageType = {})); var FieldType; (function (FieldType) { FieldType["YEAR"] = "YEAR"; FieldType["YEAR_QUARTER"] = "YEAR_QUARTER"; FieldType["YEAR_MONTH"] = "YEAR_MONTH"; FieldType["YEAR_WEEK"] = "YEAR_WEEK"; FieldType["YEAR_MONTH_DAY"] = "YEAR_MONTH_DAY"; FieldType["YEAR_MONTH_DAY_HOUR"] = "YEAR_MONTH_DAY_HOUR"; FieldType["QUARTER"] = "QUARTER"; FieldType["MONTH"] = "MONTH"; FieldType["WEEK"] = "WEEK"; FieldType["MONTH_DAY"] = "MONTH_DAY"; FieldType["DAY_OF_WEEK"] = "DAY_OF_WEEK"; FieldType["DAY"] = "DAY"; FieldType["HOUR"] = "HOUR"; FieldType["MINUTE"] = "MINUTE"; FieldType["DURATION"] = "DURATION"; FieldType["COUNTRY"] = "COUNTRY"; FieldType["COUNTRY_CODE"] = "COUNTRY_CODE"; FieldType["CONTINENT"] = "CONTINENT"; FieldType["CONTINENT_CODE"] = "CONTINENT_CODE"; FieldType["SUB_CONTINENT"] = "SUB_CONTINENT"; FieldType["SUB_CONTINENT_CODE"] = "SUB_CONTINENT_CODE"; FieldType["REGION"] = "REGION"; FieldType["REGION_CODE"] = "REGION_CODE"; FieldType["CITY"] = "CITY"; FieldType["CITY_CODE"] = "CITY_CODE"; FieldType["METRO_CODE"] = "METRO_CODE"; FieldType["LATITUDE_LONGITUDE"] = "LATITUDE_LONGITUDE"; FieldType["NUMBER"] = "NUMBER"; FieldType["PERCENT"] = "PERCENT"; FieldType["TEXT"] = "TEXT"; FieldType["BOOLEAN"] = "BOOLEAN"; FieldType["URL"] = "URL"; FieldType["IMAGE"] = "IMAGE"; FieldType["CURRENCY_AED"] = "CURRENCY_AED"; FieldType["CURRENCY_ALL"] = "CURRENCY_ALL"; FieldType["CURRENCY_ARS"] = "CURRENCY_ARS"; FieldType["CURRENCY_AUD"] = "CURRENCY_AUD"; FieldType["CURRENCY_BDT"] = "CURRENCY_BDT"; FieldType["CURRENCY_BGN"] = "CURRENCY_BGN"; FieldType["CURRENCY_BOB"] = "CURRENCY_BOB"; FieldType["CURRENCY_BRL"] = "CURRENCY_BRL"; FieldType["CURRENCY_CAD"] = "CURRENCY_CAD"; FieldType["CURRENCY_CDF"] = "CURRENCY_CDF"; FieldType["CURRENCY_CHF"] = "CURRENCY_CHF"; FieldType["CURRENCY_CLP"] = "CURRENCY_CLP"; FieldType["CURRENCY_CNY"] = "CURRENCY_CNY"; FieldType["CURRENCY_COP"] = "CURRENCY_COP"; FieldType["CURRENCY_CRC"] = "CURRENCY_CRC"; FieldType["CURRENCY_CZK"] = "CURRENCY_CZK"; FieldType["CURRENCY_DKK"] = "CURRENCY_DKK"; FieldType["CURRENCY_DOP"] = "CURRENCY_DOP"; FieldType["CURRENCY_EGP"] = "CURRENCY_EGP"; FieldType["CURRENCY_ETB"] = "CURRENCY_ETB"; FieldType["CURRENCY_EUR"] = "CURRENCY_EUR"; FieldType["CURRENCY_GBP"] = "CURRENCY_GBP"; FieldType["CURRENCY_HKD"] = "CURRENCY_HKD"; FieldType["CURRENCY_HRK"] = "CURRENCY_HRK"; FieldType["CURRENCY_HUF"] = "CURRENCY_HUF"; FieldType["CURRENCY_IDR"] = "CURRENCY_IDR"; FieldType["CURRENCY_ILS"] = "CURRENCY_ILS"; FieldType["CURRENCY_INR"] = "CURRENCY_INR"; FieldType["CURRENCY_IRR"] = "CURRENCY_IRR"; FieldType["CURRENCY_ISK"] = "CURRENCY_ISK"; FieldType["CURRENCY_JMD"] = "CURRENCY_JMD"; FieldType["CURRENCY_JPY"] = "CURRENCY_JPY"; FieldType["CURRENCY_KRW"] = "CURRENCY_KRW"; FieldType["CURRENCY_LKR"] = "CURRENCY_LKR"; FieldType["CURRENCY_LTL"] = "CURRENCY_LTL"; FieldType["CURRENCY_MNT"] = "CURRENCY_MNT"; FieldType["CURRENCY_MVR"] = "CURRENCY_MVR"; FieldType["CURRENCY_MXN"] = "CURRENCY_MXN"; FieldType["CURRENCY_MYR"] = "CURRENCY_MYR"; FieldType["CURRENCY_NOK"] = "CURRENCY_NOK"; FieldType["CURRENCY_NZD"] = "CURRENCY_NZD"; FieldType["CURRENCY_PAB"] = "CURRENCY_PAB"; FieldType["CURRENCY_PEN"] = "CURRENCY_PEN"; FieldType["CURRENCY_PHP"] = "CURRENCY_PHP"; FieldType["CURRENCY_PKR"] = "CURRENCY_PKR"; FieldType["CURRENCY_PLN"] = "CURRENCY_PLN"; FieldType["CURRENCY_RON"] = "CURRENCY_RON"; FieldType["CURRENCY_RSD"] = "CURRENCY_RSD"; FieldType["CURRENCY_RUB"] = "CURRENCY_RUB"; FieldType["CURRENCY_SAR"] = "CURRENCY_SAR"; FieldType["CURRENCY_SEK"] = "CURRENCY_SEK"; FieldType["CURRENCY_SGD"] = "CURRENCY_SGD"; FieldType["CURRENCY_THB"] = "CURRENCY_THB"; FieldType["CURRENCY_TRY"] = "CURRENCY_TRY"; FieldType["CURRENCY_TWD"] = "CURRENCY_TWD"; FieldType["CURRENCY_TZS"] = "CURRENCY_TZS"; FieldType["CURRENCY_UAH"] = "CURRENCY_UAH"; FieldType["CURRENCY_USD"] = "CURRENCY_USD"; FieldType["CURRENCY_UYU"] = "CURRENCY_UYU"; FieldType["CURRENCY_VEF"] = "CURRENCY_VEF"; FieldType["CURRENCY_VND"] = "CURRENCY_VND"; FieldType["CURRENCY_YER"] = "CURRENCY_YER"; FieldType["CURRENCY_ZAR"] = "CURRENCY_ZAR"; })(FieldType = exports.FieldType || (exports.FieldType = {})); var TableType; (function (TableType) { TableType["DEFAULT"] = "DEFAULT"; TableType["COMPARISON"] = "COMPARISON"; TableType["SUMMARY"] = "SUMMARY"; })(TableType = exports.TableType || (exports.TableType = {})); var DateRangeType; (function (DateRangeType) { DateRangeType["DEFAULT"] = "DEFAULT"; DateRangeType["COMPARISON"] = "COMPARISON"; })(DateRangeType = exports.DateRangeType || (exports.DateRangeType = {})); var ConfigDataElementType; (function (ConfigDataElementType) { /** * Renders a metric field element. */ ConfigDataElementType["METRIC"] = "METRIC"; /** * Renders a dimension field element. */ ConfigDataElementType["DIMENSION"] = "DIMENSION"; /** * Renders a dropdown that affects the maximum number of results returned. */ ConfigDataElementType["MAX_RESULTS"] = "MAX_RESULTS"; })(ConfigDataElementType = exports.ConfigDataElementType || (exports.ConfigDataElementType = {})); var ConfigStyleElementType; (function (ConfigStyleElementType) { /** * Renders a text input box. */ ConfigStyleElementType["TEXTINPUT"] = "TEXTINPUT"; /** * A single select dropdown. */ ConfigStyleElementType["SELECT_SINGLE"] = "SELECT_SINGLE"; /** * Renders a checkbox. * * Default value: `false` */ ConfigStyleElementType["CHECKBOX"] = "CHECKBOX"; /** * Renders the font color selector. * * Acceptable default values: HEX color value. E.g. `"#888888"`. * * Default value: `"#000"`. */ ConfigStyleElementType["FONT_COLOR"] = "FONT_COLOR"; /** * Renders the font size selector. * * Default value: `"14px"`. */ ConfigStyleElementType["FONT_SIZE"] = "FONT_SIZE"; /** * Renders the font family selector. * * Default value: `""` */ ConfigStyleElementType["FONT_FAMILY"] = "FONT_FAMILY"; /** * Renders a fill color selector. * * Acceptable default values: HEX color value. */ ConfigStyleElementType["FILL_COLOR"] = "FILL_COLOR"; /** * Renders a border color selector. * * Acceptable default values: HEX color value. */ ConfigStyleElementType["BORDER_COLOR"] = "BORDER_COLOR"; /** * Renders an axis color selector. * * Acceptable default values: HEX color value. */ ConfigStyleElementType["AXIS_COLOR"] = "AXIS_COLOR"; /** * Renders a grid color selector. * * Acceptable default values: HEX color value. */ ConfigStyleElementType["GRID_COLOR"] = "GRID_COLOR"; /** * Renders an opacity selector. */ ConfigStyleElementType["OPACITY"] = "OPACITY"; /** * Renders a line weight picker. */ ConfigStyleElementType["LINE_WEIGHT"] = "LINE_WEIGHT"; /** * Renders a line style picker. * * Acceptable default values: `"solid"`, `"dashed"`, `"dotted"`, or `"double"`. */ ConfigStyleElementType["LINE_STYLE"] = "LINE_STYLE"; /** * Renders a border radius selector. */ ConfigStyleElementType["BORDER_RADIUS"] = "BORDER_RADIUS"; /** * Renders an interval selector. */ ConfigStyleElementType["INTERVAL"] = "INTERVAL"; /** * Renders a radio select with pre-defined values. */ ConfigStyleElementType["SELECT_RADIO"] = "SELECT_RADIO"; })(ConfigStyleElementType = exports.ConfigStyleElementType || (exports.ConfigStyleElementType = {})); var DSInteractionType; (function (DSInteractionType) { DSInteractionType["FILTER"] = "FILTER"; })(DSInteractionType = exports.DSInteractionType || (exports.DSInteractionType = {})); var ToDSMessageType; (function (ToDSMessageType) { ToDSMessageType["VIZ_READY"] = "vizReady"; ToDSMessageType["INTERACTION"] = "vizAction"; })(ToDSMessageType = exports.ToDSMessageType || (exports.ToDSMessageType = {})); var InteractionType; (function (InteractionType) { InteractionType["FILTER"] = "FILTER"; })(InteractionType = exports.InteractionType || (exports.InteractionType = {})); /***/ }) /******/ }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kc2NjL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9kc2NjL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2RzY2MvLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vZHNjYy8uL3NyYy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztRQ1ZBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7O1FBR0E7UUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRkE7Ozs7Ozs7Ozs7Ozs7OztFQWVFO0FBQ0YsbUVBeUNpQjtBQUVqQix1REFBdUQ7QUFDdkQsK0RBQXdCO0FBRXhCOzs7Ozs7OztHQVFHO0FBQ1UsZ0JBQVEsR0FBRyxjQUFjLGVBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUF6QixD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ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiZHNjY1wiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJkc2NjXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImRzY2NcIl0gPSBmYWN0b3J5KCk7XG59KSh3aW5kb3csIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2luZGV4LnRzXCIpO1xuIiwiLyohXG4gIEBsaWNlbnNlXG4gIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcblxuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuaW1wb3J0IHtcbiAgQ2xlYXJJbnRlcmFjdGlvbixcbiAgQ29sb3JzQnlEaW1lbnNpb24sXG4gIENvbmZpZ0RhdGEsXG4gIENvbmZpZ0RhdGFFbGVtZW50LFxuICBDb25maWdEYXRhRWxlbWVudERpbWVuc2lvbixcbiAgQ29uZmlnRGF0YUVsZW1lbnRNZXRyaWMsXG4gIENvbmZpZ0RhdGFFbGVtZW50VHlwZSxcbiAgQ29uZmlnSWQsXG4gIENvbmZpZ1N0eWxlLFxuICBDb25maWdTdHlsZUVsZW1lbnQsXG4gIERhdGVSYW5nZXNCeUlkLFxuICBEU0ludGVyYWN0aW9uRGF0YSxcbiAgRFNJbnRlcmFjdGlvblR5cGUsXG4gIERTUm93VmFsdWUsXG4gIEZpZWxkLFxuICBGaWVsZElkLFxuICBGaWVsZHNCeUNvbmZpZ0lkLFxuICBGaWVsZHNCeUlkLFxuICBJbnRlcmFjdGlvbk1lc3NhZ2UsXG4gIEludGVyYWN0aW9uc0J5SWQsXG4gIEludGVyYWN0aW9uVHlwZSxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVR5cGUsXG4gIE9iamVjdFJvdyxcbiAgT2JqZWN0VGFibGVzLFxuICBPYmplY3RUcmFuc2Zvcm0sXG4gIFBvc3RNZXNzYWdlLFxuICBSb3csXG4gIFJvd0hlYWRpbmcsXG4gIFNlbmRJbnRlcmFjdGlvbixcbiAgU3R5