@headless-tree/core 0.0.0-20250723222210 → 0.0.0-20250726130412

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/CHANGELOG.md +4 -1
  2. package/dist/index.d.mts +568 -0
  3. package/dist/index.d.ts +568 -0
  4. package/dist/index.js +2284 -0
  5. package/dist/index.mjs +2239 -0
  6. package/package.json +18 -10
  7. package/src/features/checkboxes/checkboxes.spec.ts +20 -5
  8. package/src/features/checkboxes/feature.ts +30 -15
  9. package/src/features/checkboxes/types.ts +1 -0
  10. package/tsconfig.json +1 -4
  11. package/lib/cjs/core/build-proxified-instance.d.ts +0 -2
  12. package/lib/cjs/core/build-proxified-instance.js +0 -58
  13. package/lib/cjs/core/build-static-instance.d.ts +0 -2
  14. package/lib/cjs/core/build-static-instance.js +0 -26
  15. package/lib/cjs/core/create-tree.d.ts +0 -2
  16. package/lib/cjs/core/create-tree.js +0 -191
  17. package/lib/cjs/features/async-data-loader/feature.d.ts +0 -2
  18. package/lib/cjs/features/async-data-loader/feature.js +0 -135
  19. package/lib/cjs/features/async-data-loader/types.d.ts +0 -47
  20. package/lib/cjs/features/async-data-loader/types.js +0 -2
  21. package/lib/cjs/features/checkboxes/feature.d.ts +0 -2
  22. package/lib/cjs/features/checkboxes/feature.js +0 -94
  23. package/lib/cjs/features/checkboxes/types.d.ts +0 -26
  24. package/lib/cjs/features/checkboxes/types.js +0 -9
  25. package/lib/cjs/features/drag-and-drop/feature.d.ts +0 -2
  26. package/lib/cjs/features/drag-and-drop/feature.js +0 -215
  27. package/lib/cjs/features/drag-and-drop/types.d.ts +0 -72
  28. package/lib/cjs/features/drag-and-drop/types.js +0 -9
  29. package/lib/cjs/features/drag-and-drop/utils.d.ts +0 -27
  30. package/lib/cjs/features/drag-and-drop/utils.js +0 -182
  31. package/lib/cjs/features/expand-all/feature.d.ts +0 -2
  32. package/lib/cjs/features/expand-all/feature.js +0 -70
  33. package/lib/cjs/features/expand-all/types.d.ts +0 -19
  34. package/lib/cjs/features/expand-all/types.js +0 -2
  35. package/lib/cjs/features/hotkeys-core/feature.d.ts +0 -2
  36. package/lib/cjs/features/hotkeys-core/feature.js +0 -107
  37. package/lib/cjs/features/hotkeys-core/types.d.ts +0 -27
  38. package/lib/cjs/features/hotkeys-core/types.js +0 -2
  39. package/lib/cjs/features/keyboard-drag-and-drop/feature.d.ts +0 -2
  40. package/lib/cjs/features/keyboard-drag-and-drop/feature.js +0 -206
  41. package/lib/cjs/features/keyboard-drag-and-drop/types.d.ts +0 -27
  42. package/lib/cjs/features/keyboard-drag-and-drop/types.js +0 -11
  43. package/lib/cjs/features/main/types.d.ts +0 -47
  44. package/lib/cjs/features/main/types.js +0 -2
  45. package/lib/cjs/features/prop-memoization/feature.d.ts +0 -2
  46. package/lib/cjs/features/prop-memoization/feature.js +0 -70
  47. package/lib/cjs/features/prop-memoization/types.d.ts +0 -15
  48. package/lib/cjs/features/prop-memoization/types.js +0 -2
  49. package/lib/cjs/features/renaming/feature.d.ts +0 -2
  50. package/lib/cjs/features/renaming/feature.js +0 -86
  51. package/lib/cjs/features/renaming/types.d.ts +0 -27
  52. package/lib/cjs/features/renaming/types.js +0 -2
  53. package/lib/cjs/features/search/feature.d.ts +0 -2
  54. package/lib/cjs/features/search/feature.js +0 -119
  55. package/lib/cjs/features/search/types.d.ts +0 -32
  56. package/lib/cjs/features/search/types.js +0 -2
  57. package/lib/cjs/features/selection/feature.d.ts +0 -2
  58. package/lib/cjs/features/selection/feature.js +0 -132
  59. package/lib/cjs/features/selection/types.d.ts +0 -21
  60. package/lib/cjs/features/selection/types.js +0 -2
  61. package/lib/cjs/features/sync-data-loader/feature.d.ts +0 -2
  62. package/lib/cjs/features/sync-data-loader/feature.js +0 -53
  63. package/lib/cjs/features/sync-data-loader/types.d.ts +0 -28
  64. package/lib/cjs/features/sync-data-loader/types.js +0 -2
  65. package/lib/cjs/features/tree/feature.d.ts +0 -2
  66. package/lib/cjs/features/tree/feature.js +0 -245
  67. package/lib/cjs/features/tree/types.d.ts +0 -63
  68. package/lib/cjs/features/tree/types.js +0 -2
  69. package/lib/cjs/index.d.ts +0 -33
  70. package/lib/cjs/index.js +0 -51
  71. package/lib/cjs/mddocs-entry.d.ts +0 -121
  72. package/lib/cjs/mddocs-entry.js +0 -17
  73. package/lib/cjs/test-utils/test-tree-do.d.ts +0 -23
  74. package/lib/cjs/test-utils/test-tree-do.js +0 -114
  75. package/lib/cjs/test-utils/test-tree-expect.d.ts +0 -17
  76. package/lib/cjs/test-utils/test-tree-expect.js +0 -66
  77. package/lib/cjs/test-utils/test-tree.d.ts +0 -48
  78. package/lib/cjs/test-utils/test-tree.js +0 -208
  79. package/lib/cjs/types/core.d.ts +0 -84
  80. package/lib/cjs/types/core.js +0 -2
  81. package/lib/cjs/types/deep-merge.d.ts +0 -13
  82. package/lib/cjs/types/deep-merge.js +0 -2
  83. package/lib/cjs/utilities/create-on-drop-handler.d.ts +0 -3
  84. package/lib/cjs/utilities/create-on-drop-handler.js +0 -20
  85. package/lib/cjs/utilities/errors.d.ts +0 -2
  86. package/lib/cjs/utilities/errors.js +0 -9
  87. package/lib/cjs/utilities/insert-items-at-target.d.ts +0 -3
  88. package/lib/cjs/utilities/insert-items-at-target.js +0 -40
  89. package/lib/cjs/utilities/remove-items-from-parents.d.ts +0 -2
  90. package/lib/cjs/utilities/remove-items-from-parents.js +0 -32
  91. package/lib/cjs/utils.d.ts +0 -6
  92. package/lib/cjs/utils.js +0 -53
  93. package/lib/esm/core/build-proxified-instance.d.ts +0 -2
  94. package/lib/esm/core/build-proxified-instance.js +0 -54
  95. package/lib/esm/core/build-static-instance.d.ts +0 -2
  96. package/lib/esm/core/build-static-instance.js +0 -22
  97. package/lib/esm/core/create-tree.d.ts +0 -2
  98. package/lib/esm/core/create-tree.js +0 -187
  99. package/lib/esm/features/async-data-loader/feature.d.ts +0 -2
  100. package/lib/esm/features/async-data-loader/feature.js +0 -132
  101. package/lib/esm/features/async-data-loader/types.d.ts +0 -47
  102. package/lib/esm/features/async-data-loader/types.js +0 -1
  103. package/lib/esm/features/checkboxes/feature.d.ts +0 -2
  104. package/lib/esm/features/checkboxes/feature.js +0 -91
  105. package/lib/esm/features/checkboxes/types.d.ts +0 -26
  106. package/lib/esm/features/checkboxes/types.js +0 -6
  107. package/lib/esm/features/drag-and-drop/feature.d.ts +0 -2
  108. package/lib/esm/features/drag-and-drop/feature.js +0 -212
  109. package/lib/esm/features/drag-and-drop/types.d.ts +0 -72
  110. package/lib/esm/features/drag-and-drop/types.js +0 -6
  111. package/lib/esm/features/drag-and-drop/utils.d.ts +0 -27
  112. package/lib/esm/features/drag-and-drop/utils.js +0 -172
  113. package/lib/esm/features/expand-all/feature.d.ts +0 -2
  114. package/lib/esm/features/expand-all/feature.js +0 -67
  115. package/lib/esm/features/expand-all/types.d.ts +0 -19
  116. package/lib/esm/features/expand-all/types.js +0 -1
  117. package/lib/esm/features/hotkeys-core/feature.d.ts +0 -2
  118. package/lib/esm/features/hotkeys-core/feature.js +0 -104
  119. package/lib/esm/features/hotkeys-core/types.d.ts +0 -27
  120. package/lib/esm/features/hotkeys-core/types.js +0 -1
  121. package/lib/esm/features/keyboard-drag-and-drop/feature.d.ts +0 -2
  122. package/lib/esm/features/keyboard-drag-and-drop/feature.js +0 -203
  123. package/lib/esm/features/keyboard-drag-and-drop/types.d.ts +0 -27
  124. package/lib/esm/features/keyboard-drag-and-drop/types.js +0 -8
  125. package/lib/esm/features/main/types.d.ts +0 -47
  126. package/lib/esm/features/main/types.js +0 -1
  127. package/lib/esm/features/prop-memoization/feature.d.ts +0 -2
  128. package/lib/esm/features/prop-memoization/feature.js +0 -67
  129. package/lib/esm/features/prop-memoization/types.d.ts +0 -15
  130. package/lib/esm/features/prop-memoization/types.js +0 -1
  131. package/lib/esm/features/renaming/feature.d.ts +0 -2
  132. package/lib/esm/features/renaming/feature.js +0 -83
  133. package/lib/esm/features/renaming/types.d.ts +0 -27
  134. package/lib/esm/features/renaming/types.js +0 -1
  135. package/lib/esm/features/search/feature.d.ts +0 -2
  136. package/lib/esm/features/search/feature.js +0 -116
  137. package/lib/esm/features/search/types.d.ts +0 -32
  138. package/lib/esm/features/search/types.js +0 -1
  139. package/lib/esm/features/selection/feature.d.ts +0 -2
  140. package/lib/esm/features/selection/feature.js +0 -129
  141. package/lib/esm/features/selection/types.d.ts +0 -21
  142. package/lib/esm/features/selection/types.js +0 -1
  143. package/lib/esm/features/sync-data-loader/feature.d.ts +0 -2
  144. package/lib/esm/features/sync-data-loader/feature.js +0 -50
  145. package/lib/esm/features/sync-data-loader/types.d.ts +0 -28
  146. package/lib/esm/features/sync-data-loader/types.js +0 -1
  147. package/lib/esm/features/tree/feature.d.ts +0 -2
  148. package/lib/esm/features/tree/feature.js +0 -242
  149. package/lib/esm/features/tree/types.d.ts +0 -63
  150. package/lib/esm/features/tree/types.js +0 -1
  151. package/lib/esm/index.d.ts +0 -33
  152. package/lib/esm/index.js +0 -32
  153. package/lib/esm/mddocs-entry.d.ts +0 -121
  154. package/lib/esm/mddocs-entry.js +0 -1
  155. package/lib/esm/test-utils/test-tree-do.d.ts +0 -23
  156. package/lib/esm/test-utils/test-tree-do.js +0 -110
  157. package/lib/esm/test-utils/test-tree-expect.d.ts +0 -17
  158. package/lib/esm/test-utils/test-tree-expect.js +0 -62
  159. package/lib/esm/test-utils/test-tree.d.ts +0 -48
  160. package/lib/esm/test-utils/test-tree.js +0 -204
  161. package/lib/esm/types/core.d.ts +0 -84
  162. package/lib/esm/types/core.js +0 -1
  163. package/lib/esm/types/deep-merge.d.ts +0 -13
  164. package/lib/esm/types/deep-merge.js +0 -1
  165. package/lib/esm/utilities/create-on-drop-handler.d.ts +0 -3
  166. package/lib/esm/utilities/create-on-drop-handler.js +0 -16
  167. package/lib/esm/utilities/errors.d.ts +0 -2
  168. package/lib/esm/utilities/errors.js +0 -4
  169. package/lib/esm/utilities/insert-items-at-target.d.ts +0 -3
  170. package/lib/esm/utilities/insert-items-at-target.js +0 -36
  171. package/lib/esm/utilities/remove-items-from-parents.d.ts +0 -2
  172. package/lib/esm/utilities/remove-items-from-parents.js +0 -28
  173. package/lib/esm/utils.d.ts +0 -6
  174. package/lib/esm/utils.js +0 -46
