@infinite-table/infinite-react
Version:
Infinite Table for React
1,783 lines (1,748 loc) • 1.08 MB
JavaScript
"use strict";
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 __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
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
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// node_modules/binary-search/index.js
var require_binary_search = __commonJS({
"node_modules/binary-search/index.js"(exports2, module2) {
"use strict";
module2.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/index.tsx
var index_exports = {};
__export(index_exports, {
AutoScroller: () => AutoScroller,
CellSelectionState: () => CellSelectionState,
DRAG_ITEM_ATTRIBUTE: () => DRAG_ITEM_ATTRIBUTE,
DataClient: () => DataClient,
DataSource: () => DataSource,
DataSourceActionType: () => DataSourceActionType,
DeepMap: () => DeepMap,
DragDropProvider: () => DragDropProvider,
DragInteractionTarget: () => DragInteractionTarget,
DragList: () => DragList,
FixedSizeSet: () => FixedSizeSet,
FlashingColumnCell: () => FlashingColumnCell,
GroupRowsState: () => GroupRowsState,
INTERNAL_MatrixDebugger: () => INTERNAL_MatrixDebugger,
InfiniteTable: () => InfiniteTable,
InfiniteTableClassName: () => InfiniteTableClassName,
InfiniteTableComponent: () => InfiniteTableComponent,
Menu: () => Menu,
RowDetailCache: () => RowDetailCache,
RowDetailState: () => RowDetailState,
RowDisabledState: () => RowDisabledState,
RowSelectionState: () => RowSelectionState,
TreeDataSource: () => TreeDataSource,
TreeExpandState: () => TreeExpandState,
TreeGrid: () => TreeGrid,
TreeSelectionState: () => TreeSelectionState,
WeakFixedSizeSet: () => WeakFixedSizeSet,
alignNode: () => alignNode,
components: () => components,
createDefaultProxy: () => createDefaultProxy,
createFlashingColumnCellComponent: () => createFlashingColumnCellComponent,
debounce: () => debounce,
debug: () => debug,
defaultDragProxyMove: () => defaultDragProxyMove,
defaultFilterTypes: () => defaultFilterTypes2,
eventMatchesKeyboardShortcut: () => eventMatchesKeyboardShortcut,
filterDataArray: () => filterDataArray,
filterTypes: () => defaultFilterTypes2,
flatten: () => flatten,
getComponentStateRoot: () => buildManagedComponent,
group: () => group,
interceptMap: () => interceptMap,
keyboardShortcuts: () => keyboardShortcuts,
multisort: () => multisort,
multisortNested: () => multisortNested,
queryKeyToCacheKey: () => queryKeyToCacheKey,
toTreeDataArray: () => toTreeDataArray,
useComponentState: () => useManagedComponentState,
useDataSourceApi: () => useDataSourceApi,
useDataSourceInternal: () => useDataSourceInternal,
useDataSourceSelector: () => useDataSourceSelector,
useDataSourceState: () => useDataSourceState,
useDragDropProvider: () => useDragDropProvider,
useDragListContext: () => useDragListContext,
useEffectWhen: () => useEffectWhen,
useEffectWhenSameDeps: () => useEffectWhenSameDeps,
useEffectWithChanges: () => useEffectWithChanges,
useEffectWithObject: () => useEffectWithObject,
useGridScroll: () => useGridScroll,
useInfiniteColumnApi: () => useInfiniteColumnApi,
useInfiniteColumnCell: () => useInfiniteColumnCell,
useInfiniteColumnEditor: () => useInfiniteColumnEditor,
useInfiniteColumnFilterEditor: () => useInfiniteColumnFilterEditor,
useInfiniteHeaderCell: () => useInfiniteHeaderCell,
useInfinitePortalContainer: () => useInfinitePortalContainer,
useInfiniteTableApi: () => useInfiniteTableApi,
useLayoutEffectWithChanges: () => useLayoutEffectWithChanges,
useManagedDataSource: () => useManagedDataSource,
useMasterRowInfo: () => useMasterRowInfo,
useOverlay: () => useOverlay,
useOverlayPortal: () => useOverlayPortal,
usePrevious: () => usePrevious,
useRowInfoReducers: () => useRowInfoReducers,
useVisibleColumnSizes: () => useVisibleColumnSizes,
withSelectedLeafNodesOnly: () => withSelectedLeafNodesOnly
});
module.exports = __toCommonJS(index_exports);
// 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
var React78 = __toESM(require("react"));
// src/utils/join.ts
var join = (...args) => args.filter((x) => !!`${x}`).join(" ");
// src/components/CSSNumericVariableWatch.tsx
var React2 = __toESM(require("react"));
var import_react2 = require("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
var React = __toESM(require("react"));
var import_react = require("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 = (0, import_react.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();
}
};
};
(0, import_react.useEffect)(() => {
if (!config.earlyAttach) {
return effectFn(callback);
}
return () => {
};
}, [ref.current, callback, config.earlyAttach, config.debounce]);
(0, import_react.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 = (0, import_react2.useRef)(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 = (0, import_react2.useRef)(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
var import_react4 = require("react");
// src/utils/ComponentStore.ts
var import_react3 = require("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 = (0, import_react3.useRef)(selector2);
selectorRef.current = selector2;
const isEqualRef = (0, import_react3.useRef)(isEqual);
isEqualRef.current = isEqual;
const resultRef = (0, import_react3.useRef)(void 0);
const initializedRef = (0, import_react3.useRef)(false);
const getSnapshot = (0, import_react3.useCallback)(() => {
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 (0, import_react3.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
var React3 = __toESM(require("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 = (0, import_react4.useContext)(StoreContext);
return store || void 0;
}
function useGetMasterDetailContext() {
const store = useMasterDetailStore();
return (0, import_react4.useCallback)(() => store?.getSnapshot(), [store]);
}
function useDataSourceMasterDetailSelector(selector2) {
const StoreContext = getDataSourceMasterDetailStoreContext();
const store = (0, import_react4.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 = (0, import_react4.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
var React4 = __toESM(require("react"));
var import_react9 = require("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
var import_react6 = require("react");
// src/components/hooks/useRerender.ts
var import_react5 = require("react");
var useRerender = () => {
const [state, setState] = (0, import_react5.useState)(0);
return [
state,
(0, import_react5.useCallback)(() => {
setState((state2) => state2 + 1);
}, [setState])
];
};
// src/components/hooks/useEffectOnceWithProperUnmount.ts
var useEffectOnce = (effectCallback) => {
const effectFunction = (0, import_react6.useCallback)(effectCallback, []);
const effectCalled = (0, import_react6.useRef)(false);
const componentRendered = (0, import_react6.useRef)(false);
const destroyFn = (0, import_react6.useRef)(void 0);
const [_, rerender] = useRerender();
if (effectCalled.current) {
componentRendered.current = true;
}
(0, import_react6.useEffect)(() => {
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
var import_react7 = require("react");
function useLatest(value) {
const ref = (0, import_react7.useRef)(value);
ref.current = value;
return (0, import_react7.useCallback)(() => ref.current, []);
}
// src/components/hooks/usePrevious.ts
var import_react8 = require("react");
var usePrevious = (value, initialValue) => {
const ref = (0, import_react8.useRef)(initialValue === void 0 ? value : initialValue);
(0, import_react8.useLayoutEffect)(() => {
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 = (0, import_react9.createContext)(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 (isControlle