@weser/tree 2.0.0 → 2.0.1
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.
- package/dist/__tests__/add.test.d.ts +2 -0
- package/dist/__tests__/add.test.d.ts.map +1 -0
- package/dist/__tests__/add.test.js +48 -0
- package/dist/__tests__/add.test.js.map +1 -0
- package/dist/__tests__/clone.test.d.ts +2 -0
- package/dist/__tests__/clone.test.d.ts.map +1 -0
- package/dist/__tests__/clone.test.js +46 -0
- package/dist/__tests__/clone.test.js.map +1 -0
- package/dist/__tests__/create.test.d.ts +2 -0
- package/dist/__tests__/create.test.d.ts.map +1 -0
- package/dist/__tests__/create.test.js +29 -0
- package/dist/__tests__/create.test.js.map +1 -0
- package/dist/__tests__/find.test.d.ts +2 -0
- package/dist/__tests__/find.test.d.ts.map +1 -0
- package/dist/__tests__/find.test.js +36 -0
- package/dist/__tests__/find.test.js.map +1 -0
- package/dist/__tests__/findAll.test.d.ts +2 -0
- package/dist/__tests__/findAll.test.d.ts.map +1 -0
- package/dist/__tests__/findAll.test.js +34 -0
- package/dist/__tests__/findAll.test.js.map +1 -0
- package/dist/__tests__/get.test.d.ts +2 -0
- package/dist/__tests__/get.test.d.ts.map +1 -0
- package/dist/__tests__/get.test.js +34 -0
- package/dist/__tests__/get.test.js.map +1 -0
- package/dist/__tests__/getParent.test.d.ts +2 -0
- package/dist/__tests__/getParent.test.d.ts.map +1 -0
- package/dist/__tests__/getParent.test.js +33 -0
- package/dist/__tests__/getParent.test.js.map +1 -0
- package/dist/__tests__/helpers.d.ts +9 -0
- package/dist/__tests__/helpers.d.ts.map +1 -0
- package/dist/__tests__/helpers.js +34 -0
- package/dist/__tests__/helpers.js.map +1 -0
- package/dist/__tests__/insert.test.d.ts +2 -0
- package/dist/__tests__/insert.test.d.ts.map +1 -0
- package/dist/__tests__/insert.test.js +49 -0
- package/dist/__tests__/insert.test.js.map +1 -0
- package/dist/__tests__/move.test.d.ts +2 -0
- package/dist/__tests__/move.test.d.ts.map +1 -0
- package/dist/__tests__/move.test.js +48 -0
- package/dist/__tests__/move.test.js.map +1 -0
- package/dist/__tests__/remove.test.d.ts +2 -0
- package/dist/__tests__/remove.test.d.ts.map +1 -0
- package/dist/__tests__/remove.test.js +43 -0
- package/dist/__tests__/remove.test.js.map +1 -0
- package/dist/__tests__/replace.test.d.ts +2 -0
- package/dist/__tests__/replace.test.d.ts.map +1 -0
- package/dist/__tests__/replace.test.js +48 -0
- package/dist/__tests__/replace.test.js.map +1 -0
- package/dist/__tests__/traverse.test.d.ts +2 -0
- package/dist/__tests__/traverse.test.d.ts.map +1 -0
- package/dist/__tests__/traverse.test.js +55 -0
- package/dist/__tests__/traverse.test.js.map +1 -0
- package/dist/__tests__/update.test.d.ts +2 -0
- package/dist/__tests__/update.test.d.ts.map +1 -0
- package/dist/__tests__/update.test.js +41 -0
- package/dist/__tests__/update.test.js.map +1 -0
- package/dist/add.d.ts +2 -1
- package/dist/add.d.ts.map +1 -0
- package/dist/add.js +3 -2
- package/dist/add.js.map +1 -0
- package/dist/clone.d.ts +2 -1
- package/dist/clone.d.ts.map +1 -0
- package/dist/clone.js +2 -1
- package/dist/clone.js.map +1 -0
- package/dist/create.d.ts +2 -1
- package/dist/create.d.ts.map +1 -0
- package/dist/create.js +1 -0
- package/dist/create.js.map +1 -0
- package/dist/find.d.ts +2 -1
- package/dist/find.d.ts.map +1 -0
- package/dist/find.js +1 -0
- package/dist/find.js.map +1 -0
- package/dist/findAll.d.ts +2 -1
- package/dist/findAll.d.ts.map +1 -0
- package/dist/findAll.js +1 -0
- package/dist/findAll.js.map +1 -0
- package/dist/get.d.ts +2 -1
- package/dist/get.d.ts.map +1 -0
- package/dist/get.js +1 -0
- package/dist/get.js.map +1 -0
- package/dist/getParent.d.ts +2 -1
- package/dist/getParent.d.ts.map +1 -0
- package/dist/getParent.js +2 -1
- package/dist/getParent.js.map +1 -0
- package/dist/index.d.ts +15 -14
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -14
- package/dist/index.js.map +1 -0
- package/dist/insert.d.ts +2 -1
- package/dist/insert.d.ts.map +1 -0
- package/dist/insert.js +3 -2
- package/dist/insert.js.map +1 -0
- package/dist/move.d.ts +2 -1
- package/dist/move.d.ts.map +1 -0
- package/dist/move.js +4 -3
- package/dist/move.js.map +1 -0
- package/dist/remove.d.ts +2 -1
- package/dist/remove.d.ts.map +1 -0
- package/dist/remove.js +1 -0
- package/dist/remove.js.map +1 -0
- package/dist/replace.d.ts +2 -1
- package/dist/replace.d.ts.map +1 -0
- package/dist/replace.js +2 -1
- package/dist/replace.js.map +1 -0
- package/dist/traverse.d.ts +2 -1
- package/dist/traverse.d.ts.map +1 -0
- package/dist/traverse.js +1 -0
- package/dist/traverse.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/update.d.ts +2 -1
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +3 -2
- package/dist/update.js.map +1 -0
- package/package.json +8 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/add.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { describe, test, expect } from 'vitest';
|
|
2
|
+
import add from '../add';
|
|
3
|
+
import get from '../get';
|
|
4
|
+
import { createTestTree, createSimpleNode } from './helpers';
|
|
5
|
+
describe('add', () => {
|
|
6
|
+
test('adds child to parent node', () => {
|
|
7
|
+
const tree = createTestTree();
|
|
8
|
+
const newNode = createSimpleNode('new-node', 'New Node');
|
|
9
|
+
const result = add(tree, 'root', newNode);
|
|
10
|
+
const added = get(result, 'new-node');
|
|
11
|
+
expect(added?.name).toBe('New Node');
|
|
12
|
+
});
|
|
13
|
+
test('adds child at end of children array', () => {
|
|
14
|
+
const tree = createTestTree();
|
|
15
|
+
const newNode = createSimpleNode('new-node', 'New Node');
|
|
16
|
+
const result = add(tree, 'root', newNode);
|
|
17
|
+
const parent = get(result, 'root');
|
|
18
|
+
expect(parent?.children?.at(-1)?.id).toBe('new-node');
|
|
19
|
+
});
|
|
20
|
+
test('adds child to nested node', () => {
|
|
21
|
+
const tree = createTestTree();
|
|
22
|
+
const newNode = createSimpleNode('new-grandchild', 'New Grandchild');
|
|
23
|
+
const result = add(tree, 'child1', newNode);
|
|
24
|
+
const parent = get(result, 'child1');
|
|
25
|
+
expect(parent?.children).toHaveLength(3);
|
|
26
|
+
expect(parent?.children?.at(-1)?.id).toBe('new-grandchild');
|
|
27
|
+
});
|
|
28
|
+
test('returns unchanged tree if parent not found', () => {
|
|
29
|
+
const tree = createTestTree();
|
|
30
|
+
const newNode = createSimpleNode('new-node', 'New Node');
|
|
31
|
+
const result = add(tree, 'non-existent', newNode);
|
|
32
|
+
expect(result).toBe(tree);
|
|
33
|
+
});
|
|
34
|
+
test('returns unchanged tree if parent has no children array', () => {
|
|
35
|
+
const tree = createTestTree();
|
|
36
|
+
const newNode = createSimpleNode('new-node', 'New Node');
|
|
37
|
+
const result = add(tree, 'grandchild1', newNode);
|
|
38
|
+
expect(result).toBe(tree);
|
|
39
|
+
});
|
|
40
|
+
test('can add to empty children array', () => {
|
|
41
|
+
const tree = createTestTree();
|
|
42
|
+
const newNode = createSimpleNode('new-node', 'New Node');
|
|
43
|
+
const result = add(tree, 'child2', newNode);
|
|
44
|
+
const parent = get(result, 'child2');
|
|
45
|
+
expect(parent?.children).toHaveLength(1);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=add.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.test.js","sourceRoot":"","sources":["../../src/__tests__/add.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/clone.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { describe, test, expect } from 'vitest';
|
|
2
|
+
import clone from '../clone';
|
|
3
|
+
import { createTestTree } from './helpers';
|
|
4
|
+
describe('clone', () => {
|
|
5
|
+
test('clones node with new id', () => {
|
|
6
|
+
const tree = createTestTree();
|
|
7
|
+
const cloned = clone(tree, 'child1');
|
|
8
|
+
expect(cloned).not.toBeNull();
|
|
9
|
+
expect(cloned?.id).not.toBe('child1');
|
|
10
|
+
expect(cloned?.name).toBe('Child 1');
|
|
11
|
+
});
|
|
12
|
+
test('clones all descendants with new ids', () => {
|
|
13
|
+
const tree = createTestTree();
|
|
14
|
+
const cloned = clone(tree, 'child1');
|
|
15
|
+
expect(cloned?.children).toHaveLength(2);
|
|
16
|
+
expect(cloned?.children?.[0].id).not.toBe('grandchild1');
|
|
17
|
+
expect(cloned?.children?.[1].id).not.toBe('grandchild2');
|
|
18
|
+
});
|
|
19
|
+
test('preserves structure', () => {
|
|
20
|
+
const tree = createTestTree();
|
|
21
|
+
const cloned = clone(tree, 'child1');
|
|
22
|
+
expect(cloned?.children).toHaveLength(2);
|
|
23
|
+
expect(cloned?.children?.[0].name).toBe('Grandchild 1');
|
|
24
|
+
expect(cloned?.children?.[1].name).toBe('Grandchild 2');
|
|
25
|
+
});
|
|
26
|
+
test('returns null for non-existent node', () => {
|
|
27
|
+
const tree = createTestTree();
|
|
28
|
+
const cloned = clone(tree, 'non-existent');
|
|
29
|
+
expect(cloned).toBeNull();
|
|
30
|
+
});
|
|
31
|
+
test('clones leaf node', () => {
|
|
32
|
+
const tree = createTestTree();
|
|
33
|
+
const cloned = clone(tree, 'grandchild1');
|
|
34
|
+
expect(cloned).not.toBeNull();
|
|
35
|
+
expect(cloned?.id).not.toBe('grandchild1');
|
|
36
|
+
expect(cloned?.name).toBe('Grandchild 1');
|
|
37
|
+
expect(cloned?.children).toBeNull();
|
|
38
|
+
});
|
|
39
|
+
test('cloned tree is independent', () => {
|
|
40
|
+
const tree = createTestTree();
|
|
41
|
+
const cloned = clone(tree, 'root');
|
|
42
|
+
// Verify the clone has different ids
|
|
43
|
+
expect(cloned?.id).not.toBe('root');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=clone.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone.test.js","sourceRoot":"","sources":["../../src/__tests__/clone.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/create.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, test, expect } from 'vitest';
|
|
2
|
+
import create from '../create';
|
|
3
|
+
describe('create', () => {
|
|
4
|
+
test('creates node with auto-generated id', () => {
|
|
5
|
+
const node = create({ name: 'Test', children: null });
|
|
6
|
+
expect(node.id).toBeDefined();
|
|
7
|
+
expect(typeof node.id).toBe('string');
|
|
8
|
+
expect(node.id.length).toBeGreaterThan(0);
|
|
9
|
+
});
|
|
10
|
+
test('preserves other properties', () => {
|
|
11
|
+
const node = create({ name: 'Test Node', children: null });
|
|
12
|
+
expect(node.name).toBe('Test Node');
|
|
13
|
+
expect(node.children).toBeNull();
|
|
14
|
+
});
|
|
15
|
+
test('generates unique ids', () => {
|
|
16
|
+
const node1 = create({ name: 'Node 1', children: null });
|
|
17
|
+
const node2 = create({ name: 'Node 2', children: null });
|
|
18
|
+
expect(node1.id).not.toBe(node2.id);
|
|
19
|
+
});
|
|
20
|
+
test('handles nodes with children', () => {
|
|
21
|
+
const node = create({
|
|
22
|
+
name: 'Parent',
|
|
23
|
+
children: [{ id: 'child', name: 'Child', children: null }],
|
|
24
|
+
});
|
|
25
|
+
expect(node.children).toHaveLength(1);
|
|
26
|
+
expect(node.children[0].id).toBe('child');
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=create.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.test.js","sourceRoot":"","sources":["../../src/__tests__/create.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,MAAM,MAAM,WAAW,CAAA;AAG9B,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAW,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QAE/D,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QAC7B,MAAM,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACrC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,MAAM,CAAW,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QAEpE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACnC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAChC,MAAM,KAAK,GAAG,MAAM,CAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QAClE,MAAM,KAAK,GAAG,MAAM,CAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QAElE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,MAAM,IAAI,GAAG,MAAM,CAAW;YAC5B,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;SAC3D,CAAC,CAAA;QAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACrC,MAAM,CAAC,IAAI,CAAC,QAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/find.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, test, expect } from 'vitest';
|
|
2
|
+
import find from '../find';
|
|
3
|
+
import { createTestTree } from './helpers';
|
|
4
|
+
describe('find', () => {
|
|
5
|
+
test('finds node by condition', () => {
|
|
6
|
+
const tree = createTestTree();
|
|
7
|
+
const result = find(tree, (node) => node.name === 'Child 2');
|
|
8
|
+
expect(result?.id).toBe('child2');
|
|
9
|
+
});
|
|
10
|
+
test('finds root node when condition matches', () => {
|
|
11
|
+
const tree = createTestTree();
|
|
12
|
+
const result = find(tree, (node) => node.name === 'Root');
|
|
13
|
+
expect(result?.id).toBe('root');
|
|
14
|
+
});
|
|
15
|
+
test('finds nested node', () => {
|
|
16
|
+
const tree = createTestTree();
|
|
17
|
+
const result = find(tree, (node) => node.name === 'Grandchild 1');
|
|
18
|
+
expect(result?.id).toBe('grandchild1');
|
|
19
|
+
});
|
|
20
|
+
test('returns null if not found', () => {
|
|
21
|
+
const tree = createTestTree();
|
|
22
|
+
const result = find(tree, (node) => node.name === 'Non-existent');
|
|
23
|
+
expect(result).toBeNull();
|
|
24
|
+
});
|
|
25
|
+
test('returns first matching node', () => {
|
|
26
|
+
const tree = createTestTree();
|
|
27
|
+
const result = find(tree, (node) => node.id.startsWith('child'));
|
|
28
|
+
expect(result?.id).toBe('child1');
|
|
29
|
+
});
|
|
30
|
+
test('works with single node tree', () => {
|
|
31
|
+
const tree = { id: 'single', name: 'Single', children: null };
|
|
32
|
+
const result = find(tree, (node) => node.name === 'Single');
|
|
33
|
+
expect(result?.id).toBe('single');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=find.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find.test.js","sourceRoot":"","sources":["../../src/__tests__/find.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,IAAI,MAAM,SAAS,CAAA;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE1C,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACnC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAA;QAE5D,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAA;QAEzD,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC7B,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,CAAA;QAEjE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,CAAA;QAEjE,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;QAEhE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAA;QAE3D,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findAll.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/findAll.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { describe, test, expect } from 'vitest';
|
|
2
|
+
import findAll from '../findAll';
|
|
3
|
+
import { createTestTree } from './helpers';
|
|
4
|
+
describe('findAll', () => {
|
|
5
|
+
test('finds all matching nodes', () => {
|
|
6
|
+
const tree = createTestTree();
|
|
7
|
+
const result = findAll(tree, (node) => node.id.startsWith('child'));
|
|
8
|
+
expect(result).toHaveLength(3);
|
|
9
|
+
expect(result.map((n) => n.id)).toEqual(['child1', 'child2', 'child3']);
|
|
10
|
+
});
|
|
11
|
+
test('includes root node if matches', () => {
|
|
12
|
+
const tree = createTestTree();
|
|
13
|
+
const result = findAll(tree, (node) => node.name.includes('Root'));
|
|
14
|
+
expect(result).toHaveLength(1);
|
|
15
|
+
expect(result[0].id).toBe('root');
|
|
16
|
+
});
|
|
17
|
+
test('finds nested nodes', () => {
|
|
18
|
+
const tree = createTestTree();
|
|
19
|
+
const result = findAll(tree, (node) => node.id.startsWith('grandchild'));
|
|
20
|
+
expect(result).toHaveLength(2);
|
|
21
|
+
});
|
|
22
|
+
test('returns empty array if none match', () => {
|
|
23
|
+
const tree = createTestTree();
|
|
24
|
+
const result = findAll(tree, (node) => node.name === 'Non-existent');
|
|
25
|
+
expect(result).toEqual([]);
|
|
26
|
+
});
|
|
27
|
+
test('finds all nodes with empty children', () => {
|
|
28
|
+
const tree = createTestTree();
|
|
29
|
+
const result = findAll(tree, (node) => node.children === null || node.children?.length === 0);
|
|
30
|
+
// grandchild1, grandchild2, child2 (empty array), child3 (null)
|
|
31
|
+
expect(result).toHaveLength(4);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=findAll.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findAll.test.js","sourceRoot":"","sources":["../../src/__tests__/findAll.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,OAAO,MAAM,YAAY,CAAA;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE1C,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACpC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;QAEnE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACzC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;QAElE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC9B,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAA;QAExE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,CAAA;QAEpE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,OAAO,CACpB,IAAI,EACJ,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,KAAK,CAAC,CAChE,CAAA;QAED,gEAAgE;QAChE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/get.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { describe, test, expect } from 'vitest';
|
|
2
|
+
import get from '../get';
|
|
3
|
+
import { createTestTree } from './helpers';
|
|
4
|
+
describe('get', () => {
|
|
5
|
+
test('gets root node by id', () => {
|
|
6
|
+
const tree = createTestTree();
|
|
7
|
+
const result = get(tree, 'root');
|
|
8
|
+
expect(result).toBe(tree);
|
|
9
|
+
expect(result?.name).toBe('Root');
|
|
10
|
+
});
|
|
11
|
+
test('gets child node by id', () => {
|
|
12
|
+
const tree = createTestTree();
|
|
13
|
+
const result = get(tree, 'child1');
|
|
14
|
+
expect(result?.id).toBe('child1');
|
|
15
|
+
expect(result?.name).toBe('Child 1');
|
|
16
|
+
});
|
|
17
|
+
test('gets nested node by id', () => {
|
|
18
|
+
const tree = createTestTree();
|
|
19
|
+
const result = get(tree, 'grandchild1');
|
|
20
|
+
expect(result?.id).toBe('grandchild1');
|
|
21
|
+
expect(result?.name).toBe('Grandchild 1');
|
|
22
|
+
});
|
|
23
|
+
test('returns null for non-existent id', () => {
|
|
24
|
+
const tree = createTestTree();
|
|
25
|
+
const result = get(tree, 'non-existent');
|
|
26
|
+
expect(result).toBeNull();
|
|
27
|
+
});
|
|
28
|
+
test('works with tree without children', () => {
|
|
29
|
+
const tree = { id: 'single', name: 'Single', children: null };
|
|
30
|
+
const result = get(tree, 'single');
|
|
31
|
+
expect(result?.id).toBe('single');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=get.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.test.js","sourceRoot":"","sources":["../../src/__tests__/get.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE1C,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;IACnB,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAChC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAEhC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzB,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACjC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAElC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;QAEvC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACtC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC5C,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;QAExC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC5C,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;QAC7D,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAElC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getParent.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/getParent.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { describe, test, expect } from 'vitest';
|
|
2
|
+
import getParent from '../getParent';
|
|
3
|
+
import { createTestTree } from './helpers';
|
|
4
|
+
describe('getParent', () => {
|
|
5
|
+
test('gets parent of child node', () => {
|
|
6
|
+
const tree = createTestTree();
|
|
7
|
+
const result = getParent(tree, 'child1');
|
|
8
|
+
expect(result?.id).toBe('root');
|
|
9
|
+
});
|
|
10
|
+
test('gets parent of nested node', () => {
|
|
11
|
+
const tree = createTestTree();
|
|
12
|
+
const result = getParent(tree, 'grandchild1');
|
|
13
|
+
expect(result?.id).toBe('child1');
|
|
14
|
+
});
|
|
15
|
+
test('returns null for root node', () => {
|
|
16
|
+
const tree = createTestTree();
|
|
17
|
+
const result = getParent(tree, 'root');
|
|
18
|
+
expect(result).toBeNull();
|
|
19
|
+
});
|
|
20
|
+
test('returns null for non-existent node', () => {
|
|
21
|
+
const tree = createTestTree();
|
|
22
|
+
const result = getParent(tree, 'non-existent');
|
|
23
|
+
expect(result).toBeNull();
|
|
24
|
+
});
|
|
25
|
+
test('works with different depth levels', () => {
|
|
26
|
+
const tree = createTestTree();
|
|
27
|
+
const parent1 = getParent(tree, 'grandchild2');
|
|
28
|
+
const parent2 = getParent(tree, 'child2');
|
|
29
|
+
expect(parent1?.id).toBe('child1');
|
|
30
|
+
expect(parent2?.id).toBe('root');
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=getParent.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getParent.test.js","sourceRoot":"","sources":["../../src/__tests__/getParent.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,SAAS,MAAM,cAAc,CAAA;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE1C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAExC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;QAE7C,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAEtC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;QAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAEzC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAClC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type TestNode = {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
children: TestNode[] | null;
|
|
5
|
+
};
|
|
6
|
+
export declare function createTestTree(): TestNode;
|
|
7
|
+
export declare function createSimpleNode(id: string, name: string): TestNode;
|
|
8
|
+
export declare function createParentNode(id: string, name: string, children: TestNode[]): TestNode;
|
|
9
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/__tests__/helpers.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;CAC5B,CAAA;AAED,wBAAgB,cAAc,IAAI,QAAQ,CAyBzC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAEnE;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,EAAE,GACnB,QAAQ,CAEV"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Shared test helpers and fixtures for tree tests
|
|
2
|
+
export function createTestTree() {
|
|
3
|
+
return {
|
|
4
|
+
id: 'root',
|
|
5
|
+
name: 'Root',
|
|
6
|
+
children: [
|
|
7
|
+
{
|
|
8
|
+
id: 'child1',
|
|
9
|
+
name: 'Child 1',
|
|
10
|
+
children: [
|
|
11
|
+
{ id: 'grandchild1', name: 'Grandchild 1', children: null },
|
|
12
|
+
{ id: 'grandchild2', name: 'Grandchild 2', children: null },
|
|
13
|
+
],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: 'child2',
|
|
17
|
+
name: 'Child 2',
|
|
18
|
+
children: [],
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: 'child3',
|
|
22
|
+
name: 'Child 3',
|
|
23
|
+
children: null,
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function createSimpleNode(id, name) {
|
|
29
|
+
return { id, name, children: null };
|
|
30
|
+
}
|
|
31
|
+
export function createParentNode(id, name, children) {
|
|
32
|
+
return { id, name, children };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/__tests__/helpers.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAQlD,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE;YACR;gBACE,EAAE,EAAE,QAAQ;gBACZ,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE;oBACR,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;oBAC3D,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;iBAC5D;aACF;YACD;gBACE,EAAE,EAAE,QAAQ;gBACZ,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,EAAE;aACb;YACD;gBACE,EAAE,EAAE,QAAQ;gBACZ,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,IAAI;aACf;SACF;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAU,EAAE,IAAY;IACvD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,EAAU,EACV,IAAY,EACZ,QAAoB;IAEpB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/insert.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { describe, test, expect } from 'vitest';
|
|
2
|
+
import insert from '../insert';
|
|
3
|
+
import get from '../get';
|
|
4
|
+
import { createTestTree, createSimpleNode } from './helpers';
|
|
5
|
+
describe('insert', () => {
|
|
6
|
+
test('inserts at specific position', () => {
|
|
7
|
+
const tree = createTestTree();
|
|
8
|
+
const newNode = createSimpleNode('new-node', 'New Node');
|
|
9
|
+
const result = insert(tree, 'root', 1, newNode);
|
|
10
|
+
const parent = get(result, 'root');
|
|
11
|
+
expect(parent?.children?.[1].id).toBe('new-node');
|
|
12
|
+
});
|
|
13
|
+
test('inserts at beginning', () => {
|
|
14
|
+
const tree = createTestTree();
|
|
15
|
+
const newNode = createSimpleNode('first', 'First');
|
|
16
|
+
const result = insert(tree, 'root', 0, newNode);
|
|
17
|
+
const parent = get(result, 'root');
|
|
18
|
+
expect(parent?.children?.[0].id).toBe('first');
|
|
19
|
+
});
|
|
20
|
+
test('inserts at end', () => {
|
|
21
|
+
const tree = createTestTree();
|
|
22
|
+
const newNode = createSimpleNode('last', 'Last');
|
|
23
|
+
const result = insert(tree, 'root', 3, newNode);
|
|
24
|
+
const parent = get(result, 'root');
|
|
25
|
+
expect(parent?.children?.at(-1)?.id).toBe('last');
|
|
26
|
+
});
|
|
27
|
+
test('preserves existing children order', () => {
|
|
28
|
+
const tree = createTestTree();
|
|
29
|
+
const newNode = createSimpleNode('new-node', 'New Node');
|
|
30
|
+
const result = insert(tree, 'root', 1, newNode);
|
|
31
|
+
const parent = get(result, 'root');
|
|
32
|
+
expect(parent?.children?.[0].id).toBe('child1');
|
|
33
|
+
expect(parent?.children?.[1].id).toBe('new-node');
|
|
34
|
+
expect(parent?.children?.[2].id).toBe('child2');
|
|
35
|
+
});
|
|
36
|
+
test('returns unchanged tree if parent not found', () => {
|
|
37
|
+
const tree = createTestTree();
|
|
38
|
+
const newNode = createSimpleNode('new-node', 'New Node');
|
|
39
|
+
const result = insert(tree, 'non-existent', 0, newNode);
|
|
40
|
+
expect(result).toBe(tree);
|
|
41
|
+
});
|
|
42
|
+
test('returns unchanged tree if parent has no children', () => {
|
|
43
|
+
const tree = createTestTree();
|
|
44
|
+
const newNode = createSimpleNode('new-node', 'New Node');
|
|
45
|
+
const result = insert(tree, 'grandchild1', 0, newNode);
|
|
46
|
+
expect(result).toBe(tree);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=insert.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert.test.js","sourceRoot":"","sources":["../../src/__tests__/insert.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"move.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/move.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { describe, test, expect } from 'vitest';
|
|
2
|
+
import move from '../move';
|
|
3
|
+
import get from '../get';
|
|
4
|
+
import { createTestTree } from './helpers';
|
|
5
|
+
describe('move', () => {
|
|
6
|
+
test('moves node to new parent', () => {
|
|
7
|
+
const tree = createTestTree();
|
|
8
|
+
const result = move(tree, 'grandchild1', 'child2');
|
|
9
|
+
// Node should be in new parent
|
|
10
|
+
const newParent = get(result, 'child2');
|
|
11
|
+
expect(newParent?.children?.some((c) => c.id === 'grandchild1')).toBe(true);
|
|
12
|
+
});
|
|
13
|
+
test('removes node from old parent', () => {
|
|
14
|
+
const tree = createTestTree();
|
|
15
|
+
const result = move(tree, 'grandchild1', 'child2');
|
|
16
|
+
// Node should not be in old parent
|
|
17
|
+
const oldParent = get(result, 'child1');
|
|
18
|
+
expect(oldParent?.children?.some((c) => c.id === 'grandchild1')).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
test('moves to specific index', () => {
|
|
21
|
+
const tree = createTestTree();
|
|
22
|
+
const result = move(tree, 'child3', 'root', 0);
|
|
23
|
+
const parent = get(result, 'root');
|
|
24
|
+
expect(parent?.children?.[0].id).toBe('child3');
|
|
25
|
+
});
|
|
26
|
+
test('moves to end if no index specified', () => {
|
|
27
|
+
const tree = createTestTree();
|
|
28
|
+
const result = move(tree, 'child1', 'child2');
|
|
29
|
+
const newParent = get(result, 'child2');
|
|
30
|
+
expect(newParent?.children?.at(-1)?.id).toBe('child1');
|
|
31
|
+
});
|
|
32
|
+
test('returns unchanged tree if node not found', () => {
|
|
33
|
+
const tree = createTestTree();
|
|
34
|
+
const result = move(tree, 'non-existent', 'root');
|
|
35
|
+
expect(result).toBe(tree);
|
|
36
|
+
});
|
|
37
|
+
test('returns unchanged tree if parent not found', () => {
|
|
38
|
+
const tree = createTestTree();
|
|
39
|
+
const result = move(tree, 'child1', 'non-existent');
|
|
40
|
+
expect(result).toBe(tree);
|
|
41
|
+
});
|
|
42
|
+
test('returns unchanged tree if parent has no children', () => {
|
|
43
|
+
const tree = createTestTree();
|
|
44
|
+
const result = move(tree, 'child1', 'grandchild1');
|
|
45
|
+
expect(result).toBe(tree);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=move.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"move.test.js","sourceRoot":"","sources":["../../src/__tests__/move.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/remove.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { describe, test, expect } from 'vitest';
|
|
2
|
+
import remove from '../remove';
|
|
3
|
+
import get from '../get';
|
|
4
|
+
import { createTestTree } from './helpers';
|
|
5
|
+
describe('remove', () => {
|
|
6
|
+
test('removes node from tree', () => {
|
|
7
|
+
const tree = createTestTree();
|
|
8
|
+
const result = remove(tree, 'child2');
|
|
9
|
+
expect(get(result, 'child2')).toBeNull();
|
|
10
|
+
});
|
|
11
|
+
test('preserves other siblings', () => {
|
|
12
|
+
const tree = createTestTree();
|
|
13
|
+
const result = remove(tree, 'child2');
|
|
14
|
+
expect(get(result, 'child1')).not.toBeNull();
|
|
15
|
+
expect(get(result, 'child3')).not.toBeNull();
|
|
16
|
+
});
|
|
17
|
+
test('removes nested node', () => {
|
|
18
|
+
const tree = createTestTree();
|
|
19
|
+
const result = remove(tree, 'grandchild1');
|
|
20
|
+
expect(get(result, 'grandchild1')).toBeNull();
|
|
21
|
+
expect(get(result, 'grandchild2')).not.toBeNull();
|
|
22
|
+
});
|
|
23
|
+
test('removes node with children', () => {
|
|
24
|
+
const tree = createTestTree();
|
|
25
|
+
const result = remove(tree, 'child1');
|
|
26
|
+
expect(get(result, 'child1')).toBeNull();
|
|
27
|
+
expect(get(result, 'grandchild1')).toBeNull();
|
|
28
|
+
expect(get(result, 'grandchild2')).toBeNull();
|
|
29
|
+
});
|
|
30
|
+
test('returns tree unchanged if node not found', () => {
|
|
31
|
+
const tree = createTestTree();
|
|
32
|
+
const result = remove(tree, 'non-existent');
|
|
33
|
+
expect(get(result, 'root')).not.toBeNull();
|
|
34
|
+
expect(get(result, 'child1')).not.toBeNull();
|
|
35
|
+
});
|
|
36
|
+
test('updates parent children count', () => {
|
|
37
|
+
const tree = createTestTree();
|
|
38
|
+
const result = remove(tree, 'child2');
|
|
39
|
+
const parent = get(result, 'root');
|
|
40
|
+
expect(parent?.children).toHaveLength(2);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=remove.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.test.js","sourceRoot":"","sources":["../../src/__tests__/remove.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replace.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/replace.test.ts"],"names":[],"mappings":""}
|