@splunk/visualization-encoding-parsers 26.0.0 → 26.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Base.js CHANGED
@@ -240,46 +240,55 @@ var find_default = /*#__PURE__*/__webpack_require__.n(find_);
240
240
  var format_hasOwnProperty = Object.prototype.hasOwnProperty;
241
241
  var rangeFormat = function rangeFormat(value) {
242
242
  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
243
- ranges = _ref.ranges,
244
- values = _ref.values;
243
+ ranges = _ref.ranges,
244
+ values = _ref.values;
245
+
245
246
  if (Array.isArray(ranges) && Array.isArray(values) && !Number.isNaN(value)) {
246
247
  var floatVal = parseFloat(value);
248
+
247
249
  for (var i = 0; i < ranges.length; i += 1) {
248
250
  // bad range value
249
251
  if (Number.isNaN(Number(ranges[i]))) {
250
252
  // Could not format value: Ranges are required to be numbers. Falling back to original value
251
253
  return value;
252
- }
253
- // value is less than the range limit
254
+ } // value is less than the range limit
255
+
256
+
254
257
  if (floatVal <= parseFloat(ranges[i])) {
255
258
  var valueIndex = Math.min(i, values.length - 1); // correct the index if there are more range items than values
259
+
256
260
  if (values[valueIndex]) {
257
261
  return values[valueIndex];
258
262
  }
259
263
  }
260
264
  }
265
+
261
266
  if (floatVal > parseFloat(ranges[ranges.length - 1])) {
262
267
  return values[values.length - 1];
263
268
  }
264
- }
265
- // Could not format value: Ranges and Value are required to be numbers
269
+ } // Could not format value: Ranges and Value are required to be numbers
270
+
271
+
266
272
  return value;
267
273
  };
268
274
  var categoryFormat = function categoryFormat(value, _ref2) {
269
275
  var categories = _ref2.categories,
270
- values = _ref2.values;
276
+ values = _ref2.values;
277
+
271
278
  if (!(Array.isArray(categories) && Array.isArray(values) && categories.length === values.length)) {
272
279
  // Could not format value: categories & values should be arrays of the same length. Falling back to original value
273
280
  return value;
274
281
  }
282
+
275
283
  var valueIndex = categories.indexOf(value);
284
+
276
285
  if (valueIndex > -1) {
277
286
  return values[valueIndex];
278
- }
279
- // Could not format value: Category does not exist. Falling back to original value
287
+ } // Could not format value: Category does not exist. Falling back to original value
288
+
289
+
280
290
  return value;
281
291
  };
282
-
283
292
  /**
284
293
  * based on a range configuration this formatter maps the value to a value specified in a range.
285
294
  * the range fitting follows this criteria: `range.from <= value < range.to` so the `to` value is not included
@@ -292,27 +301,27 @@ var categoryFormat = function categoryFormat(value, _ref2) {
292
301
  * @param {object} formatConfig
293
302
  * @param {Object[]} formatConfig.ranges
294
303
  */
