@infinite-table/infinite-react
Version:
Infinite Table for React
1,824 lines (1,790 loc) • 1.08 MB
JavaScript
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
// node_modules/binary-search/index.js
var require_binary_search = __commonJS({
"node_modules/binary-search/index.js"(exports, module) {
"use strict";
module.exports = function(haystack, needle, comparator, low, high) {
var mid, cmp;
if (low === void 0)
low = 0;
else {
low = low | 0;
if (low < 0 || low >= haystack.length)
throw new RangeError("invalid lower bound");
}
if (high === void 0)
high = haystack.length - 1;
else {
high = high | 0;
if (high < low || high >= haystack.length)
throw new RangeError("invalid upper bound");
}
while (low <= high) {
mid = low + (high - low >>> 1);
cmp = +comparator(haystack[mid], needle, mid, haystack);
if (cmp < 0)
low = mid + 1;
else if (cmp > 0)
high = mid - 1;
else
return mid;
}
return ~low;
};
}
});
// src/components/utils/debounce.ts
function debounce(fn, { wait }) {
let timeout = null;
return function(...args) {
const context = this;
if (timeout !== null) {
clearTimeout(timeout);
}
timeout = setTimeout(() => {
fn.apply(context, args);
}, wait);
};
}
// src/components/InfiniteTable/index.tsx
import * as React78 from "react";
// src/utils/join.ts
var join = (...args) => args.filter((x) => !!`${x}`).join(" ");
// src/components/CSSNumericVariableWatch.tsx
import * as React2 from "react";
import { useRef as useRef2 } from "react";
// src/components/utils/buildSubscriptionCallback.tsx
function buildSubscriptionCallback(withRaf = false) {
let lastCallValue = null;
let fns = [];
let rafId = null;
const updater = (items, callback) => {
const results = [];
if (withRaf) {
if (rafId != null) {
cancelAnimationFrame(rafId);
rafId = null;
}
requestAnimationFrame(() => {
lastCallValue = items;
rafId = null;
for (let i = 0, len = fns.length; i < len; i++) {
results.push(fns[i](items));
}
callback?.(results);
});
} else {
lastCallValue = items;
for (let i = 0, len = fns.length; i < len; i++) {
results.push(fns[i](items));
}
callback?.(results);
}
};
updater.get = () => lastCallValue;
updater.onChange = (fn) => {
fns.push(fn);
return () => {
fns = fns.filter((f) => f !== fn);
};
};
updater.destroy = () => {
updater(null);
fns.length = 0;
};
updater.getListenersCount = () => fns.length;
return updater;
}
// src/utils/DeepMap/once.ts
function once(fn) {
let called = false;
let result = null;
const onceFn = (...args) => {
if (called) {
return result;
}
called = true;
result = fn(...args);
return result;
};
return onceFn;
}
// src/utils/DeepMap/sortAscending.ts
var sortAscending = (a, b) => a - b;
// src/utils/DeepMap/index.ts
var SORT_ASC_REVISION = (p1, p2) => sortAscending(p1.revision, p2.revision);
var DeepMap = class _DeepMap {
constructor(initial) {
this.map = /* @__PURE__ */ new Map();
this.length = 0;
this.revision = 0;
this.emptyKey = Symbol("emptyKey");
this.visit = (fn) => {
this.map.forEach((_, k) => this.visitKey(k, this.map, [], fn, false));
};
this.visitSome = (fn) => {
this.visitWithNext([], fn, true);
};
this.visitDepthFirst = (fn) => {
this.visitWithNext([], fn, false);
};
this.visitWithNext = (parentKeys, fn, earlyReturn, currentMap = this.map, depthLimit, skipSelfValue) => {
if (!currentMap) {
return;
}
let i = 0;
const hasEmptyKey = currentMap.has(this.emptyKey);
let allowEmptyKey = skipSelfValue ? false : true;
if (depthLimit !== void 0) {
if (depthLimit < 0) {
return;
}
depthLimit--;
}
const iterator = (_, key) => {
const pair = currentMap.get(key);
if (!pair) {
return;
}
const { map: map2 } = pair;
const isEmptyKey = key === this.emptyKey;
if (isEmptyKey && !allowEmptyKey) {
return;
}
const keys = isEmptyKey ? [] : [...parentKeys, key];
let next = map2 ? () => this.visitWithNext(
keys,
fn,
earlyReturn,
map2,
depthLimit !== void 0 ? depthLimit - 1 : void 0
) : void 0;
if (pair.hasOwnProperty("value")) {
const res = fn(pair.value, keys, i, next, pair);
if (earlyReturn && res === true) {
return true;
}
i++;
} else {
next?.();
}
return;
};
if (hasEmptyKey) {
iterator(void 0, this.emptyKey);
allowEmptyKey = false;
i = 0;
}
for (const [key, pair] of currentMap) {
const res = iterator(pair, key);
if (earlyReturn && res === true) {
return res;
}
}
return;
};
this.fill(initial);
}
static clone(map2) {
const clone = new _DeepMap();
map2.visit((pair, keys) => {
clone.set(keys, pair.value);
});
return clone;
}
fill(initial) {
if (initial) {
initial.forEach((entry) => {
const [keys, value] = entry;
this.set(keys, value);
});
}
}
getValuesStartingWith(keys, options) {
const result = [];
this.getStartingWith(
keys,
(_keys, value) => {
result.push(value);
},
options
);
return result;
}
getEntriesStartingWith(keys, options) {
const result = [];
this.getStartingWith(
keys,
(keys2, value) => {
result.push([keys2, value]);
},
options
);
return result;
}
getLeafNodesStartingWith(keys, withPair, options) {
const { respectOrder = false } = options || {};
const pairs = [];
const result = [];
this.getStartingWith(
keys,
(_keys, _value, pair) => {
if (!pair.map && pair.hasOwnProperty("value")) {
if (respectOrder) {
pairs.push(pair);
} else {
result.push(withPair(pair));
}
}
},
options
);
if (respectOrder) {
return pairs.sort(SORT_ASC_REVISION).map(withPair);
}
return result;
}
getKeysForLeafNodesStartingWith(keys, options) {
return this.getLeafNodesStartingWith(keys, (pair) => pair.keys, options);
}
getKeysAndValuesForLeafNodesStartingWith(keys, options) {
return this.getLeafNodesStartingWith(
keys,
(pair) => [pair.keys, pair.value],
options
);
}
/**
* @param keys - the keys of the node to start from
* @param excludeSelf - whether to exclude the start node
* @param depthLimit - the depth limit
* @returns the keys of the first child on each branch (starting from the node with the given keys)
*/
getKeysOfFirstChildOnEachBranchStartingWith(keys, options) {
const { excludeSelf, depthLimit, respectOrder = true } = options || {};
const pairs = [];
const result = [];
const fn = (pair2) => {
if (respectOrder) {
pairs.push(pair2);
} else {
result.push(pair2.keys);
}
};
let currentMap = this.map;
let pair;
let stop = false;
if (keys.length) {
for (let i = 0, len = keys.length; i < len; i++) {
const key = keys[i];
pair = currentMap.get(key);
if (!pair || !pair.map) {
stop = true;
if (i === len - 1) {
stop = true;
break;
} else {
return [];
}
}
currentMap = pair.map;
}
} else {
if (!excludeSelf) {
const hasEmptyKey = currentMap.has(this.emptyKey);
if (hasEmptyKey) {
return [[]];
}
}
}
if (pair && pair.value !== void 0) {
if (!excludeSelf) {
fn({ ...pair, keys });
stop = true;
}
}
if (stop) {
if (respectOrder) {
return pairs.sort(SORT_ASC_REVISION).map((pair2) => pair2.keys);
}
return result;
}
this.visitWithNext(
keys,
(_value, keys2, _i, _next, pair2) => {
fn({ ...pair2, keys: keys2 });
},
false,
currentMap,
depthLimit,
excludeSelf
);
if (respectOrder) {
return pairs.sort(SORT_ASC_REVISION).map((pair2) => pair2.keys);
}
return result;
}
getKeysStartingWith(keys, options) {
const result = [];
this.getStartingWith(
keys,
(keys2) => {
result.push(keys2);
},
options
);
return result;
}
getStartingWith(keys, fn, options) {
const { excludeSelf, depthLimit } = options || {};
let currentMap = this.map;
let pair;
let stop = false;
if (keys.length) {
for (let i = 0, len = keys.length; i < len; i++) {
const key = keys[i];
pair = currentMap.get(key);
if (!pair || !pair.map) {
stop = true;
if (i === len - 1) {
stop = true;
break;
} else {
return;
}
}
currentMap = pair.map;
}
}
if (pair && pair.value !== void 0) {
if (!excludeSelf) {
fn(keys, pair.value, { ...pair, keys });
}
}
if (stop) {
return;
}
this.visitWithNext(
keys,
(value, keys2, _i, next, pair2) => {
fn(keys2, value, { ...pair2, keys: keys2 });
next?.();
},
false,
currentMap,
depthLimit,
excludeSelf
);
}
getMapAt(keys) {
let currentMap = this.map;
let pair;
if (!keys.length) {
return this.map;
}
for (let i = 0, len = keys.length; i < len; i++) {
const key = keys[i];
pair = currentMap.get(key);
if (!pair || !pair.map) {
return void 0;
}
currentMap = pair.map;
}
return currentMap;
}
getAllChildrenSizeFor(keys) {
let currentMap = this.map;
let pair;
if (!keys.length) {
return this.length;
}
for (let i = 0, len = keys.length; i < len; i++) {
const key = keys[i];
pair = currentMap.get(key);
if (!pair || !pair.map) {
return 0;
}
currentMap = pair.map;
}
return pair.length;
}
getDirectChildrenSizeFor(keys) {
let currentMap = this.map;
if (!keys.length) {
keys = [this.emptyKey];
}
for (let i = 0, len = keys.length; i < len; i++) {
const key = keys[i];
const last = i === len - 1;
const pair = currentMap.get(key);
if (!pair || !pair.map) {
return 0;
}
currentMap = pair.map;
if (last) {
return currentMap?.size ?? 0;
}
}
return 0;
}
set(keys, value) {
let currentMap = this.map;
if (!keys.length) {
keys = [this.emptyKey];
}
for (let i = 0, len = keys.length; i < len; i++) {
const key = keys[i];
const last = i === len - 1;
const pair = currentMap.get(key) || {
length: 0
};
if (last) {
pair.revision = this.revision++;
pair.value = value;
currentMap.set(key, pair);
this.length++;
} else {
if (!pair.map) {
pair.map = /* @__PURE__ */ new Map();
currentMap.set(key, pair);
}
pair.length++;
currentMap = pair.map;
}
}
return this;
}
get(keys) {
let currentMap = this.map;
if (!keys.length) {
keys = [this.emptyKey];
}
for (let i = 0, len = keys.length; i < len; i++) {
const key = keys[i];
const last = i === len - 1;
const pair = currentMap.get(key);
if (last) {
return pair ? pair.value : void 0;
} else {
if (!pair || !pair.map) {
return;
}
currentMap = pair.map;
}
}
return;
}
get size() {
return this.length;
}
clear() {
const clearMap = (map2) => {
map2.forEach((value, _key) => {
const { map: map3 } = value;
if (map3) {
clearMap(map3);
}
});
map2.clear();
};
clearMap(this.map);
this.length = 0;
this.revision = 0;
}
delete(keys) {
let currentMap = this.map;
if (!keys.length) {
keys = [this.emptyKey];
} else {
keys = [...keys];
}
const maps = [currentMap];
const pairs = [];
let result = false;
for (let i = 0, len = keys.length; i < len; i++) {
const key = keys[i];
const last = i === len - 1;
const pair = currentMap.get(key);
if (last) {
if (pair) {
if (pair.hasOwnProperty("value")) {
delete pair.value;
delete pair.revision;
result = true;
pairs.forEach((pair2) => {
pair2.length--;
});
this.length--;
}
if (pair.map && pair.map.size === 0) {
delete pair.map;
}
if (!pair.map) {
currentMap.delete(key);
}
}
break;
} else {
if (!pair || !pair.map) {
result = false;
break;
}
pairs.push(pair);
currentMap = pair.map;
maps.push(currentMap);
}
}
while (maps.length) {
const map2 = maps.pop();
const keysLen = keys.length;
keys.pop();
if (keysLen > 0 && map2?.size === 0) {
const parentMap = maps[maps.length - 1];
const parentKey = keys[keys.length - 1];
const pair = parentMap?.get(parentKey);
if (pair) {
delete pair.map;
if (!pair.hasOwnProperty("value")) {
parentMap.delete(parentKey);
}
}
}
}
return result;
}
has(keys) {
let currentMap = this.map;
if (!keys.length) {
keys = [this.emptyKey];
}
for (let i = 0, len = keys.length; i < len; i++) {
const key = keys[i];
const last = i === len - 1;
const pair = currentMap.get(key);
if (last) {
return pair ? pair.hasOwnProperty("value") : false;
} else {
if (!pair || !pair.map) {
return false;
}
currentMap = pair.map;
}
}
return false;
}
visitKey(key, currentMap, parentKeys, fn, earlyReturn) {
const pair = currentMap.get(key);
if (!pair) {
return;
}
const { map: map2 } = pair;
const keys = key === this.emptyKey ? [] : [...parentKeys, key];
const next = once(() => {
if (map2) {
for (const [k] of map2) {
const res = this.visitKey(k, map2, keys, fn, earlyReturn);
if (earlyReturn && res === true) {
return true;
}
}
}
return false;
});
if (pair.hasOwnProperty("value")) {
const res = fn(pair, keys, next);
if (earlyReturn && res === true) {
return true;
}
}
next();
return;
}
getArray(fn) {
const result = [];
this.visit((pair, keys) => {
const res = fn({ ...pair, keys });
if (keys.length === 0) {
result.splice(0, 0, res);
} else {
result.push(res);
}
});
return result;
}
rawKeysAt(keys) {
const map2 = this.getMapAt(keys);
if (!map2) {
return [];
}
return [...map2.keys()];
}
valuesAt(keys) {
const map2 = this.getMapAt(keys);
if (!map2) {
return [];
}
const result = [];
map2.forEach((bag) => {
if (bag.value !== void 0) {
result.push(bag.value);
}
});
return result;
}
values() {
return this.sortedIterator((pair) => pair.value);
}
keys() {
const keys = this.sortedIterator((pair) => pair.keys);
return keys;
}
entries() {
return this.sortedIterator((pair) => [
pair.keys,
pair.value
]);
}
topDownEntries() {
return this.getArray((pair) => [
pair.keys,
pair.value
]);
}
topDownKeys() {
return this.getArray((pair) => pair.keys);
}
topDownValues() {
return this.getArray((pair) => pair.value);
}
sortedIterator(fn) {
const result = [];
this.visit((pair, keys) => {
result.push({ ...pair, keys });
});
result.sort(SORT_ASC_REVISION);
function* makeIterator() {
for (let i = 0, len = result.length; i < len; i++) {
yield fn(result[i]);
}
}
return makeIterator();
}
// private iterator<ReturnType>(
// fn: (pair: Pair<KeyType, ValueType> & { keys: KeyType[] }) => ReturnType,
// ) {
// const result: (Pair<KeyType, ValueType> & { keys: KeyType[] })[] = [];
// this.visit((pair, keys) => {
// result.push({ ...pair, keys });
// });
// function* makeIterator() {
// for (let i = 0, len = result.length; i < len; i++) {
// yield fn(result[i]);
// }
// }
// return makeIterator();
// }
};
globalThis.DeepMap = DeepMap;
// src/utils/getGlobal.ts
function getGlobal() {
return globalThis;
}
// src/utils/debugPackage.ts
var COLORS = [
// '#0000CC',
// '#0000FF',
// '#0033CC',
// '#0033FF',
"#0066CC",
"#0066FF",
"#0099CC",
"#0099FF",
"#00CC00",
"#00CC33",
"#00CC66",
"#00CC99",
"#00CCCC",
"#00CCFF",
"#3300CC",
"#3300FF",
"#3333CC",
"#3333FF",
"#3366CC",
"#3366FF",
"#3399CC",
"#3399FF",
"#33CC00",
"#33CC33",
"#33CC66",
"#33CC99",
"#33CCCC",
"#33CCFF",
"#6600CC",
"#6600FF",
"#6633CC",
"#6633FF",
"#66CC00",
"#66CC33",
"#9900CC",
"#9900FF",
"#9933CC",
"#9933FF",
"#99CC00",
"#99CC33",
"#CC0000",
"#CC0033",
"#CC0066",
"#CC0099",
"#CC00CC",
"#CC00FF",
"#CC3300",
"#CC3333",
"#CC3366",
"#CC3399",
"#CC33CC",
"#CC33FF",
"#CC6600",
"#CC6633",
"#CC9900",
"#CC9933",
"#CCCC00",
"#CCCC33",
"#FF0000",
"#FF0033",
"#FF0066",
"#FF0099",
"#FF00CC",
"#FF00FF",
"#FF3300",
"#FF3333",
"#FF3366",
"#FF3399",
"#FF33CC",
"#FF33FF",
"#FF6600",
"#FF6633",
"#FF9900",
"#FF9933",
"#FFCC00",
"#FFCC33"
];
var COLOR_SYMBOL = Symbol("color");
var USED_COLORS_MAP = /* @__PURE__ */ new WeakMap();
var GLOBAL_LOG_INTENT = buildSubscriptionCallback();
function initUsedColors(colors = COLORS) {
USED_COLORS_MAP.set(
colors,
colors.map((_) => 0)
);
}
initUsedColors();
var getNextColor = (colors = COLORS) => {
let usedColors = [];
if (USED_COLORS_MAP.has(colors)) {
usedColors = USED_COLORS_MAP.get(colors);
} else {
usedColors = colors.map((_) => 0);
USED_COLORS_MAP.set(colors, usedColors);
}
const index = usedColors.reduce(
(iMin, x, i, arr) => x < arr[iMin] ? i : iMin,
0
);
if (usedColors[index] != void 0) {
usedColors[index]++;
}
return colors[index] ?? colors[0] ?? COLORS[0];
};
var CHANNEL_SEPARATOR = ":";
var CHANNEL_WILDCARD = "*";
var CHANNEL_NEGATION_CHAR = "-";
var STORAGE_SEPARATOR = ",";
var STORAGE_KEY = "debug";
var STORAGE_DIFF_KEY = "diffdebug";
var DEFAULT_LOG_DIFF = false;
var loggers = new DeepMap();
var enabledChannelsCache = /* @__PURE__ */ new Map();
function isChannelTargeted(channel, permissionToken) {
const parts = channel.split(CHANNEL_SEPARATOR);
const partsMap = new DeepMap();
partsMap.set(parts, true);
const tokenParts = permissionToken.split(CHANNEL_SEPARATOR);
const hasWildcard = new Set(tokenParts).has(CHANNEL_WILDCARD);
const indexOfToken = tokenParts.indexOf(CHANNEL_WILDCARD);
const storagePartsWithoutWildcard = hasWildcard ? tokenParts.slice(0, indexOfToken) : tokenParts;
if (partsMap.getKeysStartingWith(storagePartsWithoutWildcard, {
excludeSelf: hasWildcard
}).length > 0) {
const remainingParts = tokenParts.slice(indexOfToken + 1);
if (remainingParts.length) {
return channel.endsWith(remainingParts.join(CHANNEL_SEPARATOR));
}
return true;
}
return void 0;
}
function isChannelEnabled(channel, permissions) {
const cacheKey = `channel=${channel}_permissions=${permissions}`;
if (enabledChannelsCache.has(cacheKey)) {
return enabledChannelsCache.get(cacheKey);
}
const permissionTokens = permissions.split(STORAGE_SEPARATOR);
function done(result) {
enabledChannelsCache.set(cacheKey, result);
return result;
}
const exactTokens = [];
const wildcardTokens = [];
permissionTokens.forEach((permissionToken) => {
if (permissionToken.includes(CHANNEL_WILDCARD)) {
wildcardTokens.push(permissionToken);
} else {
exactTokens.push(permissionToken);
}
});
for (let i = 0; i < exactTokens.length; i++) {
let exactToken = exactTokens[i];
const negative = exactToken.startsWith(CHANNEL_NEGATION_CHAR);
if (negative) {
exactToken = exactToken.substring(CHANNEL_NEGATION_CHAR.length);
}
if (isChannelTargeted(channel, exactToken)) {
return done(negative ? false : true);
}
}
for (let i = 0; i < wildcardTokens.length; i++) {
let permissionToken = wildcardTokens[i];
const negated = permissionToken.startsWith("-");
if (negated) {
permissionToken = permissionToken.substring(1);
}
if (isChannelTargeted(channel, permissionToken)) {
return done(negated ? false : true);
}
}
return done(false);
}
var getStorageKeyValue = () => debug.enable ?? (getGlobal() && getGlobal().localStorage?.getItem(STORAGE_KEY)) ?? "";
var getDiffStorageKeyValue = () => debug.diffenable ?? (getGlobal() && getGlobal().localStorage?.getItem(STORAGE_DIFF_KEY)) ?? `${DEFAULT_LOG_DIFF}`;
var storageKeyValue = "";
var logDiffs = DEFAULT_LOG_DIFF;
function updateStorageKeyValue(value) {
logDiffs = `${getDiffStorageKeyValue()}` == "true";
if (storageKeyValue === value) {
return;
}
storageKeyValue = value;
enabledChannelsCache.clear();
}
function debugPackage(channelName) {
updateStorageKeyValue(getStorageKeyValue());
typeof getGlobal() !== "undefined" && getGlobal().addEventListener && getGlobal().addEventListener("storage", function() {
updateStorageKeyValue(getStorageKeyValue());
});
function debugFactory(channelName2, parentChannel) {
const channel = parentChannel ? `${parentChannel}${CHANNEL_SEPARATOR}${channelName2}` : channelName2;
const channelParts = channel.split(CHANNEL_SEPARATOR);
const foundLogger = loggers.get(channelParts);
if (foundLogger) {
return foundLogger;
}
const parentLogger = loggers.get(channelParts.slice(0, -1));
const defaultLogFn = (parentLogger ? parentLogger.logFn : debug.logFn) ?? defaultLogger;
let logFn = defaultLogFn;
let enabled;
let lastMessageTimestamp = 0;
const isEnabled = () => enabled ?? isChannelEnabled(channel, storageKeyValue);
const color = getNextColor(debug.colors);
const logger2 = Object.defineProperties(
(...args) => {
const intentListenersCount = GLOBAL_LOG_INTENT.getListenersCount();
let now;
if (intentListenersCount > 0) {
now = now ?? Date.now();
GLOBAL_LOG_INTENT({
color,
channel,
args,
timestamp: now
});
}
if (isEnabled()) {
now = now ?? Date.now();
if (lastMessageTimestamp && logDiffs) {
const diff = now - lastMessageTimestamp;
logFn(`%c[${channel}]`, `color: ${color}`, `+${diff}ms:`);
}
lastMessageTimestamp = now;
const argsToLog = [];
let textWithColors = void 0;
args.forEach((arg) => {
if (arg[COLOR_SYMBOL]) {
if (textWithColors === void 0) {
textWithColors = true;
}
argsToLog.push(...arg);
} else {
if (typeof arg !== "string" && typeof arg !== "number") {
textWithColors = false;
return;
}
argsToLog.push(`${arg}%s`);
}
});
if (textWithColors) {
const theArgs = [
`%c[${channel}]%c %s`,
`color: ${color}`,
"",
...argsToLog,
""
];
logFn(...theArgs);
} else {
logFn(`%c[${channel}]%c %s`, `color: ${color}`, "", ...args);
}
}
},
{
channel: {
value: channel
},
color: {
value: (colorName, ...args) => {
const result = [
`%c${args.join(" ")}%c%s`,
`color: ${colorName}`,
""
];
result.toString = () => args.join(" ");
result[COLOR_SYMBOL] = true;
return result;
}
},
extend: {
value: (nextChannel) => {
return debugFactory(nextChannel, channel);
}
},
enabled: {
get: () => isEnabled(),
set: (value) => {
enabled = value;
}
},
logFn: {
configurable: false,
get: () => logFn,
set: (fn) => {
logFn = fn ?? defaultLogFn;
}
},
destroy: {
value: () => {
loggers.delete(channelParts);
}
}
}
);
loggers.set(channelParts, logger2);
return logger2;
}
return debugFactory(channelName);
}
var defaultLogger = console.log.bind(console);
var GLOBAL_ENABLE = void 0;
Object.defineProperty(debugPackage, "enable", {
get: () => GLOBAL_ENABLE,
set: (value) => {
GLOBAL_ENABLE = value;
updateStorageKeyValue(getStorageKeyValue());
}
});
var debug = debugPackage;
debug.colors = COLORS;
debug.logFn = defaultLogger;
var onLogIntentGlobal = (intentChannel, fn) => {
return GLOBAL_LOG_INTENT.onChange((options) => {
if (!options) {
return;
}
const { channel, args, color, timestamp } = options;
if (isChannelTargeted(channel, intentChannel)) {
fn({
channel,
color,
args,
timestamp
});
}
});
};
debug.onLogIntent = onLogIntentGlobal;
debug.isChannelEnabled = isChannelEnabled;
debug.destroyAll = () => {
initUsedColors();
initUsedColors(debug.colors);
loggers.clear();
enabledChannelsCache.clear();
};
if (false) {
globalThis.debugPackage = debug;
}
// src/utils/debugLoggers.ts
var dbg = (channelName) => {
const result = debug(
channelName ? `IT:${channelName}:TYPE=debug` : "IT:TYPE=debug"
);
result.logFn = console.log.bind(console);
return result;
};
var err = (channelName) => {
const result = debug(
channelName ? `IT:${channelName}:TYPE=error` : "IT:TYPE=error"
);
result.logFn = console.error.bind(console);
return result;
};
var emptyLogFn = () => emptyLogFn;
emptyLogFn.extend = () => emptyLogFn;
var Logger = class {
constructor(channelName) {
this.debug = emptyLogFn;
this.error = emptyLogFn;
if (false) {
this.debug = dbg(channelName);
this.error = err(channelName);
}
}
};
// src/components/ResizeObserver/index.tsx
import * as React from "react";
import {
useMemo,
useRef,
useEffect,
useLayoutEffect,
useCallback
} from "react";
var setupResizeObserver = (node, callback, config = { debounce: 0 }) => {
const debounceTime = config.debounce ?? 0;
const RO = window.ResizeObserver;
const onResizeCallback = debounceTime ? debounce(callback, { wait: debounceTime }) : callback;
const observer = new RO((entries) => {
const entry = entries[0];
let { width, height: height2 } = entry.contentRect;
if (entry.borderBoxSize?.[0]) {
height2 = entry.borderBoxSize[0].blockSize;
width = entry.borderBoxSize[0].inlineSize;
} else {
const rect = node.getBoundingClientRect();
height2 = rect.height;
width = rect.width;
}
onResizeCallback({ width, height: height2 });
});
observer.observe(node);
return () => {
observer.disconnect();
};
};
var useResizeObserver = (ref, callback, config = {
earlyAttach: false,
debounce: 0
}) => {
const sizeRef = useRef({
width: 0,
height: 0
});
const effectFn = (callback2) => {
let disconnect;
if (ref.current) {
disconnect = setupResizeObserver(
ref.current,
(size) => {
size = {
width: Math.round(size.width),
height: Math.round(size.height)
};
const prevSize = sizeRef.current;
if (prevSize.width !== size.width || prevSize.height !== size.height) {
sizeRef.current = size;
callback2(size);
}
},
{ debounce: config.debounce }
);
}
return () => {
if (disconnect) {
disconnect();
}
};
};
useEffect(() => {
if (!config.earlyAttach) {
return effectFn(callback);
}
return () => {
};
}, [ref.current, callback, config.earlyAttach, config.debounce]);
useLayoutEffect(() => {
if (config.earlyAttach) {
return effectFn(callback);
}
return () => {
};
}, [ref.current, callback, config.earlyAttach]);
};
// src/components/CSSNumericVariableWatch.tsx
var error = err("CSSVariableWatch");
var debug2 = dbg("CSSVariableWatch");
var WRAPPER_STYLE = {
position: "absolute",
pointerEvents: "none",
width: 0,
height: 0,
lineHeight: 0,
fontSize: 0,
overflow: "hidden"
};
var useCSSVariableWatch = (params) => {
const lastValueRef = useRef2(0);
const onResize = React2.useCallback(
({ height: height2 }) => {
if (height2 != null && height2 !== lastValueRef.current) {
lastValueRef.current = height2;
params.onChange(height2);
}
},
[params.onChange]
);
useResizeObserver(params.ref, onResize, { earlyAttach: true });
React2.useLayoutEffect(() => {
const value = params.ref.current.getBoundingClientRect().height;
if (value != null) {
lastValueRef.current = value;
debug2(`Variable ${params.varName} found and equals ${value}.`);
return params.onChange(value);
} else {
error(
`Specified variable ${params.varName} not found or does not have a numeric value.`
);
}
}, []);
};
var CSSNumericVariableWatch = (props) => {
const domRef = useRef2(null);
useCSSVariableWatch({
...props,
ref: domRef
});
const height2 = props.varName.startsWith("var(") ? props.varName : `var(${props.varName})`;
const { allowInts = false } = props;
return /* @__PURE__ */ React2.createElement(
"div",
{
"data-name": "css-variable-watcher",
"data-var": props.varName,
style: WRAPPER_STYLE
},
/* @__PURE__ */ React2.createElement(
"div",
{
ref: domRef,
style: {
height: allowInts ? `calc(1px * ${height2})` : height2
// we do multiplication in order to support integer (without px) values as well
}
}
)
);
};
// src/components/DataSource/publicHooks/useDataSourceMasterDetailSelector.ts
import { useCallback as useCallback4, useContext } from "react";
// src/utils/ComponentStore.ts
import { useCallback as useCallback3, useRef as useRef3, useSyncExternalStore } from "react";
// src/utils/shallowEqualObjects.ts
function shallowEqualObjects(objA, objB, ignoreKeys) {
if (objA === objB) {
return true;
}
if (!objA || !objB) {
return false;
}
const typeA = typeof objA;
const typeB = typeof objB;
if (typeA !== typeB) {
return false;
}
if (typeA !== "object") {
return false;
}
var aKeys = Object.keys(objA);
var bKeys = Object.keys(objB);
if (ignoreKeys) {
aKeys = aKeys.filter((key2) => !ignoreKeys.has(key2));
bKeys = bKeys.filter((key2) => !ignoreKeys.has(key2));
}
var len = aKeys.length;
if (bKeys.length !== len) {
return false;
}
for (var i = 0; i < len; i++) {
var key = aKeys[i];
if (ignoreKeys) {
if (ignoreKeys.has(key)) {
continue;
}
}
if (objA[key] !== objB[key] || !Object.prototype.hasOwnProperty.call(objB, key)) {
return false;
}
}
return true;
}
// src/utils/ComponentStore.ts
function createComponentStore() {
let snapshot = null;
const listeners = /* @__PURE__ */ new Set();
return {
getSnapshot() {
return snapshot;
},
setSnapshot(value) {
snapshot = value;
},
subscribe(listener) {
listeners.add(listener);
return () => {
listeners.delete(listener);
};
},
notify() {
for (const listener of listeners) {
listener();
}
}
};
}
function useComponentStoreSelectorImpl(store, selector2, isEqual) {
const selectorRef = useRef3(selector2);
selectorRef.current = selector2;
const isEqualRef = useRef3(isEqual);
isEqualRef.current = isEqual;
const resultRef = useRef3(void 0);
const initializedRef = useRef3(false);
const getSnapshot = useCallback3(() => {
const snapshot = store.getSnapshot();
const nextResult = selectorRef.current(snapshot);
if (initializedRef.current && isEqualRef.current(resultRef.current, nextResult)) {
return resultRef.current;
}
resultRef.current = nextResult;
initializedRef.current = true;
return nextResult;
}, [store]);
return useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);
}
function useComponentStoreSingleValue(componentStore, selector2) {
return useComponentStoreSelectorImpl(componentStore, selector2, Object.is);
}
function useComponentStoreSelector(componentStore, selector2) {
return useComponentStoreSelectorImpl(
componentStore,
selector2,
shallowEqualObjects
);
}
// src/components/DataSource/DataSourceMasterDetailContext.ts
import * as React3 from "react";
var DSMasterDetailStoreContext;
function getDataSourceMasterDetailStoreContext() {
if (DSMasterDetailStoreContext) {
return DSMasterDetailStoreContext;
}
return DSMasterDetailStoreContext = React3.createContext(null);
}
// src/components/DataSource/publicHooks/useDataSourceMasterDetailSelector.ts
var NOOP_STORE = createComponentStore();
var NOOP_SELECTOR = () => void 0;
function useMasterDetailStore() {
const StoreContext = getDataSourceMasterDetailStoreContext();
const store = useContext(StoreContext);
return store || void 0;
}
function useGetMasterDetailContext() {
const store = useMasterDetailStore();
return useCallback4(() => store?.getSnapshot(), [store]);
}
function useDataSourceMasterDetailSelector(selector2) {
const StoreContext = getDataSourceMasterDetailStoreContext();
const store = useContext(StoreContext);
const result = useComponentStoreSelector(
store || NOOP_STORE,
store ? selector2 : NOOP_SELECTOR
);
return store ? result ?? void 0 : void 0;
}
function useMasterRowInfo() {
const StoreContext = getDataSourceMasterDetailStoreContext();
const store = useContext(StoreContext);
const masterRowInfoSelector = store ? (ctx) => ctx.masterRowInfo : NOOP_SELECTOR;
const result = useComponentStoreSingleValue(
store || NOOP_STORE,
masterRowInfoSelector
);
return store ? result : void 0;
}
// src/components/hooks/useComponentState/index.tsx
import * as React4 from "react";
import {
useReducer,
createContext as createContext2,
useMemo as useMemo2,
useEffect as useEffect3,
useState as useState2,
useRef as useRef7,
useLayoutEffect as useLayoutEffect4
} from "react";
// src/utils/proxyFnCall.ts
function proxyFn(fn, config) {
const propertyReads = /* @__PURE__ */ new Set();
function proxiedFn(...params) {
const paramToProxy = config ? config.getProxyTargetFromArgs(...params) : params[0];
propertyReads.clear();
const handler = {
get: function(obj, prop) {
propertyReads.add(prop);
return obj[prop];
}
};
const proxy = new Proxy(
paramToProxy,
handler
);
const newParams = config ? config.putProxyToArgs(proxy, ...params) : [proxy];
return fn.apply(this, newParams);
}
return {
fn: proxiedFn,
propertyReads
};
}
// src/utils/toUpperFirst.ts
var toUpperFirst = (s) => {
return s ? s.substr(0, 1).toUpperCase() + s.substr(1) : s;
};
// src/components/InfiniteTable/types/Utility.ts
function notNullable(value) {
if (value === null || value === void 0) return false;
const testDummyForCompileError = value;
return true;
}
// src/components/utils/isControlledValue.ts
function isControlledValue(value) {
const controlled = value !== void 0;
return controlled;
}
// src/components/utils/isControlled.ts
function isControlled(propName, props) {
const propValue = props[propName];
const controlled = isControlledValue(propValue);
return controlled;
}
// src/components/hooks/useEffectOnceWithProperUnmount.ts
import { useCallback as useCallback6, useEffect as useEffect2, useRef as useRef4 } from "react";
// src/components/hooks/useRerender.ts
import { useCallback as useCallback5, useState } from "react";
var useRerender = () => {
const [state, setState] = useState(0);
return [
state,
useCallback5(() => {
setState((state2) => state2 + 1);
}, [setState])
];
};
// src/components/hooks/useEffectOnceWithProperUnmount.ts
var useEffectOnce = (effectCallback) => {
const effectFunction = useCallback6(effectCallback, []);
const effectCalled = useRef4(false);
const componentRendered = useRef4(false);
const destroyFn = useRef4(void 0);
const [_, rerender] = useRerender();
if (effectCalled.current) {
componentRendered.current = true;
}
useEffect2(() => {
if (!effectCalled.current) {
destroyFn.current = effectFunction;
effectCalled.current = true;
}
rerender();
return () => {
if (!componentRendered.current) {
return;
}
if (destroyFn.current) {
destroyFn.current();
}
};
}, []);
};
// src/components/hooks/useLatest.tsx
import { useCallback as useCallback7, useRef as useRef5 } from "react";
function useLatest(value) {
const ref = useRef5(value);
ref.current = value;
return useCallback7(() => ref.current, []);
}
// src/components/hooks/usePrevious.ts
import { useRef as useRef6, useLayoutEffect as useLayoutEffect3 } from "react";
var usePrevious = (value, initialValue) => {
const ref = useRef6(initialValue === void 0 ? value : initialValue);
useLayoutEffect3(() => {
ref.current = value;
});
return ref.current;
};
// src/utils/devTools/devToolsTracks.ts
var DevToolsTracks = {
DataSource: {
track: "DataSource",
labels: {
RemoteDataLoad: "Remote data load",
TreeUnfilteredTreePaths: "Computing unfiltered tree paths",
Filter: "Filter",
Sort: "Sort",
Group: "Group",
LazyGroup: "Lazy group",
Tree: "Tree",
FlattenTree: "Flatten tree",
Flatten: "Flatten groups",
PrepareData: "Preparing data",
ComputeSelectionCount: "Computing selection count",
ComputeSelectionCountLazy: "Computing selection count (lazy)",
PrepareRowInfo: "Preparing row info array",
DiffRowInfoInStore: "setDataArray diffing in RowInfoStore"
}
},
InfiniteTable: {
track: "InfiniteTable",
labels: {
Render: "Rendering"
}
},
MatrixBrain: {
track: "Layout Computations",
labels: {
ComputeRenderRange: "Computing render range"
}
},
ComponentState: {
track: "ComponentState",
labels: {
PropUpdate: "Prop update"
}
}
};
// src/utils/devTools/index.ts
var DevToolsMarker = class _DevToolsMarker {
constructor(debugId) {
this.debugId = debugId;
this.markerDetails = {
label: "",
track: "",
trackGroup: void 0,
color: void 0,
details: [],
tooltip: void 0
};
this.stopped = false;
this.start = (startDetails) => {
if (this.markerDetails.startTs) {
return this;
}
const start = performance.now();
this.markerDetails.details = startDetails?.details ?? [];
this.markerDetails.startTs = start;
return this;
};
this.end = (markerDetails = {}) => {
if (this.stopped) {
return this;
}
this.stopped = true;
const start = markerDetails.startTs ?? this.markerDetails.startTs;
const end = markerDetails.endTs ?? this.markerDetails.endTs ?? performance.now();
const color = markerDetails.color || this.markerDetails.color || "primary";
const trackGroup = markerDetails.trackGroup || this.markerDetails.trackGroup || `Infinite Table (${this.debugId})`;
const details = [
...this.markerDetails.details || [],
...markerDetails.details || []
];
const tooltip = markerDetails.tooltip || this.markerDetails.tooltip;
const label = markerDetails.label || this.markerDetails.label || "Unknown";
const track = markerDetails.track || this.markerDetails.track || "Unknown";
performance.measure(label, {
start,
end,
detail: {
devtools: {
dataType: "track-entry",
trackGroup,
track,
color,
properties: details.length > 0 ? details.map((detail) => [detail.name, detail.value]) : void 0,
tooltipText: tooltip
}
}
});
return this;
};
this.debugId = debugId;
}
static create(debugId) {
return new _DevToolsMarker(debugId);
}
get startTimestamp() {
return this.markerDetails.startTs;
}
get track() {
const self = this;
return Object.keys(DevToolsTracks).reduce(
(acc, track) => {
const trackObj = {
start: self.start,
end: (markerDetails) => {
return self.end({
...markerDetails,
track: DevToolsTracks[track].track,
label: markerDetails.label
});
},
get label() {
const currentTrack = DevToolsTracks[track];
return Object.keys(currentTrack.labels).reduce(
(labelAcc, label) => {
const labelObj = {
start: self.start,
end: (markerDetails) => {
return self.end({
...markerDetails,
track: currentTrack.track,
label: currentTrack.labels[label]
});
}
};
Object.defineProperty(labelAcc, label, {
get: () => {
self.markerDetails.label = currentTrack.labels[label];
return labelObj;
}
});
return labelAcc;
},
{}
);
}
};
Object.defineProperty(acc, track, {
get: () => {
const currentTrack = DevToolsTracks[track];
self.markerDetails.track = currentTrack.track;
return trackObj;
}
});
return acc;
},
{}
);
}
};
function getMarker(debugId) {
return DevToolsMarker.create(debugId);
}
// src/components/hooks/useComponentState/index.tsx
var notifyChange = (props, callbackPropName, values) => {
const callbackProp = props[callbackPropName];
if (typeof callbackProp === "function") {
callbackProp(...values);
}
};
var ComponentContext;
function getComponentStateContext() {
if (ComponentContext) {
return ComponentContext;
}
return ComponentContext = createContext2(null);
}
function getReducerGeneratedActions(dispatch, getState, getProps, propsToForward, allowedControlledPropOverrides, interceptedActions, mappedCallbacks) {
const state = getState();
return Object.keys(state).reduce((actions, stateKey) => {
const key = stateKey;
const setter = (value) => {
const props = getProps();
const state2 = getState();
const currentValue = state2[key];
if (currentValue === value) {
}
let notifyTheChange = true;
if (interceptedActions && typeof interceptedActions[key] === "function") {
if (interceptedActions[key](value, { actions, state: state2 }) === false) {
notifyTheChange = false;
}
}
if (notifyTheChange) {
let callbackParams = [value];
let callbackName = `on${toUpperFirst(stateKey)}Change`;
if (mappedCallbacks && mappedCallbacks[key]) {
const res = mappedCallbacks[key](value, state2);
callbackName = res.callbackName || callbackName;
callbackParams = res.callbackParams;
}
notifyChange(props, callbackName, callbackParams);
}
const forwardFn = propsToForward[key];
if (typeof forwardFn === "function") {
value = forwardFn(value);
}
const allowControlled = !!allowedControlledPropOverrides?.[key];
if (isControlled(stateKey, props) && !allowControlled) {
return;
}
dispatch({
payload: {
updatedProps: null,
mappedState: {
[stateKey]: value
}
}
});
};
Object.defineProperty(actions, stateKey, {
set: setter
});
return actions;
}, {});
}
function forwardProps(propsToForward, props, setupState) {
const mappedState = {};
for (let k in propsToForward)
if (propsToForward.hasOwnProperty(k)) {
const forwardFn = propsToForward[k];
let propValue = isControlled(k, props) ? props[k] : props[`default${toUpperFirst(k)}`];
if (typeof forwardFn === "function") {
propValue = forwardFn(propValue, setupState);
}
mappedState[k] = propValue;
}
return mappedState;
}
function buildManagedComponent(config) {
const useParentStateFn = config.getParentState || (() => null);
function useManagedComponent(props) {
const [initialSetupState] = useState2(() => {
return config.initSetupState ? config.initSetupState(props) : {};
});
const propsToStateSetRef = useRef7(/* @__PURE__ */ new Set());
const propsToForward = useMemo2(
() => config.forwardProps ? config.forwardProps(initialSetupState, props) : {},
[initialSetupState]
);
const parentState = useParentStateFn();
const getParentState = useLatest(parentState);
function initStateOnce() {
let mappedState = {};
if (propsToForward) {
mappedState = forwardProps(propsToForward, props, initialSetupState);
}
const state2 = { ...initialSetupState, ...mappedState };
if (config.mapPropsToState) {
const { fn: mapPropsToState2, propertyReads } = proxyFn(
config.mapPropsToState,
{
getProxyTargetFromArgs: (initialArg) => initialArg.props,
putProxyToArgs: (props2, initialArg) => {
return [{ ...initialArg, props: props2 }];
}
}
);
const stateFromProps = mapPropsToState2({
props,
state: state2,
oldState: null,
parentState
// getState: getComponentState,
});
propsToStateSetRef.current = /* @__PURE__ */ new Set([
...propsToStateSetRef.current,
...propertyReads
]);
return {
...state2,
...stateFromProps
};
}
return state2;
}
const [wholeState] = useState2(initStateOnce);
const getProps = useLatest(props);
const theReducer = (previousState, action) => {
if (action.type === "REPLACE_STATE") {
return action.payload;
}
const parentState2 = getParentState?.() ?? null;
const mappedState = action.payload.mappedState;
const updatedProps = action.payload.updatedPropsToState;
const newState = { ...previousState };
if (mappedState) {
Object.assign(newState, mappedState);
}
if (config.mapPropsToState) {
const { fn: mapPropsToState2, propertyReads } = proxyFn(
config.mapPropsToState,
{
getProxyTargetFromArgs: (initialArg) => initialArg.props,
putProxyToArgs: (props2, initialArg) => {
return [{ ...initialArg, props: props2 }];
}
}
);
const stateFromProps = mapPropsToState2({
props: getProps(),
state: newState,
oldState: previousState,
parentState: parentState2
// getState: getComponentState
});
propsToStateSetRef.current = /* @__PURE__ */ new Set([
...propsToStateSetRef.current,
...propertyReads
]);
Object.assign(newState, stateFromProps);
}
if (action.type === "