@@ -1,114 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.TestTreeDo = void 0;
13
- const vitest_1 = require("vitest");
14
- const test_tree_1 = require("./test-tree");
15
- class TestTreeDo {
16
- itemInstance(itemId) {
17
- return this.tree.instance.getItemInstance(itemId);
18
- }
19
- itemProps(itemId) {
20
- return this.itemInstance(itemId).getProps();
21
- }
22
- constructor(tree) {
23
- this.tree = tree;
24
- }
25
- selectItem(id) {
26
- this.itemProps(id).onClick({});
27
- }
28
- shiftSelectItem(id) {
29
- this.itemProps(id).onClick({ shiftKey: true });
30
- }
31
- ctrlSelectItem(id) {
32
- this.itemProps(id).onClick({ ctrlKey: true });
33
- }
34
- ctrlShiftSelectItem(id) {
35
- this.itemProps(id).onClick({ shiftKey: true, ctrlKey: true });
36
- }
37
- selectMultiple(...ids) {
38
- ids.forEach((id) => this.ctrlSelectItem(id));
39
- }
40
- hotkey(hotkey, e = {}) {
41
- var _a, _b;
42
- const hotkeyConfig = Object.assign(Object.assign({}, this.tree.instance.getHotkeyPresets()[hotkey]), (_a = this.tree.instance.getConfig().hotkeys) === null || _a === void 0 ? void 0 : _a[hotkey]);
43
- if (hotkeyConfig.isEnabled &&
44
- !((_b = hotkeyConfig.isEnabled) === null || _b === void 0 ? void 0 : _b.call(hotkeyConfig, this.tree.instance))) {
45
- throw new Error(`Hotkey "${hotkey}" is disabled`);
46
- }
47
- if (!hotkeyConfig.handler) {
48
- throw new Error(`Hotkey "${hotkey}" has no handler`);
49
- }
50
- hotkeyConfig.handler(Object.assign(Object.assign({}, e), { stopPropagation: () => { }, preventDefault: () => { } }), this.tree.instance);
51
- }
52
- startDrag(itemId, event) {
53
- if (!this.itemProps(itemId).draggable) {
54
- throw new Error(`Can't drag item ${itemId}, has attribute draggable=false`);
55
- }
56
- const e = event !== null && event !== void 0 ? event : test_tree_1.TestTree.dragEvent();
57
- this.itemProps(itemId).onDragStart(e);
58
- return e;
59
- }
60
- dragOver(itemId, event) {
61
- const e = event !== null && event !== void 0 ? event : test_tree_1.TestTree.dragEvent();
62
- e.preventDefault.mockClear();
63
- this.itemProps(itemId).onDragOver(e);
64
- this.itemProps(itemId).onDragOver(e);
65
- this.itemProps(itemId).onDragOver(e);
66
- (0, vitest_1.expect)(e.preventDefault).toBeCalledTimes(3);
67
- this.consistentCalls(e.preventDefault);
68
- this.consistentCalls(e.stopPropagation);
69
- return e;
70
- }
71
- dragOverNotAllowed(itemId, event) {
72
- const e = event !== null && event !== void 0 ? event : test_tree_1.TestTree.dragEvent();
73
- e.preventDefault.mockClear();
74
- this.itemProps(itemId).onDragOver(e);
75
- this.itemProps(itemId).onDragOver(e);
76
- this.itemProps(itemId).onDragOver(e);
77
- (0, vitest_1.expect)(e.preventDefault).toBeCalledTimes(0);
78
- this.consistentCalls(e.preventDefault);
79
- this.consistentCalls(e.stopPropagation);
80
- return e;
81
- }
82
- dragLeave(itemId) {
83
- this.itemProps(itemId).onDragLeave({});
84
- }
85
- dragEnd(itemId, event) {
86
- const e = event !== null && event !== void 0 ? event : test_tree_1.TestTree.dragEvent();
87
- this.itemProps(itemId).onDragEnd(e);
88
- window.dispatchEvent(new CustomEvent("dragend"));
89
- return e;
90
- }
91
- drop(itemId, event) {
92
- return __awaiter(this, void 0, void 0, function* () {
93
- const e = event !== null && event !== void 0 ? event : test_tree_1.TestTree.dragEvent();
94
- yield this.itemProps(itemId).onDrop(e);
95
- window.dispatchEvent(new CustomEvent("dragend"));
96
- return e;
97
- });
98
- }
99
- dragOverAndDrop(itemId, event) {
100
- return __awaiter(this, void 0, void 0, function* () {
101
- const e = event !== null && event !== void 0 ? event : test_tree_1.TestTree.dragEvent();
102
- this.dragOver(itemId, e);
103
- return this.drop(itemId, e);
104
- });
105
- }
106
- consistentCalls(fn) {
107
- if (!vitest_1.vi.isMockFunction(fn)) {
108
- throw new Error("fn is not a mock");
109
- }
110
- (0, vitest_1.expect)(fn.mock.calls.length, "function called inconsistent times").toBeOneOf([0, 3]);
111
- (0, vitest_1.expect)(new Set(fn.mock.calls.map((call) => call.join("__"))).size, "function called with inconsistent parameters").toBeOneOf([0, 1]);
112
- }
113
- }
114
- exports.TestTreeDo = TestTreeDo;
@@ -1,17 +0,0 @@
1
- import { DragEvent } from "react";
2
- import { TestTree } from "./test-tree";
3
- import { DragTarget } from "../features/drag-and-drop/types";
4
- import { TreeState } from "../types/core";
5
- export declare class TestTreeExpect<T> {
6
- private tree;
7
- protected itemInstance(itemId: string): import("../types/core").ItemInstance<T>;
8
- protected itemProps(itemId: string): Record<string, any>;
9
- constructor(tree: TestTree<T>);
10
- foldersExpanded(...itemIds: string[]): void;
11
- foldersCollapsed(...itemIds: string[]): void;
12
- hasChildren(itemId: string, children: string[]): void;
13
- substate<K extends keyof TreeState<T>>(key: K, value: TreeState<T>[K]): void;
14
- dropped(draggedItems: string[], target: DragTarget<any>): void;
15
- dragOverNotAllowed(itemId: string, event?: DragEvent): DragEvent<Element>;
16
- defaultDragLineProps(indent?: number): void;
17
- }
@@ -1,66 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TestTreeExpect = void 0;
4
- /* eslint-disable import/no-extraneous-dependencies */
5
- const vitest_1 = require("vitest");
6
- const test_tree_1 = require("./test-tree");
7
- class TestTreeExpect {
8
- itemInstance(itemId) {
9
- return this.tree.instance.getItemInstance(itemId);
10
- }
11
- itemProps(itemId) {
12
- return this.itemInstance(itemId).getProps();
13
- }
14
- constructor(tree) {
15
- this.tree = tree;
16
- }
17
- foldersExpanded(...itemIds) {
18
- for (const itemId of itemIds) {
19
- (0, vitest_1.expect)(this.tree.instance.getItemInstance(itemId).isExpanded(), `Expected ${itemId} to be expanded`).toBe(true);
20
- }
21
- }
22
- foldersCollapsed(...itemIds) {
23
- for (const itemId of itemIds) {
24
- (0, vitest_1.expect)(this.tree.instance.getItemInstance(itemId).isExpanded(), `Expected ${itemId} to be collapsed`).toBe(false);
25
- }
26
- }
27
- hasChildren(itemId, children) {
28
- const item = this.tree.instance.getItemInstance(itemId);
29
- const itemChildren = item.getChildren().map((child) => child.getId());
30
- (0, vitest_1.expect)(itemChildren).toEqual(children);
31
- }
32
- substate(key, value) {
33
- (0, vitest_1.expect)(this.tree.instance.getState()[key]).toEqual(value);
34
- }
35
- dropped(draggedItems, target) {
36
- (0, vitest_1.expect)(this.tree.instance.getConfig().onDrop).toBeCalledWith(draggedItems.map((id) => this.tree.item(id)), target);
37
- }
38
- dragOverNotAllowed(itemId, event) {
39
- const e = event !== null && event !== void 0 ? event : test_tree_1.TestTree.dragEvent();
40
- e.preventDefault.mockClear();
41
- this.itemProps(itemId).onDragOver(e);
42
- this.itemProps(itemId).onDragOver(e);
43
- this.itemProps(itemId).onDragOver(e);
44
- (0, vitest_1.expect)(e.preventDefault, "onDragOver shouldn't call e.preventDefault if drag is not allowed").not.toBeCalled();
45
- this.itemProps(itemId).onDrop(e);
46
- (0, vitest_1.expect)(e.preventDefault, "onDrop shouldn't call e.preventDefault if drag is not allowed").not.toBeCalled();
47
- (0, vitest_1.expect)(this.tree.instance.getConfig().onDrop, "onDrop handler shouldn't be called if drag is not allowed").not.toBeCalled();
48
- return e;
49
- }
50
- defaultDragLineProps(indent = 0) {
51
- (0, vitest_1.expect)(this.tree.instance.getDragLineData()).toEqual({
52
- indent,
53
- left: indent * 20,
54
- width: 100 - indent * 20,
55
- top: 0,
56
- });
57
- (0, vitest_1.expect)(this.tree.instance.getDragLineStyle(0, 0)).toEqual({
58
- position: "absolute",
59
- left: `${indent * 20}px`,
60
- pointerEvents: "none",
61
- top: "0px",
62
- width: `${100 - indent * 20}px`,
63
- });
64
- }
65
- }
66
- exports.TestTreeExpect = TestTreeExpect;
@@ -1,48 +0,0 @@
1
- import { DragEvent } from "react";
2
- import { TreeConfig, TreeInstance } from "../types/core";
3
- import { TestTreeDo } from "./test-tree-do";
4
- import { TestTreeExpect } from "./test-tree-expect";
5
- export declare class TestTree<T = string> {
6
- private config;
7
- readonly do: TestTreeDo<T>;
8
- readonly expect: TestTreeExpect<T>;
9
- private treeInstance;
10
- private static asyncLoaderResolvers;
11
- private asyncDataLoaderImp;
12
- suits: {
13
- sync: () => {
14
- tree: TestTree<T>;
15
- title: string;
16
- };
17
- async: () => {
18
- tree: TestTree<T>;
19
- title: string;
20
- };
21
- proxifiedSync: () => {
22
- tree: TestTree<T>;
23
- title: string;
24
- };
25
- proxifiedAsync: () => {
26
- tree: TestTree<T>;
27
- title: string;
28
- };
29
- };
30
- forSuits(runSuite: (tree: TestTree<T>) => void): void;
31
- get instance(): TreeInstance<T>;
32
- private constructor();
33
- static resolveAsyncLoaders(): Promise<void>;
34
- resolveAsyncVisibleItems(): Promise<void>;
35
- static default(config: Partial<TreeConfig<string>>): TestTree<string>;
36
- with(config: Partial<TreeConfig<T>>): TestTree<T>;
37
- resetBeforeEach(): void;
38
- createTestCaseTree(): Promise<this>;
39
- withFeatures(...features: any): TestTree<T>;
40
- mockedHandler(handlerName: keyof TreeConfig<T>): import("vitest").Mock<(...args: any[]) => any>;
41
- item(itemId: string): import("../types/core").ItemInstance<T>;
42
- reset(): void;
43
- debug(): void;
44
- setElementBoundingBox(itemId: string, bb?: Partial<DOMRect>): void;
45
- static dragEvent(clientX?: number, clientY?: number): DragEvent;
46
- createTopDragEvent(indent?: number): DragEvent<Element>;
47
- createBottomDragEvent(indent?: number): DragEvent<Element>;
48
- }
@@ -1,208 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.TestTree = void 0;
13
- /* eslint-disable import/no-extraneous-dependencies */
14
- const vitest_1 = require("vitest");
15
- const create_tree_1 = require("../core/create-tree");
16
- const test_tree_do_1 = require("./test-tree-do");
17
- const test_tree_expect_1 = require("./test-tree-expect");
18
- const feature_1 = require("../features/sync-data-loader/feature");
19
- const feature_2 = require("../features/async-data-loader/feature");
20
- const build_proxified_instance_1 = require("../core/build-proxified-instance");
21
- vitest_1.vi.useFakeTimers({ shouldAdvanceTime: true });
22
- class TestTree {
23
- forSuits(runSuite) {
24
- vitest_1.describe.for([
25
- this.suits.sync(),
26
- this.suits.async(),
27
- this.suits.proxifiedSync(),
28
- this.suits.proxifiedAsync(),
29
- ])("$title", ({ tree }) => {
30
- tree.resetBeforeEach();
31
- runSuite(tree);
32
- });
33
- }
34
- get instance() {
35
- if (!this.treeInstance) {
36
- this.treeInstance = (0, create_tree_1.createTree)(this.config);
37
- this.treeInstance.rebuildTree();
38
- }
39
- return this.treeInstance;
40
- }
41
- constructor(config) {
42
- this.config = config;
43
- this.do = new test_tree_do_1.TestTreeDo(this);
44
- this.expect = new test_tree_expect_1.TestTreeExpect(this);
45
- this.treeInstance = null;
46
- this.asyncDataLoaderImp = {
47
- getItem: (id) => __awaiter(this, void 0, void 0, function* () {
48
- yield new Promise((r) => {
49
- r.debugName = `Loading getItem ${id}`;
50
- TestTree.asyncLoaderResolvers.push(r);
51
- });
52
- return id;
53
- }),
54
- getChildren: (id) => __awaiter(this, void 0, void 0, function* () {
55
- yield new Promise((r) => {
56
- r.debugName = `Loading getChildren ${id}`;
57
- TestTree.asyncLoaderResolvers.push(r);
58
- });
59
- return [`${id}1`, `${id}2`, `${id}3`, `${id}4`];
60
- }),
61
- };
62
- this.suits = {
63
- sync: () => ({
64
- tree: this.withFeatures(feature_1.syncDataLoaderFeature),
65
- title: "Synchronous Data Loader",
66
- }),
67
- async: () => ({
68
- tree: this.withFeatures(feature_2.asyncDataLoaderFeature).with({
69
- dataLoader: this.asyncDataLoaderImp,
70
- }),
71
- title: "Asynchronous Data Loader",
72
- }),
73
- proxifiedSync: () => ({
74
- tree: this.withFeatures(feature_1.syncDataLoaderFeature).with({
75
- instanceBuilder: build_proxified_instance_1.buildProxiedInstance,
76
- }),
77
- title: "Proxified Synchronous Data Loader",
78
- }),
79
- proxifiedAsync: () => ({
80
- tree: this.withFeatures(feature_2.asyncDataLoaderFeature).with({
81
- instanceBuilder: build_proxified_instance_1.buildProxiedInstance,
82
- }),
83
- title: "Proxified Asynchronous Data Loader",
84
- }),
85
- };
86
- }
87
- static resolveAsyncLoaders() {
88
- return __awaiter(this, void 0, void 0, function* () {
89
- var _a;
90
- do {
91
- (_a = TestTree.asyncLoaderResolvers.shift()) === null || _a === void 0 ? void 0 : _a();
92
- yield new Promise((r) => {
93
- setTimeout(r);
94
- });
95
- } while (TestTree.asyncLoaderResolvers.length);
96
- });
97
- }
98
- resolveAsyncVisibleItems() {
99
- return __awaiter(this, void 0, void 0, function* () {
100
- this.instance.getItems();
101
- yield TestTree.resolveAsyncLoaders();
102
- this.instance.getItems().forEach((i) => i.getItemName());
103
- yield TestTree.resolveAsyncLoaders();
104
- });
105
- }
106
- static default(config) {
107
- return new TestTree(Object.assign({ rootItemId: "x", createLoadingItemData: () => "loading", dataLoader: {
108
- getItem: (id) => id,
109
- getChildren: (id) => [`${id}1`, `${id}2`, `${id}3`, `${id}4`],
110
- }, getItemName: (item) => item.getItemData(), indent: 20, isItemFolder: (item) => item.getItemMeta().level < 2, initialState: {
111
- expandedItems: ["x1", "x11"],
112
- }, features: [] }, config));
113
- }
114
- with(config) {
115
- return new TestTree(Object.assign(Object.assign({}, this.config), config));
116
- }
117
- resetBeforeEach() {
118
- (0, vitest_1.beforeEach)(() => __awaiter(this, void 0, void 0, function* () {
119
- yield this.createTestCaseTree();
120
- }));
121
- }
122
- createTestCaseTree() {
123
- return __awaiter(this, void 0, void 0, function* () {
124
- this.reset();
125
- vitest_1.vi.clearAllMocks();
126
- // trigger instance creation
127
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
128
- this.instance;
129
- yield this.resolveAsyncVisibleItems();
130
- this.instance.registerElement({ getBoundingClientRect: () => null });
131
- return this;
132
- });
133
- }
134
- withFeatures(...features) {
135
- var _a;
136
- return this.with({
137
- features: [...((_a = this.config.features) !== null && _a !== void 0 ? _a : []), ...features],
138
- });
139
- }
140
- mockedHandler(handlerName) {
141
- var _a;
142
- const mock = vitest_1.vi.fn();
143
- if (this.treeInstance) {
144
- (_a = this.treeInstance) === null || _a === void 0 ? void 0 : _a.setConfig((prev) => (Object.assign(Object.assign({}, prev), { [handlerName]: mock })));
145
- }
146
- else {
147
- this.config[handlerName] = mock;
148
- }
149
- return mock;
150
- }
151
- item(itemId) {
152
- return this.instance.getItemInstance(itemId);
153
- }
154
- reset() {
155
- this.treeInstance = null;
156
- TestTree.asyncLoaderResolvers = [];
157
- }
158
- debug() {
159
- console.log(this.instance
160
- .getItems()
161
- .map((item) => [
162
- " ".repeat(item.getItemMeta().level),
163
- '"',
164
- item.getItemName(),
165
- '"',
166
- ].join(""))
167
- .join("\n"));
168
- }
169
- setElementBoundingBox(itemId, bb = {
170
- left: 0,
171
- width: 100,
172
- top: 0,
173
- height: 20,
174
- }) {
175
- this.instance.registerElement({
176
- getBoundingClientRect: () => ({
177
- left: 0,
178
- width: 100,
179
- top: 0,
180
- height: 10000,
181
- }),
182
- });
183
- this.instance.getItemInstance(itemId).registerElement({
184
- getBoundingClientRect: () => bb,
185
- });
186
- }
187
- static dragEvent(clientX = 1000, clientY = 0) {
188
- return {
189
- preventDefault: vitest_1.vi.fn(),
190
- stopPropagation: vitest_1.vi.fn(),
191
- dataTransfer: {
192
- setData: vitest_1.vi.fn(),
193
- getData: vitest_1.vi.fn(),
194
- dropEffect: "unchaged-from-test",
195
- },
196
- clientX,
197
- clientY,
198
- };
199
- }
200
- createTopDragEvent(indent = 0) {
201
- return TestTree.dragEvent(indent * 20, 1);
202
- }
203
- createBottomDragEvent(indent = 0) {
204
- return TestTree.dragEvent(indent * 20, 19);
205
- }
206
- }
207
- exports.TestTree = TestTree;
208
- TestTree.asyncLoaderResolvers = [];
@@ -1,84 +0,0 @@
1
- import { DragAndDropFeatureDef } from "../features/drag-and-drop/types";
2
- import { MainFeatureDef } from "../features/main/types";
3
- import { SelectionFeatureDef } from "../features/selection/types";
4
- import { TreeFeatureDef } from "../features/tree/types";
5
- import { HotkeyConfig, HotkeysCoreFeatureDef } from "../features/hotkeys-core/types";
6
- import { SyncDataLoaderFeatureDef } from "../features/sync-data-loader/types";
7
- import { AsyncDataLoaderFeatureDef } from "../features/async-data-loader/types";
8
- import { SearchFeatureDef } from "../features/search/types";
9
- import { RenamingFeatureDef } from "../features/renaming/types";
10
- import { ExpandAllFeatureDef } from "../features/expand-all/types";
11
- import { PropMemoizationFeatureDef } from "../features/prop-memoization/types";
12
- import { KeyboardDragAndDropFeatureDef } from "../features/keyboard-drag-and-drop/types";
13
- import { CheckboxesFeatureDef } from "../features/checkboxes/types";
14
- export type Updater<T> = T | ((old: T) => T);
15
- export type SetStateFn<T> = (updaterOrValue: Updater<T>) => void;
16
- export type FeatureDef = {
17
- state: any;
18
- config: any;
19
- treeInstance: any;
20
- itemInstance: any;
21
- hotkeys: string;
22
- };
23
- export type EmptyFeatureDef = {
24
- state: {};
25
- config: {};
26
- treeInstance: {};
27
- itemInstance: {};
28
- hotkeys: never;
29
- };
30
- type UnionToIntersection<T> = (T extends any ? (x: T) => any : never) extends (x: infer R) => any ? R : never;
31
- type MergedFeatures<F extends FeatureDef> = {
32
- state: UnionToIntersection<F["state"]>;
33
- config: UnionToIntersection<F["config"]>;
34
- treeInstance: UnionToIntersection<F["treeInstance"]>;
35
- itemInstance: UnionToIntersection<F["itemInstance"]>;
36
- hotkeys: F["hotkeys"];
37
- };
38
- export type RegisteredFeatures<T> = MainFeatureDef<T> | TreeFeatureDef<T> | SelectionFeatureDef<T> | CheckboxesFeatureDef<T> | DragAndDropFeatureDef<T> | KeyboardDragAndDropFeatureDef<T> | HotkeysCoreFeatureDef<T> | SyncDataLoaderFeatureDef<T> | AsyncDataLoaderFeatureDef<T> | SearchFeatureDef<T> | RenamingFeatureDef<T> | ExpandAllFeatureDef | PropMemoizationFeatureDef;
39
- type TreeStateType<T> = MergedFeatures<RegisteredFeatures<T>>["state"];
40
- export interface TreeState<T> extends TreeStateType<T> {
41
- }
42
- type TreeConfigType<T> = MergedFeatures<RegisteredFeatures<T>>["config"];
43
- export interface TreeConfig<T> extends TreeConfigType<T> {
44
- }
45
- type TreeInstanceType<T> = MergedFeatures<RegisteredFeatures<T>>["treeInstance"];
46
- export interface TreeInstance<T> extends TreeInstanceType<T> {
47
- }
48
- type ItemInstanceType<T> = MergedFeatures<RegisteredFeatures<T>>["itemInstance"];
49
- export interface ItemInstance<T> extends ItemInstanceType<T> {
50
- }
51
- export type HotkeyName = MergedFeatures<RegisteredFeatures<any>>["hotkeys"];
52
- export type HotkeysConfig<T> = Record<HotkeyName, HotkeyConfig<T>>;
53
- export type CustomHotkeysConfig<T> = Partial<Record<HotkeyName | `custom${string}`, Partial<HotkeyConfig<T>>>>;
54
- type MayReturnNull<T extends (...x: any[]) => any> = (...args: Parameters<T>) => ReturnType<T> | null;
55
- export type ItemInstanceOpts<Key extends keyof ItemInstance<any>> = {
56
- item: ItemInstance<any>;
57
- tree: TreeInstance<any>;
58
- itemId: string;
59
- prev?: MayReturnNull<ItemInstance<any>[Key]>;
60
- };
61
- export type TreeInstanceOpts<Key extends keyof TreeInstance<any>> = {
62
- tree: TreeInstance<any>;
63
- prev?: MayReturnNull<TreeInstance<any>[Key]>;
64
- };
65
- export type FeatureImplementation<T = any> = {
66
- key?: string;
67
- deps?: string[];
68
- overwrites?: string[];
69
- stateHandlerNames?: Partial<Record<keyof TreeState<T>, keyof TreeConfig<T>>>;
70
- getInitialState?: (initialState: Partial<TreeState<T>>, tree: TreeInstance<T>) => Partial<TreeState<T>>;
71
- getDefaultConfig?: (defaultConfig: Partial<TreeConfig<T>>, tree: TreeInstance<T>) => Partial<TreeConfig<T>>;
72
- treeInstance?: {
73
- [key in keyof TreeInstance<T>]?: (opts: TreeInstanceOpts<key>, ...args: Parameters<TreeInstance<T>[key]>) => void;
74
- };
75
- itemInstance?: {
76
- [key in keyof ItemInstance<T>]?: (opts: ItemInstanceOpts<key>, ...args: Parameters<ItemInstance<T>[key]>) => void;
77
- };
78
- onTreeMount?: (instance: TreeInstance<T>, treeElement: HTMLElement) => void;
79
- onTreeUnmount?: (instance: TreeInstance<T>, treeElement: HTMLElement) => void;
80
- onItemMount?: (instance: ItemInstance<T>, itemElement: HTMLElement, tree: TreeInstance<T>) => void;
81
- onItemUnmount?: (instance: ItemInstance<T>, itemElement: HTMLElement, tree: TreeInstance<T>) => void;
82
- hotkeys?: Partial<HotkeysConfig<T>>;
83
- };
84
- export {};
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,13 +0,0 @@
1
- type TAllKeys<T> = T extends any ? keyof T : never;
2
- type TIndexValue<T, K extends PropertyKey, D = never> = T extends any ? K extends keyof T ? T[K] : D : never;
3
- type TPartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>> extends infer O ? {
4
- [P in keyof O]: O[P];
5
- } : never;
6
- type TFunction = (...a: any[]) => any;
7
- type TPrimitives = string | number | boolean | bigint | symbol | Date | TFunction;
8
- export type TMerged<T> = [T] extends [Array<any>] ? {
9
- [K in keyof T]: TMerged<T[K]>;
10
- } : [T] extends [TPrimitives] ? T : [T] extends [object] ? TPartialKeys<{
11
- [K in TAllKeys<T>]: TMerged<TIndexValue<T, K>>;
12
- }, never> : T;
13
- export {};
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,3 +0,0 @@
1
- import { ItemInstance } from "../types/core";
2
- import { DragTarget } from "../features/drag-and-drop/types";
3
- export declare const createOnDropHandler: <T>(onChangeChildren: (item: ItemInstance<T>, newChildren: string[]) => void) => (items: ItemInstance<T>[], target: DragTarget<T>) => Promise<void>;
@@ -1,20 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.createOnDropHandler = void 0;
13
- const remove_items_from_parents_1 = require("./remove-items-from-parents");
14
- const insert_items_at_target_1 = require("./insert-items-at-target");
15
- const createOnDropHandler = (onChangeChildren) => (items, target) => __awaiter(void 0, void 0, void 0, function* () {
16
- const itemIds = items.map((item) => item.getId());
17
- yield (0, remove_items_from_parents_1.removeItemsFromParents)(items, onChangeChildren);
18
- yield (0, insert_items_at_target_1.insertItemsAtTarget)(itemIds, target, onChangeChildren);
19
- });
20
- exports.createOnDropHandler = createOnDropHandler;
@@ -1,2 +0,0 @@
1
- export declare const throwError: (message: string) => Error;
2
- export declare const logWarning: (message: string) => void;
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.logWarning = exports.throwError = void 0;
4
- const prefix = "Headless Tree: ";
5
- const throwError = (message) => Error(prefix + message);
6
- exports.throwError = throwError;
7
- // eslint-disable-next-line no-console
8
- const logWarning = (message) => console.warn(prefix + message);
9
- exports.logWarning = logWarning;
@@ -1,3 +0,0 @@
1
- import { ItemInstance } from "../types/core";
2
- import { DragTarget } from "../features/drag-and-drop/types";
3
- export declare const insertItemsAtTarget: <T>(itemIds: string[], target: DragTarget<T>, onChangeChildren: (item: ItemInstance<T>, newChildrenIds: string[]) => Promise<void> | void) => Promise<void>;
@@ -1,40 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.insertItemsAtTarget = void 0;
13
- const insertItemsAtTarget = (itemIds, target, onChangeChildren) => __awaiter(void 0, void 0, void 0, function* () {
14
- yield target.item.getTree().waitForItemChildrenLoaded(target.item.getId());
15
- const oldChildrenIds = target.item
16
- .getTree()
17
- .retrieveChildrenIds(target.item.getId());
18
- // add moved items to new common parent, if dropped onto parent
19
- if (!("childIndex" in target)) {
20
- const newChildren = [...oldChildrenIds, ...itemIds];
21
- yield onChangeChildren(target.item, newChildren);
22
- if (target.item && "updateCachedChildrenIds" in target.item) {
23
- target.item.updateCachedChildrenIds(newChildren);
24
- }
25
- target.item.getTree().rebuildTree();
26
- return;
27
- }
28
- // add moved items to new common parent, if dropped between siblings
29
- const newChildren = [
30
- ...oldChildrenIds.slice(0, target.insertionIndex),
31
- ...itemIds,
32
- ...oldChildrenIds.slice(target.insertionIndex),
33
- ];
34
- yield onChangeChildren(target.item, newChildren);
35
- if (target.item && "updateCachedChildrenIds" in target.item) {
36
- target.item.updateCachedChildrenIds(newChildren);
37
- }
38
- target.item.getTree().rebuildTree();
39
- });
40
- exports.insertItemsAtTarget = insertItemsAtTarget;
@@ -1,2 +0,0 @@
1
- import { ItemInstance } from "../types/core";
2
- export declare const removeItemsFromParents: <T>(movedItems: ItemInstance<T>[], onChangeChildren: (item: ItemInstance<T>, newChildrenIds: string[]) => void | Promise<void>) => Promise<void>;