304
+
295
305
  var rangeValueFormat = function rangeValueFormat(value, _ref3) {
296
306
  var _ref3$ranges = _ref3.ranges,
297
- ranges = _ref3$ranges === void 0 ? [] : _ref3$ranges;
307
+ ranges = _ref3$ranges === void 0 ? [] : _ref3$ranges;
298
308
  var floatValue = parseFloat(value);
309
+
299
310
  if (Number.isNaN(Number(value))) {
300
311
  return value;
301
312
  }
313
+
302
314
  for (var i = 0; i < ranges.length; i += 1) {
303
- if (
304
- // open upper bound: value is bigger than or equal to open upper bound start (from)
305
- i === 0 && format_hasOwnProperty.call(ranges[i], 'from') && floatValue >= ranges[i].from ||
306
- // inbetween: value falls into from - to range
307
- floatValue >= ranges[i].from && floatValue < ranges[i].to ||
308
- // open lower bound: value is smaller than or equal to open lower bound end (to)
315
+ if ( // open upper bound: value is bigger than or equal to open upper bound start (from)
316
+ i === 0 && format_hasOwnProperty.call(ranges[i], 'from') && floatValue >= ranges[i].from || // inbetween: value falls into from - to range
317
+ floatValue >= ranges[i].from && floatValue < ranges[i].to || // open lower bound: value is smaller than or equal to open lower bound end (to)
309
318
  i === ranges.length - 1 && format_hasOwnProperty.call(ranges[i], 'to') && floatValue < ranges[i].to) {
310
319
  return ranges[i].value;
311
320
  }
312
321
  }
322
+
313
323
  return value;
314
324
  };
315
-
316
325
  /**
317
326
  * this formatter maps the value to a value specified in a list of potential matches .
318
327
  * if the value passed is a match for what is provided in `matches[i].match`, we return that mapped value `matches[i].value`.
@@ -325,11 +334,12 @@ var rangeValueFormat = function rangeValueFormat(value, _ref3) {
325
334
  * @param {Object[]} formatConfig.matches
326
335
  * @param {object} formatConfig.defaultValue
327
336
  */
337
+
328
338
  var format_matchValueFormat = function matchValueFormat(value, _ref4) {
329
339
  var _ref4$matches = _ref4.matches,
330
- matches = _ref4$matches === void 0 ? [] : _ref4$matches,
331
- _ref4$defaultValue = _ref4.defaultValue,
332
- defaultValue = _ref4$defaultValue === void 0 ? undefined : _ref4$defaultValue;
340
+ matches = _ref4$matches === void 0 ? [] : _ref4$matches,
341
+ _ref4$defaultValue = _ref4.defaultValue,
342
+ defaultValue = _ref4$defaultValue === void 0 ? undefined : _ref4$defaultValue;
333
343
  var defaultResult = isUndefined_default()(defaultValue) ? value : defaultValue;
334
344
  var matchResult = find_default()(matches, function (match) {
335
345
  return match.match && match.match === value;
@@ -339,7 +349,6 @@ var format_matchValueFormat = function matchValueFormat(value, _ref4) {
339
349
  var NON_NUMERIC_RANGE_ERROR = 'Could not format value: Ranges are required to be numbers. Falling back to first color';
340
350
  var VALUES_AND_RANGES_HAVE_DIFFERENT_LENGTH = 'gradient ranges and values must have the same number of elements';
341
351
  var INVALID_VALUE = 'Could not format value for gradient:';
342
-
343
352
  /**
344
353
  * based on ranges and values this formatter maps the value to an interpolated color
345
354
  *
@@ -350,31 +359,38 @@ var INVALID_VALUE = 'Could not format value for gradient:';
350
359
  * @param {string[]} data the data to be formatted
351
360
  * @param errorHandler function
352
361
  */
362
+
353
363
  var format_colorGradientFormat = function colorGradientFormat(value, _ref5, data, errorHandler) {
354
364
  var ranges = _ref5.ranges,
355
- values = _ref5.values;
365
+ values = _ref5.values;
356
366
  var colorValues = values;
357
367
  var colorRanges = ranges;
368
+
358
369
  function errorColor() {
359
370
  return colorValues ? external_chroma_js_default()(colorValues[0]).hex().toUpperCase() : '#000';
360
371
  }
372
+
361
373
  if (!Number.isNaN(Number(value))) {
362
374
  // set default values for gradient colors if values not explicit
363
375
  if (!colorValues) {
364
376
  colorValues = ['white', 'red'];
365
377
  }
378
+
366
379
  if (colorValues.length === 1) {
367
380
  colorValues.unshift('white'); // force color bin to have a lower bound color
368
- }
369
- // set default values for ranges if ranges not explicit
381
+ } // set default values for ranges if ranges not explicit
382
+
383
+
370
384
  if (!ranges) {
371
385
  if (data && data.length > 0) {
372
386
  var min = data.length > 0 ? Math.min.apply(null, data) : undefined;
373
387
  var max = data.length > 0 ? Math.max.apply(null, data) : undefined;
374
388
  colorRanges = [min];
389
+
375
390
  for (var i = 1; i < colorValues.length - 1; i += 1) {
376
391
  colorRanges.push(min + i * (max - min) / (colorValues.length - 1));
377
392
  }
393
+
378
394
  colorRanges.push(max);
379
395
  } else {
380
396
  colorRanges = [0, 1]; // no data values, so just make the range from zero to 1
@@ -388,22 +404,23 @@ var format_colorGradientFormat = function colorGradientFormat(value, _ref5, data
388
404
  colorRanges.sort(function (a, b) {
389
405
  return a - b;
390
406
  }); // force ascending order of range stops
407
+
391
408
  if (colorRanges.length !== colorValues.length) {
392
409
  errorHandler(VALUES_AND_RANGES_HAVE_DIFFERENT_LENGTH);
393
410
  return errorColor();
394
411
  }
395
- var floatVal = parseFloat(value);
396
412
 
397
- // don't let value be outside the allowed range
413
+ var floatVal = parseFloat(value); // don't let value be outside the allowed range
414
+
398
415
  if (floatVal > parseFloat(colorRanges[colorRanges.length - 1])) {
399
416
  return external_chroma_js_default()(colorValues[colorValues.length - 1]).hex().toUpperCase(); // high end
400
417
  }
401
418
 
402
419
  if (floatVal < parseFloat(colorRanges[0])) {
403
420
  return external_chroma_js_default()(colorValues[0]).hex().toUpperCase(); // low end
404
- }
421
+ } // find the color gradient range that the value is inside
422
+
405
423
 
406
- // find the color gradient range that the value is inside
407
424
  for (var _i = 1; _i < colorRanges.length; _i += 1) {
408
425
  // bad range value
409
426
  if (Number.isNaN(Number(colorRanges[_i]))) {
@@ -411,13 +428,14 @@ var format_colorGradientFormat = function colorGradientFormat(value, _ref5, data
411
428
  errorHandler(NON_NUMERIC_RANGE_ERROR);
412
429
  return errorColor();
413
430
  }
431
+
414
432
  var upperVal = colorRanges[_i];
433
+
415
434
  if (floatVal <= upperVal) {
416
435
  // if value is inside the bin
417
436
  var lowerVal = colorRanges[_i - 1];
418
- var tau = (value - lowerVal) / (upperVal - lowerVal);
437
+ var tau = (value - lowerVal) / (upperVal - lowerVal); // deal with special case when the upper and lower and bounds of the colorRange is equal
419
438
 
420
- // deal with special case when the upper and lower and bounds of the colorRange is equal
421
439
  if (upperVal === lowerVal) {
422
440
  if (value === 0) {
423
441
  // user prolly expects lower end of color range if value is zero
@@ -432,8 +450,9 @@ var format_colorGradientFormat = function colorGradientFormat(value, _ref5, data
432
450
  return external_chroma_js_default.a.scale([lowerColor, upperColor])(tau).hex().toUpperCase();
433
451
  }
434
452
  }
435
- }
436
- // eslint-disable-next-line
453
+ } // eslint-disable-next-line
454
+
455
+
437
456
  errorHandler("".concat(INVALID_VALUE, " ").concat(value));
438
457
  return errorColor();
439
458
  };
@@ -449,10 +468,10 @@ var newFormatterErrorHandler = function newFormatterErrorHandler(maxErrors, hand
449
468
  if (errorCount < maxErrors) {
450
469
  handlerFunc(msg);
451
470
  }
471
+
452
472
  errorCount += 1;
453
473
  };
454
474
  };
455
-
456
475
  /**
457
476
  * returns a formatter function based on a format config
458
477
  * @param {Object} formatCfg formatter config
@@ -461,44 +480,50 @@ var newFormatterErrorHandler = function newFormatterErrorHandler(maxErrors, hand
461
480
  * @param {string[]|number[]} formatCfg.categories an array of categories. categories are used for a 1:1 mapping to values. requires formatCfg.values
462
481
  * @param {number[]} data the data to be formatted
463
482
  */
483
+
464
484
  var getFormatter = function getFormatter(data) {
465
485
  var formatCfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
486
+
466
487
  if (formatCfg.type) {
467
488
  if (formatters[formatCfg.type]) {
468
489
  // @TODO(pwied):
469
490
  // future: should formatters have prepare stage where params are validated
470
491
  // and additional formatting context is generated (e.g. min & max value)
471
492
  return function (value) {
472
- return formatters[formatCfg.type](value, formatCfg, data,
473
- // eslint-disable-next-line no-console
493
+ return formatters[formatCfg.type](value, formatCfg, data, // eslint-disable-next-line no-console
474
494
  newFormatterErrorHandler(MAX_LOGGED_FORMATTER_ERRORS, function (msg) {
475
495
  return console.warn(msg);
476
496
  }));
477
497
  };
478
498
  }
499
+
479
500
  return function (value) {
480
501
  return value;
481
502
  };
482
- }
483
- // @TODO(pwied):
503
+ } // @TODO(pwied):
484
504
  // - remove post beta deadline
485
505
  // - move to formatters with type option
486
506
  // - leaving it here for now because Choropleth builds on it
507
+
508
+
487
509
  var ranges = formatCfg.ranges,
488
- values = formatCfg.values;
510
+ values = formatCfg.values;
511
+
489
512
  if (values) {
490
513
  if (ranges) {
491
514
  return function (value) {
492
515
  return rangeFormat(value, formatCfg);
493
516
  };
494
517
  }
518
+
495
519
  if (formatCfg.categories) {
496
520
  return function (value) {
497
521
  return categoryFormat(value, formatCfg);
498
522
  };
499
523
  }
500
- }
501
- // eslint-disable-next-line
524
+ } // eslint-disable-next-line
525
+
526
+
502
527
  console.warn('Could not find a formatter. Falling back to identity fn');
503
528
  return function (value) {
504
529
  return value;
@@ -511,7 +536,6 @@ var isFinite_default = /*#__PURE__*/__webpack_require__.n(isFinite_);
511
536
  // CONCATENATED MODULE: ./src/util/types.js
512
537
 
513
538
 
514
-
515
539
  /**
516
540
  * getDataTypeForPoint
517
541
  * naive implementation of checking for the data type of a single data point
@@ -521,20 +545,23 @@ var isFinite_default = /*#__PURE__*/__webpack_require__.n(isFinite_);
521
545
  * @param {any} dataPoint
522
546
  * @return {string} type
523
547
  */
548
+
524
549
  var types_getDataTypeForPoint = function getDataTypeForPoint(dataPoint) {
525
550
  if (isFinite_default()(+dataPoint) && isNumber_default()(+dataPoint)) {
526
551
  return 'number';
527
552
  }
553
+
528
554
  if (!Number.isNaN(Date.parse(dataPoint))) {
529
555
  return 'time';
530
556
  }
557
+
531
558
  if (typeof dataPoint === 'string') {
532
559
  return 'string';
533
- }
534
- // nulls, objects, etc
560
+ } // nulls, objects, etc
561
+
562
+
535
563
  return 'unknown';
536
564
  };
537
-
538
565
  /**
539
566
  * inferDataTypeFromSample
540
567
  * based on a number of data points this function determines the data type for all of them
@@ -543,6 +570,7 @@ var types_getDataTypeForPoint = function getDataTypeForPoint(dataPoint) {
543
570
  * @param {Array} dataSample an array of arbitrary size containing data points of any data type
544
571
  * @return {string} type the most common type in the sample
545
572
  */
573
+
546
574
  var inferDataTypeFromSample = function inferDataTypeFromSample(dataSample) {
547
575
  var typeMatches = {
548
576
  time: 0,
@@ -563,7 +591,6 @@ var inferDataTypeFromSample = function inferDataTypeFromSample(dataSample) {
563
591
  });
564
592
  return returnType;
565
593
  };
566
-
567
594
  /**
568
595
  * based on a data array (e.g. one data column) this function returns a tiny sample of it
569
596
  * @TODO: very naive approach. there's papers with more advanced techniques but for now this should be very fast
@@ -571,39 +598,55 @@ var inferDataTypeFromSample = function inferDataTypeFromSample(dataSample) {
571
598
  * @param {Array} data to draw a sample from
572
599
  * @return {Array} a sample of the passed data
573
600
  */
601
+
574
602
  var drawSample = function drawSample(data) {
575
603
  if (data.length > 2) {
576
604
  return [data[0], data[Math.floor(data.length / 2)], data[data.length - 1]];
577
605
  }
606
+
578
607
  if (data.length === 2) {
579
608
  return [data[0], data[1]];
580
- }
581
- // small enough to check everything
609
+ } // small enough to check everything
610
+
611
+
582
612
  return data;
583
613
  };
584
614
  // CONCATENATED MODULE: ./src/Base.js
585
615
 
586
616
 
587
617
 
618
+
588
619
  function ownKeys(object, enumerableOnly) {
589
620
  var keys = Object.keys(object);
621
+
590
622
  if (Object.getOwnPropertySymbols) {
591
623
  var symbols = Object.getOwnPropertySymbols(object);
592
- enumerableOnly && (symbols = symbols.filter(function (sym) {
624
+ if (enumerableOnly) symbols = symbols.filter(function (sym) {
593
625
  return Object.getOwnPropertyDescriptor(object, sym).enumerable;
594
- })), keys.push.apply(keys, symbols);
626
+ });
627
+ keys.push.apply(keys, symbols);
595
628
  }
629
+
596
630
  return keys;
597
631
  }
632
+
598
633
  function _objectSpread(target) {
599
634
  for (var i = 1; i < arguments.length; i++) {
600
- var source = null != arguments[i] ? arguments[i] : {};
601
- i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
602
- defineProperty_default()(target, key, source[key]);
603
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
604
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
605
- });
635
+ var source = arguments[i] != null ? arguments[i] : {};
636
+
637
+ if (i % 2) {
638
+ ownKeys(Object(source), true).forEach(function (key) {
639
+ defineProperty_default()(target, key, source[key]);
640
+ });
641
+ } else if (Object.getOwnPropertyDescriptors) {
642
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
643
+ } else {
644
+ ownKeys(Object(source)).forEach(function (key) {
645
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
646
+ });
647
+ }
606
648
  }
649
+
607
650
  return target;
608
651
  }
609
652
 
@@ -612,6 +655,8 @@ function _objectSpread(target) {
612
655
 
613
656
 
614
657
 
658
+
659
+
615
660
  var getDataForDataSourceType = function getDataForDataSourceType(data, dataSourceType) {
616
661
  if (!dataSourceType || !data[dataSourceType] || !data[dataSourceType].data) {
617
662
  // @TODO: warn about datasource type not being found
@@ -620,6 +665,7 @@ var getDataForDataSourceType = function getDataForDataSourceType(data, dataSourc
620
665
  columns: []
621
666
  };
622
667
  }
668
+
623
669
  return data[dataSourceType].data;
624
670
  };
625
671
  /*
@@ -627,16 +673,20 @@ var getDataForDataSourceType = function getDataForDataSourceType(data, dataSourc
627
673
  * @param {String} fieldIndexRangeStr '0:', '0:5', ':5'
628
674
  * @returns {Object} info about parsed range if there is any
629
675
  */
676
+
677
+
630
678
  var Base_parseFieldRangeReference = function parseFieldRangeReference(fieldIndexRangeStr) {
631
679
  if (!fieldIndexRangeStr || fieldIndexRangeStr.indexOf(':') === -1) {
632
680
  return {
633
681
  isFieldIndexRange: false
634
682
  };
635
683
  }
684
+
636
685
  var _fieldIndexRangeStr$s = fieldIndexRangeStr.split(':'),
637
- _fieldIndexRangeStr$s2 = slicedToArray_default()(_fieldIndexRangeStr$s, 2),
638
- fromFieldIndexStr = _fieldIndexRangeStr$s2[0],
639
- toFieldIndexStr = _fieldIndexRangeStr$s2[1];
686
+ _fieldIndexRangeStr$s2 = slicedToArray_default()(_fieldIndexRangeStr$s, 2),
687
+ fromFieldIndexStr = _fieldIndexRangeStr$s2[0],
688
+ toFieldIndexStr = _fieldIndexRangeStr$s2[1];
689
+
640
690
  return {
641
691
  isFieldIndexRange: true,
642
692
  fromFieldIndex: Number.isNaN(Number(fromFieldIndexStr)) || !fromFieldIndexStr ? 0 : Number(fromFieldIndexStr),
@@ -648,6 +698,7 @@ var Base_parseFieldRangeReference = function parseFieldRangeReference(fieldIndex
648
698
  * @param {String} fieldReferenceStr 'primary[1][123]'
649
699
  * @returns {Object} { fieldIndex: 1, columnIndex: 123, isFieldIndexRange: true, fromFieldIndexRange: 0, toFieldIndexRange: 3 }
650
700
  */
701
+
651
702
  var parseIndexBasedFieldReference = function parseIndexBasedFieldReference(fieldReferenceStr) {
652
703
  var indices = fieldReferenceStr.replace(/^[A-Za-z0-9]+/, '').replace(/\[/g, '').replace(/\]/g, ',').split(',');
653
704
  var dataSourceName = fieldReferenceStr.match(/^[A-Za-z0-9]+/)[0];
@@ -658,12 +709,12 @@ var parseIndexBasedFieldReference = function parseIndexBasedFieldReference(field
658
709
  columnIndex: Number.isNaN(Number(indices[1])) || !indices[1] ? null : Number(indices[1])
659
710
  }, fieldRange);
660
711
  };
661
-
662
712
  /*
663
713
  * parse fieldReferenceStr to get field name and column index for user defined encoding. e.g. 'primary.color[123]'
664
714
  * @param {String} fieldReferenceStr 'primary.color[123]'
665
715
  * @returns {Object} { fieldName: 'color', columnIndex: 123 }
666
716
  */
717
+
667
718
  var parseNameBasedFieldReference = function parseNameBasedFieldReference(fieldReferenceStr) {
668
719
  var dataSourceName = fieldReferenceStr.match(/^[A-Za-z0-9]+/)[0];
669
720
  var fieldNameStr = fieldReferenceStr.split('.')[1];
@@ -676,42 +727,54 @@ var parseNameBasedFieldReference = function parseNameBasedFieldReference(fieldRe
676
727
  columnIndex: columnIndex
677
728
  };
678
729
  };
730
+
679
731
  var Base_getDataForIndexBasedFieldReference = function getDataForIndexBasedFieldReference(data, fieldReferenceStr) {
680
732
  var fields = data.fields,
681
- columns = data.columns;
733
+ columns = data.columns;
734
+
682
735
  var _parseIndexBasedField = parseIndexBasedFieldReference(fieldReferenceStr),
683
- dataSourceName = _parseIndexBasedField.dataSourceName,
684
- isFieldIndexRange = _parseIndexBasedField.isFieldIndexRange,
685
- fromFieldIndex = _parseIndexBasedField.fromFieldIndex,
686
- toFieldIndex = _parseIndexBasedField.toFieldIndex,
687
- fieldIndex = _parseIndexBasedField.fieldIndex,
688
- columnIndex = _parseIndexBasedField.columnIndex;
736
+ dataSourceName = _parseIndexBasedField.dataSourceName,
737
+ isFieldIndexRange = _parseIndexBasedField.isFieldIndexRange,
738
+ fromFieldIndex = _parseIndexBasedField.fromFieldIndex,
739
+ toFieldIndex = _parseIndexBasedField.toFieldIndex,
740
+ fieldIndex = _parseIndexBasedField.fieldIndex,
741
+ columnIndex = _parseIndexBasedField.columnIndex;
742
+
689
743
  if (isFieldIndexRange) {
690
744
  var dataForRange = [];
745
+
691
746
  if (fromFieldIndex > -1) {
692
747
  var endIndex = toFieldIndex > -1 ? Math.min(fields.length - 1, toFieldIndex) : fields.length + toFieldIndex;
748
+
693
749
  for (var i = fromFieldIndex; i <= endIndex; i += 1) {
694
750
  dataForRange.push(getDataForIndexBasedFieldReference(data, "".concat(dataSourceName, "[").concat(i, "][").concat(columnIndex, "]")));
695
751
  }
752
+
696
753
  return dataForRange;
697
754
  }
698
755
  }
756
+
699
757
  if (isNumber_default()(fieldIndex)) {
700
758
  var isNegative = fieldIndex < 0;
701
759
  var absoluteIndex = Math.abs(fieldIndex);
760
+
702
761
  if (isNegative && absoluteIndex > fields.length || !isNegative && fieldIndex > fields.length - 1) {
703
762
  // The field index is out of bounds
704
763
  return {};
705
764
  }
765
+
706
766
  var correctedFieldIndex = isNegative ? fields.length - absoluteIndex : fieldIndex;
707
767
  var fieldName = typeof_default()(fields[correctedFieldIndex]) === 'object' ? fields[correctedFieldIndex].name : fields[correctedFieldIndex];
708
768
  var fieldData;
769
+
709
770
  if (isNumber_default()(columnIndex)) {
710
771
  var isNegativeColumnIndex = columnIndex < 0;
772
+
711
773
  if (isNegativeColumnIndex && columnIndex < -columns[correctedFieldIndex].length || columnIndex >= columns[correctedFieldIndex].length) {
712
774
  // The column index is out of bounds
713
775
  return {};
714
776
  }
777
+
715
778
  var correctColumnIndex = isNegativeColumnIndex ? columns[correctedFieldIndex].length + columnIndex : columnIndex;
716
779
  fieldData = columns[correctedFieldIndex].map(function () {
717
780
  return columns[correctedFieldIndex][correctColumnIndex];
@@ -719,31 +782,41 @@ var Base_getDataForIndexBasedFieldReference = function getDataForIndexBasedField
719
782
  } else {
720
783
  fieldData = columns[correctedFieldIndex];
721
784
  }
785
+
722
786
  return {
723
787
  fieldName: fieldName,
724
788
  data: fieldData
725
789
  };
726
790
  }
791
+
727
792
  return {};
728
793
  };
794
+
729
795
  var Base_getDataForNameBasedFieldReference = function getDataForNameBasedFieldReference(data, fieldReferenceStr) {
730
796
  var fields = data.fields,
731
- columns = data.columns;
797
+ columns = data.columns;
798
+
732
799
  var _parseNameBasedFieldR = parseNameBasedFieldReference(fieldReferenceStr),
733
- fieldName = _parseNameBasedFieldR.fieldName,
734
- columnIndex = _parseNameBasedFieldR.columnIndex; // <datasource>.<fieldname>[0]
800
+ fieldName = _parseNameBasedFieldR.fieldName,
801
+ columnIndex = _parseNameBasedFieldR.columnIndex; // <datasource>.<fieldname>[0]
802
+
803
+
735
804
  if (fieldName) {
736
805
  var fieldIndex = findIndex_default()(fields, function (field) {
737
806
  return typeof_default()(field) === 'object' ? field.name === fieldName : field === fieldName;
738
807
  });
808
+
739
809
  if (fieldIndex > -1) {
740
810
  var fieldData;
811
+
741
812
  if (isNumber_default()(columnIndex)) {
742
813
  var isNegativeColumnIndex = columnIndex < 0;
814
+
743
815
  if (isNegativeColumnIndex && columnIndex < -columns[fieldIndex].length || columnIndex >= columns[fieldIndex].length) {
744
816
  // The column index is out of bounds
745
817
  return {};
746
818
  }
819
+
747
820
  var correctColumnIndex = isNegativeColumnIndex ? columns[fieldIndex].length + columnIndex : columnIndex;
748
821
  fieldData = columns[fieldIndex].map(function () {
749
822
  return columns[fieldIndex][correctColumnIndex];
@@ -751,80 +824,100 @@ var Base_getDataForNameBasedFieldReference = function getDataForNameBasedFieldRe
751
824
  } else {
752
825
  fieldData = columns[fieldIndex];
753
826
  }
827
+
754
828
  return {
755
829
  fieldName: fieldName,
756
830
  data: fieldData
757
831
  };
758
- }
759
- // eslint-disable-next-line
832
+ } // eslint-disable-next-line
833
+
834
+
760
835
  console.warn("field '".concat(fieldName, "' not available."));
761
836
  return {};
762
837
  }
838
+
763
839
  return {};
764
840
  };
841
+
765
842
  var Base_getDataForFieldReference = function getDataForFieldReference(dataSources, fieldReference) {
766
843
  var fieldReferenceStr = fieldReference;
767
844
  var formatValue;
845
+
768
846
  if (Array.isArray(fieldReference) && !fieldReference.isDefault) {
769
847
  return fieldReference.map(function (ref) {
770
848
  return getDataForFieldReference(dataSources, ref);
771
849
  });
772
- }
773
- // if the reference is a default and there is multiple default fields to fall back
850
+ } // if the reference is a default and there is multiple default fields to fall back
851
+
852
+
774
853
  if (fieldReference.isDefault && Array.isArray(fieldReference.field)) {
775
854
  // iterate through all defaults and check whether the data type matches the expected type
776
855
  for (var i = 0; i < fieldReference.field.length; i += 1) {
777
856
  fieldReferenceStr = fieldReference.field[i];
778
857
  var dataFromDefault = getDataForFieldReference(dataSources, fieldReferenceStr);
858
+
779
859
  if (Array.isArray(dataFromDefault.data)) {
780
860
  var type = inferDataTypeFromSample(drawSample(dataFromDefault.data));
861
+
781
862
  if (fieldReference.type.indexOf(type) > -1) {
782
863
  return dataFromDefault;
783
864
  }
784
865
  }
785
- }
786
- // if none of the defaults matched the data type use the last default
866
+ } // if none of the defaults matched the data type use the last default
867
+
787
868
  }
788
869
 
789
870
  if (typeof_default()(fieldReference) === 'object') {
790
871
  var field = fieldReference.field;
872
+
791
873
  if (field && !Array.isArray(field)) {
792
874
  fieldReferenceStr = field;
793
875
  }
794
876
  }
877
+
795
878
  var indexBasedRegx = /^[A-Za-z0-9_]+\[.*\].*$/;
796
879
  var nameBasedRegx = /^[A-Za-z0-9_]+\..*$/;
797
880
  var isIndexBasedReference = indexBasedRegx.test(fieldReferenceStr);
798
881
  var isNameBasedReference = nameBasedRegx.test(fieldReferenceStr);
882
+
799
883
  if (!isIndexBasedReference && !isNameBasedReference) {
800
884
  // Unable to parse the encoding. Please verify the encoding format is correct
801
885
  return {};
802
886
  }
887
+
803
888
  var dataSourceType = fieldReferenceStr.match(/^(.*?)(\.|\[)/)[1];
804
889
  var data = getDataForDataSourceType(dataSources, dataSourceType);
805
890
  var fieldData;
891
+
806
892
  if (isIndexBasedReference) {
807
893
  fieldData = Base_getDataForIndexBasedFieldReference(data, fieldReferenceStr);
808
894
  } else {
809
895
  fieldData = Base_getDataForNameBasedFieldReference(data, fieldReferenceStr);
810
896
  }
897
+
811
898
  if (typeof_default()(fieldReference) === 'object') {
812
899
  var format = fieldReference.format;
900
+
813
901
  if (format) {
814
902
  formatValue = getFormatter(fieldData.data, format);
815
903
  }
816
904
  }
905
+
817
906
  if (formatValue && !isEmpty_default()(fieldData)) {
818
907
  return {
819
908
  fieldName: fieldData.fieldName,
820
909
  data: fieldData.data.map(formatValue)
821
910
  };
822
911
  }
912
+
823
913
  return fieldData;
824
914
  };
915
+
825
916
  var Base_mergeEncoding = function mergeEncoding(defaultEncoding) {
826
917
  var userDefinedEncoding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
918
+
827
919
  var mergedEncoding = _objectSpread({}, userDefinedEncoding);
920
+
828
921
  Object.keys(defaultEncoding).forEach(function (key) {
829
922
  if (isEmpty_default()(userDefinedEncoding[key]) && defaultEncoding[key].isRequired && defaultEncoding[key].default) {
830
923
  mergedEncoding[key] = typeof_default()(defaultEncoding[key].default) === 'object' && !Array.isArray(defaultEncoding[key].default) ? _objectSpread(_objectSpread({}, defaultEncoding[key].default), {}, {
@@ -848,25 +941,26 @@ var Base_parse = function parse(dataSources) {
848
941
  }
849
942
  };
850
943
  Object.keys(encoding).forEach(function (key) {
851
- var fieldReference = clone_default()(encoding[key]);
944
+ var fieldReference = clone_default()(encoding[key]); // handle the case for encoding field reference, for example fill: 'encoding.trend'
852
945
 
853
- // handle the case for encoding field reference, for example fill: 'encoding.trend'
854
946
  if (typeof_default()(fieldReference) === 'object' && fieldReference.field && fieldReference.field.indexOf('encoding') === 0) {
855
- var replacedKey = fieldReference.field.split('.')[1];
856
-
857
- // return for the below invalid cases
947
+ var replacedKey = fieldReference.field.split('.')[1]; // return for the below invalid cases
858
948
  // `encoding.z` if `z` is not a valid field in encoding
949
+
859
950
  if (!encoding[replacedKey]) {
860
951
  // eslint-disable-next-line
861
952
  console.warn("".concat(key, " field cannot refer to 'encoding.").concat(replacedKey, "'."));
862
- }
863
- // if `z` is an object configuration in encoding simply extract the field when refering `encoding.z`
953
+ } // if `z` is an object configuration in encoding simply extract the field when refering `encoding.z`
954
+
955
+
864
956
  var field = typeof_default()(encoding[replacedKey]) === 'object' ? encoding[replacedKey].field : encoding[replacedKey];
865
957
  fieldReference = _objectSpread(_objectSpread({}, fieldReference), {}, {
866
958
  field: field
867
959
  });
868
960
  }
961
+
869
962
  var dataForFieldReference = Base_getDataForFieldReference(dataSources, fieldReference);
963
+
870
964
  if (Array.isArray(dataForFieldReference)) {
871
965
  parsedOutput[key] = dataForFieldReference.map(function (entry) {
872
966
  return entry.data;
@@ -875,16 +969,19 @@ var Base_parse = function parse(dataSources) {
875
969
  return entry.fieldName;
876
970
  }); // eslint-disable-line no-underscore-dangle
877
971
  // eslint-disable-next-line no-underscore-dangle
972
+
878
973
  parsedOutput._meta.types[key] = dataForFieldReference.map(function (entry) {
879
974
  return inferDataTypeFromSample(drawSample(entry.data));
880
975
  });
881
976
  } else {
882
977
  var fieldName = dataForFieldReference.fieldName,
883
- data = dataForFieldReference.data;
978
+ data = dataForFieldReference.data;
979
+
884
980
  if (fieldName) {
885
981
  parsedOutput[key] = data;
886
982
  parsedOutput._meta.fieldNames[key] = fieldName; // eslint-disable-line no-underscore-dangle
887
983
  // eslint-disable-next-line no-underscore-dangle
984
+
888
985
  parsedOutput._meta.types[key] = inferDataTypeFromSample(drawSample(data));
889
986
  }
890
987
  }