123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533 |
- function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
- function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
- function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }
- function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
- function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
- // Utilities
- import { capitalize, Comment, computed, Fragment, isVNode, reactive, readonly, shallowRef, toRefs, unref, watchEffect } from 'vue';
- import { IN_BROWSER } from "./globals.mjs"; // Types
- export function getNestedValue(obj, path, fallback) {
- const last = path.length - 1;
- if (last < 0) return obj === undefined ? fallback : obj;
- for (let i = 0; i < last; i++) {
- if (obj == null) {
- return fallback;
- }
- obj = obj[path[i]];
- }
- if (obj == null) return fallback;
- return obj[path[last]] === undefined ? fallback : obj[path[last]];
- }
- export function deepEqual(a, b) {
- if (a === b) return true;
- if (a instanceof Date && b instanceof Date && a.getTime() !== b.getTime()) {
- // If the values are Date, compare them as timestamps
- return false;
- }
- if (a !== Object(a) || b !== Object(b)) {
- // If the values aren't objects, they were already checked for equality
- return false;
- }
- const props = Object.keys(a);
- if (props.length !== Object.keys(b).length) {
- // Different number of props, don't bother to check
- return false;
- }
- return props.every(p => deepEqual(a[p], b[p]));
- }
- export function getObjectValueByPath(obj, path, fallback) {
- // credit: http://stackoverflow.com/questions/6491463/accessing-nested-javascript-objects-with-string-key#comment55278413_6491621
- if (obj == null || !path || typeof path !== 'string') return fallback;
- if (obj[path] !== undefined) return obj[path];
- path = path.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
- path = path.replace(/^\./, ''); // strip a leading dot
- return getNestedValue(obj, path.split('.'), fallback);
- }
- export function getPropertyFromItem(item, property, fallback) {
- if (property === true) return item === undefined ? fallback : item;
- if (property == null || typeof property === 'boolean') return fallback;
- if (item !== Object(item)) {
- if (typeof property !== 'function') return fallback;
- const value = property(item, fallback);
- return typeof value === 'undefined' ? fallback : value;
- }
- if (typeof property === 'string') return getObjectValueByPath(item, property, fallback);
- if (Array.isArray(property)) return getNestedValue(item, property, fallback);
- if (typeof property !== 'function') return fallback;
- const value = property(item, fallback);
- return typeof value === 'undefined' ? fallback : value;
- }
- export function createRange(length) {
- let start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
- return Array.from({
- length
- }, (v, k) => start + k);
- }
- export function getZIndex(el) {
- if (!el || el.nodeType !== Node.ELEMENT_NODE) return 0;
- const index = +window.getComputedStyle(el).getPropertyValue('z-index');
- if (!index) return getZIndex(el.parentNode);
- return index;
- }
- export function convertToUnit(str) {
- let unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'px';
- if (str == null || str === '') {
- return undefined;
- } else if (isNaN(+str)) {
- return String(str);
- } else if (!isFinite(+str)) {
- return undefined;
- } else {
- return `${Number(str)}${unit}`;
- }
- }
- export function isObject(obj) {
- return obj !== null && typeof obj === 'object' && !Array.isArray(obj);
- }
- export function isPlainObject(obj) {
- let proto;
- return obj !== null && typeof obj === 'object' && ((proto = Object.getPrototypeOf(obj)) === Object.prototype || proto === null);
- }
- export function refElement(obj) {
- if (obj && '$el' in obj) {
- const el = obj.$el;
- if (el?.nodeType === Node.TEXT_NODE) {
- // Multi-root component, use the first element
- return el.nextElementSibling;
- }
- return el;
- }
- return obj;
- }
- // KeyboardEvent.keyCode aliases
- export const keyCodes = Object.freeze({
- enter: 13,
- tab: 9,
- delete: 46,
- esc: 27,
- space: 32,
- up: 38,
- down: 40,
- left: 37,
- right: 39,
- end: 35,
- home: 36,
- del: 46,
- backspace: 8,
- insert: 45,
- pageup: 33,
- pagedown: 34,
- shift: 16
- });
- export const keyValues = Object.freeze({
- enter: 'Enter',
- tab: 'Tab',
- delete: 'Delete',
- esc: 'Escape',
- space: 'Space',
- up: 'ArrowUp',
- down: 'ArrowDown',
- left: 'ArrowLeft',
- right: 'ArrowRight',
- end: 'End',
- home: 'Home',
- del: 'Delete',
- backspace: 'Backspace',
- insert: 'Insert',
- pageup: 'PageUp',
- pagedown: 'PageDown',
- shift: 'Shift'
- });
- export function keys(o) {
- return Object.keys(o);
- }
- export function has(obj, key) {
- return key.every(k => obj.hasOwnProperty(k));
- }
- // Array of keys
- export function pick(obj, paths) {
- const found = {};
- const keys = new Set(Object.keys(obj));
- for (const path of paths) {
- if (keys.has(path)) {
- found[path] = obj[path];
- }
- }
- return found;
- }
- // Array of keys
- // Array of keys or RegExp to test keys against
- export function pickWithRest(obj, paths, exclude) {
- const found = Object.create(null);
- const rest = Object.create(null);
- for (const key in obj) {
- if (paths.some(path => path instanceof RegExp ? path.test(key) : path === key) && !exclude?.some(path => path === key)) {
- found[key] = obj[key];
- } else {
- rest[key] = obj[key];
- }
- }
- return [found, rest];
- }
- export function omit(obj, exclude) {
- const clone = {
- ...obj
- };
- exclude.forEach(prop => delete clone[prop]);
- return clone;
- }
- export function only(obj, include) {
- const clone = {};
- include.forEach(prop => clone[prop] = obj[prop]);
- return clone;
- }
- const onRE = /^on[^a-z]/;
- export const isOn = key => onRE.test(key);
- const bubblingEvents = ['onAfterscriptexecute', 'onAnimationcancel', 'onAnimationend', 'onAnimationiteration', 'onAnimationstart', 'onAuxclick', 'onBeforeinput', 'onBeforescriptexecute', 'onChange', 'onClick', 'onCompositionend', 'onCompositionstart', 'onCompositionupdate', 'onContextmenu', 'onCopy', 'onCut', 'onDblclick', 'onFocusin', 'onFocusout', 'onFullscreenchange', 'onFullscreenerror', 'onGesturechange', 'onGestureend', 'onGesturestart', 'onGotpointercapture', 'onInput', 'onKeydown', 'onKeypress', 'onKeyup', 'onLostpointercapture', 'onMousedown', 'onMousemove', 'onMouseout', 'onMouseover', 'onMouseup', 'onMousewheel', 'onPaste', 'onPointercancel', 'onPointerdown', 'onPointerenter', 'onPointerleave', 'onPointermove', 'onPointerout', 'onPointerover', 'onPointerup', 'onReset', 'onSelect', 'onSubmit', 'onTouchcancel', 'onTouchend', 'onTouchmove', 'onTouchstart', 'onTransitioncancel', 'onTransitionend', 'onTransitionrun', 'onTransitionstart', 'onWheel'];
- const compositionIgnoreKeys = ['ArrowUp', 'ArrowDown', 'ArrowRight', 'ArrowLeft', 'Enter', 'Escape', 'Tab', ' '];
- export function isComposingIgnoreKey(e) {
- return e.isComposing && compositionIgnoreKeys.includes(e.key);
- }
- /**
- * Filter attributes that should be applied to
- * the root element of an input component. Remaining
- * attributes should be passed to the <input> element inside.
- */
- export function filterInputAttrs(attrs) {
- const [events, props] = pickWithRest(attrs, [onRE]);
- const inputEvents = omit(events, bubblingEvents);
- const [rootAttrs, inputAttrs] = pickWithRest(props, ['class', 'style', 'id', /^data-/]);
- Object.assign(rootAttrs, events);
- Object.assign(inputAttrs, inputEvents);
- return [rootAttrs, inputAttrs];
- }
- /**
- * Returns the set difference of B and A, i.e. the set of elements in B but not in A
- */
- export function arrayDiff(a, b) {
- const diff = [];
- for (let i = 0; i < b.length; i++) {
- if (!a.includes(b[i])) diff.push(b[i]);
- }
- return diff;
- }
- export function wrapInArray(v) {
- return v == null ? [] : Array.isArray(v) ? v : [v];
- }
- export function defaultFilter(value, search, item) {
- return value != null && search != null && typeof value !== 'boolean' && value.toString().toLocaleLowerCase().indexOf(search.toLocaleLowerCase()) !== -1;
- }
- export function debounce(fn, delay) {
- let timeoutId = 0;
- const wrap = function () {
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
- args[_key] = arguments[_key];
- }
- clearTimeout(timeoutId);
- timeoutId = setTimeout(() => fn(...args), unref(delay));
- };
- wrap.clear = () => {
- clearTimeout(timeoutId);
- };
- wrap.immediate = fn;
- return wrap;
- }
- export function throttle(fn, limit) {
- let throttling = false;
- return function () {
- if (!throttling) {
- throttling = true;
- setTimeout(() => throttling = false, limit);
- return fn(...arguments);
- }
- };
- }
- export function clamp(value) {
- let min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
- let max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
- return Math.max(min, Math.min(max, value));
- }
- export function getDecimals(value) {
- const trimmedStr = value.toString().trim();
- return trimmedStr.includes('.') ? trimmedStr.length - trimmedStr.indexOf('.') - 1 : 0;
- }
- export function padEnd(str, length) {
- let char = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '0';
- return str + char.repeat(Math.max(0, length - str.length));
- }
- export function padStart(str, length) {
- let char = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '0';
- return char.repeat(Math.max(0, length - str.length)) + str;
- }
- export function chunk(str) {
- let size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
- const chunked = [];
- let index = 0;
- while (index < str.length) {
- chunked.push(str.substr(index, size));
- index += size;
- }
- return chunked;
- }
- export function chunkArray(array) {
- let size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
- return Array.from({
- length: Math.ceil(array.length / size)
- }, (v, i) => array.slice(i * size, i * size + size));
- }
- export function humanReadableFileSize(bytes) {
- let base = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;
- if (bytes < base) {
- return `${bytes} B`;
- }
- const prefix = base === 1024 ? ['Ki', 'Mi', 'Gi'] : ['k', 'M', 'G'];
- let unit = -1;
- while (Math.abs(bytes) >= base && unit < prefix.length - 1) {
- bytes /= base;
- ++unit;
- }
- return `${bytes.toFixed(1)} ${prefix[unit]}B`;
- }
- export function mergeDeep() {
- let source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- let target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- let arrayFn = arguments.length > 2 ? arguments[2] : undefined;
- const out = {};
- for (const key in source) {
- out[key] = source[key];
- }
- for (const key in target) {
- const sourceProperty = source[key];
- const targetProperty = target[key];
- // Only continue deep merging if
- // both properties are plain objects
- if (isPlainObject(sourceProperty) && isPlainObject(targetProperty)) {
- out[key] = mergeDeep(sourceProperty, targetProperty, arrayFn);
- continue;
- }
- if (arrayFn && Array.isArray(sourceProperty) && Array.isArray(targetProperty)) {
- out[key] = arrayFn(sourceProperty, targetProperty);
- continue;
- }
- out[key] = targetProperty;
- }
- return out;
- }
- export function flattenFragments(nodes) {
- return nodes.map(node => {
- if (node.type === Fragment) {
- return flattenFragments(node.children);
- } else {
- return node;
- }
- }).flat();
- }
- export function toKebabCase() {
- let str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
- if (toKebabCase.cache.has(str)) return toKebabCase.cache.get(str);
- const kebab = str.replace(/[^a-z]/gi, '-').replace(/\B([A-Z])/g, '-$1').toLowerCase();
- toKebabCase.cache.set(str, kebab);
- return kebab;
- }
- toKebabCase.cache = new Map();
- export function findChildrenWithProvide(key, vnode) {
- if (!vnode || typeof vnode !== 'object') return [];
- if (Array.isArray(vnode)) {
- return vnode.map(child => findChildrenWithProvide(key, child)).flat(1);
- } else if (vnode.suspense) {
- return findChildrenWithProvide(key, vnode.ssContent);
- } else if (Array.isArray(vnode.children)) {
- return vnode.children.map(child => findChildrenWithProvide(key, child)).flat(1);
- } else if (vnode.component) {
- if (Object.getOwnPropertySymbols(vnode.component.provides).includes(key)) {
- return [vnode.component];
- } else if (vnode.component.subTree) {
- return findChildrenWithProvide(key, vnode.component.subTree).flat(1);
- }
- }
- return [];
- }
- var _arr = /*#__PURE__*/new WeakMap();
- var _pointer = /*#__PURE__*/new WeakMap();
- export class CircularBuffer {
- constructor(size) {
- _classPrivateFieldInitSpec(this, _arr, []);
- _classPrivateFieldInitSpec(this, _pointer, 0);
- this.size = size;
- }
- push(val) {
- _classPrivateFieldGet(_arr, this)[_classPrivateFieldGet(_pointer, this)] = val;
- _classPrivateFieldSet(_pointer, this, (_classPrivateFieldGet(_pointer, this) + 1) % this.size);
- }
- values() {
- return _classPrivateFieldGet(_arr, this).slice(_classPrivateFieldGet(_pointer, this)).concat(_classPrivateFieldGet(_arr, this).slice(0, _classPrivateFieldGet(_pointer, this)));
- }
- }
- export function getEventCoordinates(e) {
- if ('touches' in e) {
- return {
- clientX: e.touches[0].clientX,
- clientY: e.touches[0].clientY
- };
- }
- return {
- clientX: e.clientX,
- clientY: e.clientY
- };
- }
- // Only allow a single return type
- /**
- * Convert a computed ref to a record of refs.
- * The getter function must always return an object with the same keys.
- */
- export function destructComputed(getter) {
- const refs = reactive({});
- const base = computed(getter);
- watchEffect(() => {
- for (const key in base.value) {
- refs[key] = base.value[key];
- }
- }, {
- flush: 'sync'
- });
- return toRefs(refs);
- }
- /** Array.includes but value can be any type */
- export function includes(arr, val) {
- return arr.includes(val);
- }
- export function eventName(propName) {
- return propName[2].toLowerCase() + propName.slice(3);
- }
- export const EventProp = () => [Function, Array];
- export function hasEvent(props, name) {
- name = 'on' + capitalize(name);
- return !!(props[name] || props[`${name}Once`] || props[`${name}Capture`] || props[`${name}OnceCapture`] || props[`${name}CaptureOnce`]);
- }
- export function callEvent(handler) {
- for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
- args[_key2 - 1] = arguments[_key2];
- }
- if (Array.isArray(handler)) {
- for (const h of handler) {
- h(...args);
- }
- } else if (typeof handler === 'function') {
- handler(...args);
- }
- }
- export function focusableChildren(el) {
- let filterByTabIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- const targets = ['button', '[href]', 'input:not([type="hidden"])', 'select', 'textarea', '[tabindex]'].map(s => `${s}${filterByTabIndex ? ':not([tabindex="-1"])' : ''}:not([disabled])`).join(', ');
- return [...el.querySelectorAll(targets)];
- }
- export function getNextElement(elements, location, condition) {
- let _el;
- let idx = elements.indexOf(document.activeElement);
- const inc = location === 'next' ? 1 : -1;
- do {
- idx += inc;
- _el = elements[idx];
- } while ((!_el || _el.offsetParent == null || !(condition?.(_el) ?? true)) && idx < elements.length && idx >= 0);
- return _el;
- }
- export function focusChild(el, location) {
- const focusable = focusableChildren(el);
- if (!location) {
- if (el === document.activeElement || !el.contains(document.activeElement)) {
- focusable[0]?.focus();
- }
- } else if (location === 'first') {
- focusable[0]?.focus();
- } else if (location === 'last') {
- focusable.at(-1)?.focus();
- } else if (typeof location === 'number') {
- focusable[location]?.focus();
- } else {
- const _el = getNextElement(focusable, location);
- if (_el) _el.focus();else focusChild(el, location === 'next' ? 'first' : 'last');
- }
- }
- export function isEmpty(val) {
- return val === null || val === undefined || typeof val === 'string' && val.trim() === '';
- }
- export function noop() {}
- /** Returns null if the selector is not supported or we can't check */
- export function matchesSelector(el, selector) {
- const supportsSelector = IN_BROWSER && typeof CSS !== 'undefined' && typeof CSS.supports !== 'undefined' && CSS.supports(`selector(${selector})`);
- if (!supportsSelector) return null;
- try {
- return !!el && el.matches(selector);
- } catch (err) {
- return null;
- }
- }
- export function ensureValidVNode(vnodes) {
- return vnodes.some(child => {
- if (!isVNode(child)) return true;
- if (child.type === Comment) return false;
- return child.type !== Fragment || ensureValidVNode(child.children);
- }) ? vnodes : null;
- }
- export function defer(timeout, cb) {
- if (!IN_BROWSER || timeout === 0) {
- cb();
- return () => {};
- }
- const timeoutId = window.setTimeout(cb, timeout);
- return () => window.clearTimeout(timeoutId);
- }
- export function eagerComputed(fn, options) {
- const result = shallowRef();
- watchEffect(() => {
- result.value = fn();
- }, {
- flush: 'sync',
- ...options
- });
- return readonly(result);
- }
- export function isClickInsideElement(event, targetDiv) {
- const mouseX = event.clientX;
- const mouseY = event.clientY;
- const divRect = targetDiv.getBoundingClientRect();
- const divLeft = divRect.left;
- const divTop = divRect.top;
- const divRight = divRect.right;
- const divBottom = divRect.bottom;
- return mouseX >= divLeft && mouseX <= divRight && mouseY >= divTop && mouseY <= divBottom;
- }
- export function templateRef() {
- const el = shallowRef();
- const fn = target => {
- el.value = target;
- };
- Object.defineProperty(fn, 'value', {
- enumerable: true,
- get: () => el.value,
- set: val => el.value = val
- });
- Object.defineProperty(fn, 'el', {
- enumerable: true,
- get: () => refElement(el.value)
- });
- return fn;
- }
- export function checkPrintable(e) {
- const isPrintableChar = e.key.length === 1;
- const noModifier = !e.ctrlKey && !e.metaKey && !e.altKey;
- return isPrintableChar && noModifier;
- }
- //# sourceMappingURL=helpers.mjs.map
|