@elastic/charts
Version:
Elastic-Charts data visualization library
404 lines • 14.9 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.clampAll = exports.inRange = exports.isWithinRange = exports.isBetween = exports.range = exports.roundTo = exports.round = exports.radToDeg = exports.degToRad = exports.VerticalAlignment = exports.HorizontalAlignment = exports.ColorVariant = exports.LayoutDirection = exports.LegendLayout = exports.Position = void 0;
exports.compareByValueAsc = compareByValueAsc;
exports.clamp = clamp;
exports.getColorFromVariant = getColorFromVariant;
exports.htmlIdGenerator = htmlIdGenerator;
exports.getPartialValue = getPartialValue;
exports.getAllKeys = getAllKeys;
exports.isArrayOrSet = isArrayOrSet;
exports.isNil = isNil;
exports.hasPartialObjectToMerge = hasPartialObjectToMerge;
exports.shallowClone = shallowClone;
exports.renderWithProps = renderWithProps;
exports.renderComplexChildren = renderComplexChildren;
exports.mergePartial = mergePartial;
exports.getDistance = getDistance;
exports.stringifyNullsUndefined = stringifyNullsUndefined;
exports.isUniqueArray = isUniqueArray;
exports.sortNumbers = sortNumbers;
exports.isSorted = isSorted;
exports.isRTLString = isRTLString;
exports.hasMostlyRTLItems = hasMostlyRTLItems;
exports.isDefined = isDefined;
exports.isDefinedFrom = isDefinedFrom;
exports.getPercentageValue = getPercentageValue;
exports.keepDistinct = keepDistinct;
exports.toEntries = toEntries;
exports.safeFormat = safeFormat;
exports.getOppositeAlignment = getOppositeAlignment;
exports.isFiniteNumber = isFiniteNumber;
exports.isNonNullablePrimitiveValue = isNonNullablePrimitiveValue;
exports.stripUndefined = stripUndefined;
const react_1 = __importStar(require("react"));
const utility_types_1 = require("utility-types");
const uuid_1 = require("uuid");
const colors_1 = require("../common/colors");
exports.Position = Object.freeze({
Top: 'top',
Bottom: 'bottom',
Left: 'left',
Right: 'right',
});
exports.LegendLayout = Object.freeze({
List: 'list',
Table: 'table',
});
exports.LayoutDirection = Object.freeze({
Horizontal: 'horizontal',
Vertical: 'vertical',
});
exports.ColorVariant = Object.freeze({
Series: '__use__series__color__',
None: '__use__empty__color__',
Adaptive: '__use__adaptive__color__',
});
exports.HorizontalAlignment = Object.freeze({
Center: 'center',
Right: exports.Position.Right,
Left: exports.Position.Left,
Near: 'near',
Far: 'far',
});
exports.VerticalAlignment = Object.freeze({
Middle: 'middle',
Top: exports.Position.Top,
Bottom: exports.Position.Bottom,
Near: 'near',
Far: 'far',
});
function compareByValueAsc(a, b) {
return a > b ? 1 : a < b ? -1 : 0;
}
function clamp(value, lowerBound, upperBound) {
return Math.min(Math.max(value, lowerBound), upperBound);
}
function getColorFromVariant(seriesColor, color) {
if (color === exports.ColorVariant.Series) {
return seriesColor;
}
if (color === exports.ColorVariant.None) {
return colors_1.Colors.Transparent.keyword;
}
return color || seriesColor;
}
const degToRad = (angle) => (angle / 180) * Math.PI;
exports.degToRad = degToRad;
const radToDeg = (radian) => (radian * 180) / Math.PI;
exports.radToDeg = radToDeg;
function htmlIdGenerator(idPrefix) {
const prefix = idPrefix || `i${(0, uuid_1.v1)()}`;
return (suffix) => `${prefix}_${suffix || (0, uuid_1.v1)()}`;
}
function getPartialValue(base, partial, partials = []) {
const partialWithValue = partial !== undefined ? partial : partials.find((v) => v !== undefined);
return partialWithValue !== undefined ? partialWithValue : base;
}
function getAllKeys(object, objects = []) {
return new Set([object, ...objects].filter(Boolean).reduce((keys, obj) => {
if (obj && typeof obj === 'object') {
const newKeys = obj instanceof Map ? obj.keys() : Object.keys(obj);
keys.push(...newKeys);
}
return keys;
}, []));
}
function isArrayOrSet(value) {
return Array.isArray(value) || value instanceof Set;
}
function isNil(value) {
return value === null || value === undefined;
}
function hasPartialObjectToMerge(base, partial, additionalPartials = []) {
if (isArrayOrSet(base)) {
return false;
}
if (typeof base === 'object' && base !== null) {
if (typeof partial === 'object' && !isArrayOrSet(partial) && partial !== null) {
return true;
}
return additionalPartials.some((p) => typeof p === 'object' && !Array.isArray(p));
}
return false;
}
function shallowClone(value) {
if (Array.isArray(value)) {
return [...value];
}
if (value instanceof Set) {
return new Set(value);
}
if (typeof value === 'object' && value !== null) {
if (value instanceof Map) {
return new Map(value.entries());
}
return { ...value };
}
return value;
}
function isReactNode(el) {
return isNil(el) || (0, utility_types_1.isPrimitive)(el) || (0, react_1.isValidElement)(el);
}
function isReactComponent(el) {
return !isReactNode(el);
}
function renderWithProps(El, props) {
return isReactComponent(El) ? react_1.default.createElement(El, props) : El;
}
function renderComplexChildren(children) {
return (() => react_1.default.createElement(react_1.default.Fragment, null, children))();
}
function mergePartial(base, partial, options = {}, additionalPartials = []) {
const baseClone = shallowClone(base);
if (hasPartialObjectToMerge(base, partial, additionalPartials)) {
const mapCondition = !(baseClone instanceof Map) || options.mergeMaps;
const partialKeys = getAllKeys(partial, additionalPartials);
if (partialKeys.size > 0 && (options.mergeOptionalPartialValues ?? true) && mapCondition) {
partialKeys.forEach((key) => {
if (baseClone instanceof Map) {
if (!baseClone.has(key)) {
baseClone.set(key, partial.get(key) !== undefined
? partial.get(key)
: additionalPartials.find((v) => v.get(key) !== undefined) || new Map().get(key));
}
}
else if (!(key in baseClone)) {
baseClone[key] =
partial?.[key] !== undefined
? partial[key]
: (additionalPartials.find((v) => v?.[key] !== undefined) ?? {})[key];
}
});
}
if (baseClone instanceof Map) {
if (options.mergeMaps) {
return [...baseClone.keys()].reduce((newBase, key) => {
const partialValue = partial && partial.get(key);
const partialValues = additionalPartials.map((v) => typeof v === 'object' && v instanceof Map ? v.get(key) : undefined);
const baseValue = base.get(key);
newBase.set(key, mergePartial(baseValue, partialValue, options, partialValues));
return newBase;
}, baseClone);
}
if (partial !== undefined) {
return partial;
}
const additional = additionalPartials.find((p) => p !== undefined);
if (additional) {
return additional;
}
return baseClone;
}
return Object.keys(baseClone).reduce((newBase, key) => {
const partialValue = partial && partial[key];
const partialValues = additionalPartials.map((v) => (typeof v === 'object' ? v[key] : undefined));
const baseValue = base[key];
newBase[key] = mergePartial(baseValue, partialValue, options, partialValues);
return newBase;
}, baseClone);
}
return getPartialValue(baseClone, partial, additionalPartials);
}
function getDistance(a, b) {
return Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2));
}
function stringifyNullsUndefined(value) {
if (value === undefined) {
return 'undefined';
}
if (value === null) {
return 'null';
}
return value;
}
function isUniqueArray(arr, extractor) {
const values = new Set();
return (function isUniqueArrayFn() {
return arr.every((v) => {
const value = extractor ? extractor(v) : v;
if (values.has(value)) {
return false;
}
values.add(value);
return true;
});
})();
}
function sortNumbers(arr, descending = false) {
return arr.slice().sort(descending ? (a, b) => b - a : (a, b) => a - b);
}
function isSorted(arr, options) {
if (arr.length <= 1)
return true;
const ascending = options?.order === 'ascending' ? true : options?.order === 'descending' ? false : arr[0] < arr[1];
const isOrderedPair = options?.allowDuplicates ?? false
? ascending
? (n1 = NaN, n2 = NaN) => n1 <= n2
: (n1 = NaN, n2 = NaN) => n1 >= n2
: ascending
? (n1 = NaN, n2 = NaN) => n1 < n2
: (n1 = NaN, n2 = NaN) => n1 > n2;
for (let i = 0; i < arr.length - 1; i++) {
if (!isOrderedPair(arr[i], arr[i + 1]))
return false;
}
return true;
}
function isRTLString(s, ratio = 0.5) {
const stripped = s.replaceAll(/[\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC]|\s|\d/gi, '');
return stripped.length / s.replaceAll(/\s|\d/gi, '').length < ratio;
}
function hasMostlyRTLItems(items, ratio = 0.5) {
const filteredItems = items.filter(Boolean);
const rtlItemCount = filteredItems.filter((s) => isRTLString(s)).length;
return rtlItemCount / filteredItems.length > ratio;
}
function isDefined(value) {
return value !== null && value !== undefined;
}
function isDefinedFrom(typeCheck) {
return (value) => {
if (value === undefined) {
return false;
}
try {
return typeCheck(value);
}
catch {
return false;
}
};
}
const round = (value, fractionDigits = 0) => {
const precision = Math.pow(10, Math.max(fractionDigits, 0));
const scaledValue = Math.floor(value * precision);
return scaledValue / precision;
};
exports.round = round;
const roundTo = (value, interval, options = {}) => {
const roundedValue = Math[options.type ?? 'round'](value / interval) * interval;
return clamp(roundedValue, options?.min ?? -Infinity, options?.max ?? Infinity);
};
exports.roundTo = roundTo;
function getPercentageValue(ratio, relativeValue, defaultValue) {
if (typeof ratio === 'number') {
return Math.abs(ratio);
}
const ratioStr = ratio.trim();
if (/\d+%$/.test(ratioStr)) {
const percentage = Math.abs(Number.parseInt(ratioStr.slice(0, -1), 10));
return relativeValue * (percentage / 100);
}
const num = Number.parseFloat(ratioStr);
return Number.isFinite(num) ? Math.abs(num) : defaultValue;
}
function keepDistinct(d, i, a) {
return a.indexOf(d) === i;
}
function toEntries(array, accessor, staticValue) {
return array.reduce((acc, curr) => {
acc[curr[accessor]] = staticValue;
return acc;
}, {});
}
function safeFormat(value, formatter) {
if (formatter) {
try {
return formatter(value);
}
catch {
}
}
return `${value}`;
}
const range = (from, to, step) => Array.from({ length: Math.abs(Math.round((to - from) / (step || 1))) }, (_, i) => from + i * step);
exports.range = range;
const oppositeAlignmentMap = {
[exports.HorizontalAlignment.Left]: exports.HorizontalAlignment.Right,
[exports.HorizontalAlignment.Right]: exports.HorizontalAlignment.Left,
[exports.VerticalAlignment.Top]: exports.VerticalAlignment.Bottom,
[exports.VerticalAlignment.Bottom]: exports.VerticalAlignment.Top,
};
function getOppositeAlignment(alignment) {
return oppositeAlignmentMap[alignment] ?? alignment;
}
function isFiniteNumber(value) {
return Number.isFinite(value);
}
function isNonNullablePrimitiveValue(value) {
return typeof value === 'string' || typeof value === 'number';
}
function stripUndefined(source) {
return Object.keys(source).reduce((acc, key) => {
const val = source[key];
if (val !== undefined) {
acc[key] = val;
}
return acc;
}, {});
}
const isBetween = (min, max, exclusive = false) => exclusive ? (n) => n < max && n > min : (n) => n <= max && n >= min;
exports.isBetween = isBetween;
const isWithinRange = (r, exclusive = false) => {
const [min, max] = sortNumbers(r);
return (0, exports.isBetween)(min, max, exclusive);
};
exports.isWithinRange = isWithinRange;
const inRange = (start, end, exclusive = false) => {
const diff = Math.abs(start - end);
const [min, max] = sortNumbers([start, end]);
const isHalfFromMin = (0, exports.isBetween)(min, max - diff / 2, exclusive);
const isHalfFromMax = (0, exports.isBetween)(min + diff / 2, max, exclusive);
const isWithin = (0, exports.isBetween)(min, max, exclusive);
return {
firstHalf: (n) => {
return start === min ? isHalfFromMin(n) : isHalfFromMax(n);
},
lastHalf: (n) => {
return end === max ? isHalfFromMax(n) : isHalfFromMin(n);
},
within: (n) => {
return isWithin(n);
},
};
};
exports.inRange = inRange;
const clampAll = (min, max) => {
const seen = new Set();
return [
(acc, n) => {
const clampValue = clamp(n, min, max);
if (!seen.has(clampValue))
acc.push(clampValue);
seen.add(clampValue);
return acc;
},
[],
];
};
exports.clampAll = clampAll;
//# sourceMappingURL=common.js.map