@weser/tree 1.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.
Files changed (119) hide show
  1. package/README.md +1 -1
  2. package/dist/__tests__/add.test.d.ts +2 -0
  3. package/dist/__tests__/add.test.d.ts.map +1 -0
  4. package/dist/__tests__/add.test.js +48 -0
  5. package/dist/__tests__/add.test.js.map +1 -0
  6. package/dist/__tests__/clone.test.d.ts +2 -0
  7. package/dist/__tests__/clone.test.d.ts.map +1 -0
  8. package/dist/__tests__/clone.test.js +46 -0
  9. package/dist/__tests__/clone.test.js.map +1 -0
  10. package/dist/__tests__/create.test.d.ts +2 -0
  11. package/dist/__tests__/create.test.d.ts.map +1 -0
  12. package/dist/__tests__/create.test.js +29 -0
  13. package/dist/__tests__/create.test.js.map +1 -0
  14. package/dist/__tests__/find.test.d.ts +2 -0
  15. package/dist/__tests__/find.test.d.ts.map +1 -0
  16. package/dist/__tests__/find.test.js +36 -0
  17. package/dist/__tests__/find.test.js.map +1 -0
  18. package/dist/__tests__/findAll.test.d.ts +2 -0
  19. package/dist/__tests__/findAll.test.d.ts.map +1 -0
  20. package/dist/__tests__/findAll.test.js +34 -0
  21. package/dist/__tests__/findAll.test.js.map +1 -0
  22. package/dist/__tests__/get.test.d.ts +2 -0
  23. package/dist/__tests__/get.test.d.ts.map +1 -0
  24. package/dist/__tests__/get.test.js +34 -0
  25. package/dist/__tests__/get.test.js.map +1 -0
  26. package/dist/__tests__/getParent.test.d.ts +2 -0
  27. package/dist/__tests__/getParent.test.d.ts.map +1 -0
  28. package/dist/__tests__/getParent.test.js +33 -0
  29. package/dist/__tests__/getParent.test.js.map +1 -0
  30. package/dist/__tests__/helpers.d.ts +9 -0
  31. package/dist/__tests__/helpers.d.ts.map +1 -0
  32. package/dist/__tests__/helpers.js +34 -0
  33. package/dist/__tests__/helpers.js.map +1 -0
  34. package/dist/__tests__/insert.test.d.ts +2 -0
  35. package/dist/__tests__/insert.test.d.ts.map +1 -0
  36. package/dist/__tests__/insert.test.js +49 -0
  37. package/dist/__tests__/insert.test.js.map +1 -0
  38. package/dist/__tests__/move.test.d.ts +2 -0
  39. package/dist/__tests__/move.test.d.ts.map +1 -0
  40. package/dist/__tests__/move.test.js +48 -0
  41. package/dist/__tests__/move.test.js.map +1 -0
  42. package/dist/__tests__/remove.test.d.ts +2 -0
  43. package/dist/__tests__/remove.test.d.ts.map +1 -0
  44. package/dist/__tests__/remove.test.js +43 -0
  45. package/dist/__tests__/remove.test.js.map +1 -0
  46. package/dist/__tests__/replace.test.d.ts +2 -0
  47. package/dist/__tests__/replace.test.d.ts.map +1 -0
  48. package/dist/__tests__/replace.test.js +48 -0
  49. package/dist/__tests__/replace.test.js.map +1 -0
  50. package/dist/__tests__/traverse.test.d.ts +2 -0
  51. package/dist/__tests__/traverse.test.d.ts.map +1 -0
  52. package/dist/__tests__/traverse.test.js +55 -0
  53. package/dist/__tests__/traverse.test.js.map +1 -0
  54. package/dist/__tests__/update.test.d.ts +2 -0
  55. package/dist/__tests__/update.test.d.ts.map +1 -0
  56. package/dist/__tests__/update.test.js +41 -0
  57. package/dist/__tests__/update.test.js.map +1 -0
  58. package/dist/add.d.ts +3 -0
  59. package/dist/add.d.ts.map +1 -0
  60. package/dist/add.js +10 -0
  61. package/dist/add.js.map +1 -0
  62. package/dist/clone.d.ts +3 -0
  63. package/dist/clone.d.ts.map +1 -0
  64. package/dist/clone.js +23 -0
  65. package/dist/clone.js.map +1 -0
  66. package/dist/create.d.ts +3 -0
  67. package/dist/create.d.ts.map +1 -0
  68. package/dist/create.js +8 -0
  69. package/dist/create.js.map +1 -0
  70. package/dist/find.d.ts +3 -0
  71. package/dist/find.d.ts.map +1 -0
  72. package/dist/find.js +15 -0
  73. package/dist/find.js.map +1 -0
  74. package/dist/findAll.d.ts +3 -0
  75. package/dist/findAll.d.ts.map +1 -0
  76. package/dist/findAll.js +13 -0
  77. package/dist/findAll.js.map +1 -0
  78. package/dist/get.d.ts +3 -0
  79. package/dist/get.d.ts.map +1 -0
  80. package/dist/get.js +15 -0
  81. package/dist/get.js.map +1 -0
  82. package/dist/getParent.d.ts +3 -0
  83. package/dist/getParent.d.ts.map +1 -0
  84. package/dist/getParent.js +5 -0
  85. package/dist/getParent.js.map +1 -0
  86. package/dist/index.d.ts +15 -14
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +15 -14
  89. package/dist/index.js.map +1 -0
  90. package/dist/insert.d.ts +3 -0
  91. package/dist/insert.d.ts.map +1 -0
  92. package/dist/insert.js +18 -0
  93. package/dist/insert.js.map +1 -0
  94. package/dist/move.d.ts +3 -0
  95. package/dist/move.d.ts.map +1 -0
  96. package/dist/move.js +13 -0
  97. package/dist/move.js.map +1 -0
  98. package/dist/remove.d.ts +3 -0
  99. package/dist/remove.d.ts.map +1 -0
  100. package/dist/remove.js +15 -0
  101. package/dist/remove.js.map +1 -0
  102. package/dist/replace.d.ts +3 -0
  103. package/dist/replace.d.ts.map +1 -0
  104. package/dist/replace.js +22 -0
  105. package/dist/replace.js.map +1 -0
  106. package/dist/traverse.d.ts +2 -1
  107. package/dist/traverse.d.ts.map +1 -0
  108. package/dist/traverse.js +3 -2
  109. package/dist/traverse.js.map +1 -0
  110. package/dist/tsconfig.tsbuildinfo +1 -1
  111. package/dist/types.d.ts +1 -0
  112. package/dist/types.d.ts.map +1 -0
  113. package/dist/types.js +1 -0
  114. package/dist/types.js.map +1 -0
  115. package/dist/update.d.ts +3 -0
  116. package/dist/update.d.ts.map +1 -0
  117. package/dist/update.js +13 -0
  118. package/dist/update.js.map +1 -0
  119. package/package.json +8 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/replace.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import replace from '../replace';
3
+ import get from '../get';
4
+ import { createTestTree, createSimpleNode } from './helpers';
5
+ describe('replace', () => {
6
+ test('replaces node with new node', () => {
7
+ const tree = createTestTree();
8
+ const newNode = createSimpleNode('child2', 'Replaced Child 2');
9
+ const result = replace(tree, 'child2', newNode);
10
+ const replaced = get(result, 'child2');
11
+ expect(replaced?.name).toBe('Replaced Child 2');
12
+ });
13
+ test('replaces nested node', () => {
14
+ const tree = createTestTree();
15
+ const newNode = createSimpleNode('grandchild1', 'New Grandchild');
16
+ const result = replace(tree, 'grandchild1', newNode);
17
+ const replaced = get(result, 'grandchild1');
18
+ expect(replaced?.name).toBe('New Grandchild');
19
+ });
20
+ test('can replace with node with different id', () => {
21
+ const tree = createTestTree();
22
+ const newNode = createSimpleNode('new-id', 'New Node');
23
+ const result = replace(tree, 'child2', newNode);
24
+ expect(get(result, 'child2')).toBeNull();
25
+ expect(get(result, 'new-id')?.name).toBe('New Node');
26
+ });
27
+ test('returns unchanged tree if node not found', () => {
28
+ const tree = createTestTree();
29
+ const newNode = createSimpleNode('new-node', 'New Node');
30
+ const result = replace(tree, 'non-existent', newNode);
31
+ expect(result).toBe(tree);
32
+ });
33
+ test('can replace root node', () => {
34
+ const tree = createTestTree();
35
+ const newRoot = createSimpleNode('new-root', 'New Root');
36
+ const result = replace(tree, 'root', newRoot);
37
+ expect(result.id).toBe('new-root');
38
+ expect(result.name).toBe('New Root');
39
+ });
40
+ test('preserves sibling nodes', () => {
41
+ const tree = createTestTree();
42
+ const newNode = createSimpleNode('child2', 'New Child 2');
43
+ const result = replace(tree, 'child2', newNode);
44
+ expect(get(result, 'child1')).not.toBeNull();
45
+ expect(get(result, 'child3')).not.toBeNull();
46
+ });
47
+ });
48
+ //# sourceMappingURL=replace.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace.test.js","sourceRoot":"","sources":["../../src/__tests__/replace.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=traverse.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverse.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/traverse.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ import { describe, test, expect, vi } from 'vitest';
2
+ import traverse from '../traverse';
3
+ import { createTestTree } from './helpers';
4
+ describe('traverse', () => {
5
+ test('traverses all nodes top-down by default', () => {
6
+ const tree = createTestTree();
7
+ const visited = [];
8
+ traverse(tree, (node) => {
9
+ visited.push(node.id);
10
+ });
11
+ expect(visited).toContain('root');
12
+ expect(visited).toContain('child1');
13
+ expect(visited).toContain('grandchild1');
14
+ expect(visited.length).toBe(6);
15
+ });
16
+ test('traverses in top-down order', () => {
17
+ const tree = createTestTree();
18
+ const visited = [];
19
+ traverse(tree, (node) => {
20
+ visited.push(node.id);
21
+ }, 'top-down');
22
+ // Root should come before children
23
+ expect(visited.indexOf('root')).toBeLessThan(visited.indexOf('child1'));
24
+ // Parent should come before grandchildren
25
+ expect(visited.indexOf('child1')).toBeLessThan(visited.indexOf('grandchild1'));
26
+ });
27
+ test('traverses in bottom-up order', () => {
28
+ const tree = createTestTree();
29
+ const visited = [];
30
+ traverse(tree, (node) => {
31
+ visited.push(node.id);
32
+ }, 'bottom-up');
33
+ // Children should come before root
34
+ expect(visited.indexOf('child1')).toBeLessThan(visited.indexOf('root'));
35
+ // Grandchildren should come before parent
36
+ expect(visited.indexOf('grandchild1')).toBeLessThan(visited.indexOf('child1'));
37
+ });
38
+ test('calls callback with node', () => {
39
+ const tree = createTestTree();
40
+ const callback = vi.fn();
41
+ traverse(tree, callback);
42
+ expect(callback).toHaveBeenCalled();
43
+ expect(callback.mock.calls[0][0]).toHaveProperty('id');
44
+ expect(callback.mock.calls[0][0]).toHaveProperty('name');
45
+ });
46
+ test('handles single node tree', () => {
47
+ const tree = { id: 'single', name: 'Single', children: null };
48
+ const visited = [];
49
+ traverse(tree, (node) => {
50
+ visited.push(node.id);
51
+ });
52
+ expect(visited).toEqual(['single']);
53
+ });
54
+ });
55
+ //# sourceMappingURL=traverse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverse.test.js","sourceRoot":"","sources":["../../src/__tests__/traverse.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=update.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/update.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import update from '../update';
3
+ import get from '../get';
4
+ import { createTestTree } from './helpers';
5
+ describe('update', () => {
6
+ test('updates node properties', () => {
7
+ const tree = createTestTree();
8
+ const result = update(tree, 'child1', { name: 'Updated Child 1' });
9
+ const updated = get(result, 'child1');
10
+ expect(updated?.name).toBe('Updated Child 1');
11
+ });
12
+ test('preserves unchanged properties', () => {
13
+ const tree = createTestTree();
14
+ const result = update(tree, 'child1', { name: 'Updated' });
15
+ const updated = get(result, 'child1');
16
+ expect(updated?.id).toBe('child1');
17
+ expect(updated?.children).toHaveLength(2);
18
+ });
19
+ test('updates nested node', () => {
20
+ const tree = createTestTree();
21
+ const result = update(tree, 'grandchild1', { name: 'Updated Grandchild' });
22
+ const updated = get(result, 'grandchild1');
23
+ expect(updated?.name).toBe('Updated Grandchild');
24
+ });
25
+ test('returns unchanged tree if node not found', () => {
26
+ const tree = createTestTree();
27
+ const result = update(tree, 'non-existent', { name: 'New Name' });
28
+ expect(result).toBe(tree);
29
+ });
30
+ test('can update multiple properties', () => {
31
+ const tree = createTestTree();
32
+ const result = update(tree, 'child1', {
33
+ name: 'Updated',
34
+ children: [],
35
+ });
36
+ const updated = get(result, 'child1');
37
+ expect(updated?.name).toBe('Updated');
38
+ expect(updated?.children).toEqual([]);
39
+ });
40
+ });
41
+ //# sourceMappingURL=update.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.test.js","sourceRoot":"","sources":["../../src/__tests__/update.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,MAAM,MAAM,WAAW,CAAA;AAC9B,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE1C,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACnC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAA;QAElE,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QACrC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;QAE1D,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QACrC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAClC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC/B,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAA;QAE1E,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;QAC1C,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;QAEjE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE;YACpC,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,EAAE;SACb,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QACrC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACrC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
package/dist/add.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { type BaseNode } from './types';
2
+ export default function add<T extends BaseNode<T>>(rootNode: T, id: string, newNode: T): T;
3
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../src/add.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAC/C,QAAQ,EAAE,CAAC,EACX,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,CAAC,GACT,CAAC,CAQH"}
package/dist/add.js ADDED
@@ -0,0 +1,10 @@
1
+ import get from './get';
2
+ import insert from './insert';
3
+ export default function add(rootNode, id, newNode) {
4
+ const parentNode = get(rootNode, id);
5
+ if (!parentNode || !parentNode.children) {
6
+ return rootNode;
7
+ }
8
+ return insert(rootNode, id, parentNode.children.length, newNode);
9
+ }
10
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../src/add.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAA;AACvB,OAAO,MAAM,MAAM,UAAU,CAAA;AAG7B,MAAM,CAAC,OAAO,UAAU,GAAG,CACzB,QAAW,EACX,EAAU,EACV,OAAU;IAEV,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAEpC,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxC,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,OAAO,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAClE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type BaseNode } from './types';
2
+ export default function clone<T extends BaseNode<T>>(rootNode: T, id: string): T | null;
3
+ //# sourceMappingURL=clone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone.d.ts","sourceRoot":"","sources":["../src/clone.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EACjD,QAAQ,EAAE,CAAC,EACX,EAAE,EAAE,MAAM,GACT,CAAC,GAAG,IAAI,CAQV"}
package/dist/clone.js ADDED
@@ -0,0 +1,23 @@
1
+ import get from './get';
2
+ export default function clone(rootNode, id) {
3
+ const node = get(rootNode, id);
4
+ if (!node) {
5
+ return null;
6
+ }
7
+ return cloneById(node);
8
+ }
9
+ function cloneById(node) {
10
+ if (!node.children || node.children.length === 0) {
11
+ return {
12
+ ...node,
13
+ id: crypto.randomUUID(),
14
+ };
15
+ }
16
+ const newChildren = node.children.map(cloneById);
17
+ return {
18
+ ...node,
19
+ id: crypto.randomUUID(),
20
+ children: newChildren,
21
+ };
22
+ }
23
+ //# sourceMappingURL=clone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone.js","sourceRoot":"","sources":["../src/clone.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAA;AAGvB,MAAM,CAAC,OAAO,UAAU,KAAK,CAC3B,QAAW,EACX,EAAU;IAEV,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAE9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,SAAS,CAAC,IAAI,CAAC,CAAA;AACxB,CAAC;AAED,SAAS,SAAS,CAAwB,IAAO;IAC/C,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO;YACL,GAAG,IAAI;YACP,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;SACxB,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAEhD,OAAO;QACL,GAAG,IAAI;QACP,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;QACvB,QAAQ,EAAE,WAAW;KACtB,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type BaseNode, type BaseNodeInput } from './types';
2
+ export default function create<T extends BaseNode<T>>(node: BaseNodeInput<T>): T;
3
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAA;AAE3D,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAClD,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GACrB,CAAC,CAOH"}
package/dist/create.js ADDED
@@ -0,0 +1,8 @@
1
+ export default function create(node) {
2
+ const id = crypto.randomUUID();
3
+ return {
4
+ ...node,
5
+ id,
6
+ };
7
+ }
8
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,MAAM,CAC5B,IAAsB;IAEtB,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;IAE9B,OAAO;QACL,GAAG,IAAI;QACP,EAAE;KACE,CAAA;AACR,CAAC"}
package/dist/find.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { type BaseNode } from './types';
2
+ export default function find<T extends BaseNode<T>>(rootNode: T, condition: (node: T) => boolean): T | null;
3
+ //# sourceMappingURL=find.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../src/find.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAChD,QAAQ,EAAE,CAAC,EACX,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,GAC9B,CAAC,GAAG,IAAI,CAgBV"}
package/dist/find.js ADDED
@@ -0,0 +1,15 @@
1
+ export default function find(rootNode, condition) {
2
+ if (condition(rootNode)) {
3
+ return rootNode;
4
+ }
5
+ if (rootNode.children) {
6
+ for (const node of rootNode.children) {
7
+ const result = find(node, condition);
8
+ if (result) {
9
+ return result;
10
+ }
11
+ }
12
+ }
13
+ return null;
14
+ }
15
+ //# sourceMappingURL=find.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find.js","sourceRoot":"","sources":["../src/find.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,IAAI,CAC1B,QAAW,EACX,SAA+B;IAE/B,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;YAEpC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,MAAM,CAAA;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type BaseNode } from './types';
2
+ export default function findAll<T extends BaseNode<T>>(rootNode: T, condition: (node: T) => boolean): Array<T>;
3
+ //# sourceMappingURL=findAll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findAll.d.ts","sourceRoot":"","sources":["../src/findAll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EACnD,QAAQ,EAAE,CAAC,EACX,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,GAC9B,KAAK,CAAC,CAAC,CAAC,CAcV"}
@@ -0,0 +1,13 @@
1
+ export default function findAll(rootNode, condition) {
2
+ const nodes = [];
3
+ if (condition(rootNode)) {
4
+ nodes.push(rootNode);
5
+ }
6
+ if (rootNode.children) {
7
+ for (const node of rootNode.children) {
8
+ nodes.push(...findAll(node, condition));
9
+ }
10
+ }
11
+ return nodes;
12
+ }
13
+ //# sourceMappingURL=findAll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findAll.js","sourceRoot":"","sources":["../src/findAll.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,OAAO,CAC7B,QAAW,EACX,SAA+B;IAE/B,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACtB,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC"}
package/dist/get.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { type BaseNode } from './types';
2
+ export default function get<T extends BaseNode<T>>(rootNode: T, id: string): T | null;
3
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../src/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAC/C,QAAQ,EAAE,CAAC,EACX,EAAE,EAAE,MAAM,GACT,CAAC,GAAG,IAAI,CAgBV"}
package/dist/get.js ADDED
@@ -0,0 +1,15 @@
1
+ export default function get(rootNode, id) {
2
+ if (rootNode.id === id) {
3
+ return rootNode;
4
+ }
5
+ if (rootNode.children) {
6
+ for (const node of rootNode.children) {
7
+ const result = get(node, id);
8
+ if (result) {
9
+ return result;
10
+ }
11
+ }
12
+ }
13
+ return null;
14
+ }
15
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../src/get.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,GAAG,CACzB,QAAW,EACX,EAAU;IAEV,IAAI,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YAE5B,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,MAAM,CAAA;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type BaseNode } from './types';
2
+ export default function getParent<T extends BaseNode<T>>(rootNode: T, id: string): T | null;
3
+ //# sourceMappingURL=getParent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getParent.d.ts","sourceRoot":"","sources":["../src/getParent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EACrD,QAAQ,EAAE,CAAC,EACX,EAAE,EAAE,MAAM,GACT,CAAC,GAAG,IAAI,CAIV"}
@@ -0,0 +1,5 @@
1
+ import find from './find';
2
+ export default function getParent(rootNode, id) {
3
+ return find(rootNode, (node) => Boolean(node.children && node.children.find((node) => node.id === id)));
4
+ }
5
+ //# sourceMappingURL=getParent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getParent.js","sourceRoot":"","sources":["../src/getParent.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,QAAQ,CAAA;AAGzB,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,QAAW,EACX,EAAU;IAEV,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7B,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CACvE,CAAA;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,14 +1,15 @@
1
- export { default as addNode } from './addNode.js';
2
- export { default as cloneNode } from './cloneNode.js';
3
- export { default as createNode } from './createNode.js';
4
- export { default as findNode } from './findNode.js';
5
- export { default as findAllNode } from './findAllNode.js';
6
- export { default as getNode } from './getNode.js';
7
- export { default as getParentNode } from './getParentNode.js';
8
- export { default as insertNode } from './insertNode.js';
9
- export { default as moveNode } from './moveNode.js';
10
- export { default as removeNode } from './removeNode.js';
11
- export { default as replaceNode } from './replaceNode.js';
12
- export { default as traverse } from './traverse.js';
13
- export { default as updateNode } from './updateNode.js';
14
- export * from './types.js';
1
+ export { default as add } from './add';
2
+ export { default as clone } from './clone';
3
+ export { default as create } from './create';
4
+ export { default as find } from './find';
5
+ export { default as findAll } from './findAll';
6
+ export { default as get } from './get';
7
+ export { default as getParent } from './getParent';
8
+ export { default as insert } from './insert';
9
+ export { default as move } from './move';
10
+ export { default as remove } from './remove';
11
+ export { default as replace } from './replace';
12
+ export { default as traverse } from './traverse';
13
+ export { default as update } from './update';
14
+ export * from './types';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAA;AAC5C,cAAc,SAAS,CAAA"}
package/dist/index.js CHANGED
@@ -1,14 +1,15 @@
1
- export { default as addNode } from './addNode.js';
2
- export { default as cloneNode } from './cloneNode.js';
3
- export { default as createNode } from './createNode.js';
4
- export { default as findNode } from './findNode.js';
5
- export { default as findAllNode } from './findAllNode.js';
6
- export { default as getNode } from './getNode.js';
7
- export { default as getParentNode } from './getParentNode.js';
8
- export { default as insertNode } from './insertNode.js';
9
- export { default as moveNode } from './moveNode.js';
10
- export { default as removeNode } from './removeNode.js';
11
- export { default as replaceNode } from './replaceNode.js';
12
- export { default as traverse } from './traverse.js';
13
- export { default as updateNode } from './updateNode.js';
14
- export * from './types.js';
1
+ export { default as add } from './add';
2
+ export { default as clone } from './clone';
3
+ export { default as create } from './create';
4
+ export { default as find } from './find';
5
+ export { default as findAll } from './findAll';
6
+ export { default as get } from './get';
7
+ export { default as getParent } from './getParent';
8
+ export { default as insert } from './insert';
9
+ export { default as move } from './move';
10
+ export { default as remove } from './remove';
11
+ export { default as replace } from './replace';
12
+ export { default as traverse } from './traverse';
13
+ export { default as update } from './update';
14
+ export * from './types';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAA;AAC5C,cAAc,SAAS,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { type BaseNode } from './types';
2
+ export default function insert<T extends BaseNode<T>>(rootNode: T, id: string, index: number, newNode: T): T;
3
+ //# sourceMappingURL=insert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert.d.ts","sourceRoot":"","sources":["../src/insert.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAClD,QAAQ,EAAE,CAAC,EACX,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GACT,CAAC,CAiBH"}
package/dist/insert.js ADDED
@@ -0,0 +1,18 @@
1
+ import get from './get';
2
+ import replace from './replace';
3
+ export default function insert(rootNode, id, index, newNode) {
4
+ const parentNode = get(rootNode, id);
5
+ if (!parentNode || !parentNode.children) {
6
+ return rootNode;
7
+ }
8
+ const children = [
9
+ ...parentNode.children.slice(0, index),
10
+ newNode,
11
+ ...parentNode.children.slice(index),
12
+ ];
13
+ return replace(rootNode, id, {
14
+ ...parentNode,
15
+ children,
16
+ });
17
+ }
18
+ //# sourceMappingURL=insert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert.js","sourceRoot":"","sources":["../src/insert.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAA;AACvB,OAAO,OAAO,MAAM,WAAW,CAAA;AAG/B,MAAM,CAAC,OAAO,UAAU,MAAM,CAC5B,QAAW,EACX,EAAU,EACV,KAAa,EACb,OAAU;IAEV,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAEpC,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxC,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG;QACf,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;QACtC,OAAO;QACP,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;KACpC,CAAA;IAED,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE;QAC3B,GAAG,UAAU;QACb,QAAQ;KACT,CAAC,CAAA;AACJ,CAAC"}
package/dist/move.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { type BaseNode } from './types';
2
+ export default function move<T extends BaseNode<T>>(rootNode: T, id: string, parentId: string, index?: number): T;
3
+ //# sourceMappingURL=move.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move.d.ts","sourceRoot":"","sources":["../src/move.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAChD,QAAQ,EAAE,CAAC,EACX,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,CAAC,CAeH"}
package/dist/move.js ADDED
@@ -0,0 +1,13 @@
1
+ import get from './get';
2
+ import insert from './insert';
3
+ import remove from './remove';
4
+ export default function move(rootNode, id, parentId, index) {
5
+ const node = get(rootNode, id);
6
+ const parentNode = get(rootNode, parentId);
7
+ if (!node || !parentNode || !parentNode.children) {
8
+ return rootNode;
9
+ }
10
+ const removedNode = remove(rootNode, id);
11
+ return insert(removedNode, parentId, index ?? parentNode.children.length, node);
12
+ }
13
+ //# sourceMappingURL=move.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move.js","sourceRoot":"","sources":["../src/move.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAA;AACvB,OAAO,MAAM,MAAM,UAAU,CAAA;AAC7B,OAAO,MAAM,MAAM,UAAU,CAAA;AAG7B,MAAM,CAAC,OAAO,UAAU,IAAI,CAC1B,QAAW,EACX,EAAU,EACV,QAAgB,EAChB,KAAc;IAEd,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAC9B,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAE1C,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QACjD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IACxC,OAAO,MAAM,CACX,WAAW,EACX,QAAQ,EACR,KAAK,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,EACnC,IAAI,CACL,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type BaseNode } from './types';
2
+ export default function remove<T extends BaseNode<T>>(rootNode: T, id: string): T;
3
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../src/remove.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAClD,QAAQ,EAAE,CAAC,EACX,EAAE,EAAE,MAAM,GACT,CAAC,CAEH"}
package/dist/remove.js ADDED
@@ -0,0 +1,15 @@
1
+ import { map, filter } from '@weser/array';
2
+ export default function remove(rootNode, id) {
3
+ return removeById(rootNode, id);
4
+ }
5
+ function removeById(rootNode, id) {
6
+ if (!rootNode.children || rootNode.children.length === 0) {
7
+ return rootNode;
8
+ }
9
+ const children = map(filter(rootNode.children, (node) => node.id !== id), (node) => removeById(node, id));
10
+ return {
11
+ ...rootNode,
12
+ children,
13
+ };
14
+ }
15
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../src/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAI1C,MAAM,CAAC,OAAO,UAAU,MAAM,CAC5B,QAAW,EACX,EAAU;IAEV,OAAO,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;AACjC,CAAC;AAED,SAAS,UAAU,CAAwB,QAAW,EAAE,EAAU;IAChE,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAClB,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EACnD,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAC/B,CAAA;IAED,OAAO;QACL,GAAG,QAAQ;QACX,QAAQ;KACT,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type BaseNode } from './types';
2
+ export default function replace<T extends BaseNode<T>>(rootNode: T, id: string, newNode: T): T;
3
+ //# sourceMappingURL=replace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace.d.ts","sourceRoot":"","sources":["../src/replace.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EACnD,QAAQ,EAAE,CAAC,EACX,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,CAAC,GACT,CAAC,CAQH"}
@@ -0,0 +1,22 @@
1
+ import get from './get';
2
+ export default function replace(rootNode, id, newNode) {
3
+ const node = get(rootNode, id);
4
+ if (!node) {
5
+ return rootNode;
6
+ }
7
+ return replaceById(rootNode, id, newNode);
8
+ }
9
+ function replaceById(rootNode, id, newNode) {
10
+ if (rootNode.id === id) {
11
+ return newNode;
12
+ }
13
+ if (!rootNode.children || rootNode.children.length === 0) {
14
+ return rootNode;
15
+ }
16
+ const children = rootNode.children.map((node) => replaceById(node, id, newNode));
17
+ return {
18
+ ...rootNode,
19
+ children,
20
+ };
21
+ }
22
+ //# sourceMappingURL=replace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace.js","sourceRoot":"","sources":["../src/replace.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAA;AAGvB,MAAM,CAAC,OAAO,UAAU,OAAO,CAC7B,QAAW,EACX,EAAU,EACV,OAAU;IAEV,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAE9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,OAAO,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;AAC3C,CAAC;AAED,SAAS,WAAW,CAClB,QAAW,EACX,EAAU,EACV,OAAU;IAEV,IAAI,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACvB,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC9C,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAC/B,CAAA;IAED,OAAO;QACL,GAAG,QAAQ;QACX,QAAQ;KACT,CAAA;AACH,CAAC"}
@@ -1,2 +1,3 @@
1
- import { type BaseNode } from './types.js';
1
+ import { type BaseNode } from './types';
2
2
  export default function traverse<T extends BaseNode<T>>(rootNode: T, callback: (node: T) => void, type?: 'top-down' | 'bottom-up'): void;
3
+ //# sourceMappingURL=traverse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverse.d.ts","sourceRoot":"","sources":["../src/traverse.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EACpD,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EAC3B,IAAI,GAAE,UAAU,GAAG,WAAwB,QAa5C"}
package/dist/traverse.js CHANGED
@@ -1,12 +1,13 @@
1
- import { arrayEach } from '@weser/loops';
1
+ import { each } from '@weser/array';
2
2
  export default function traverse(rootNode, callback, type = 'top-down') {
3
3
  if (type === 'top-down') {
4
4
  callback(rootNode);
5
5
  }
6
6
  if (rootNode.children) {
7
- arrayEach(rootNode.children, (node) => traverse(node, callback, type));
7
+ each(rootNode.children, (node) => traverse(node, callback, type));
8
8
  }
9
9
  if (type === 'bottom-up') {
10
10
  callback(rootNode);
11
11
  }
12
12
  }
13
+ //# sourceMappingURL=traverse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverse.js","sourceRoot":"","sources":["../src/traverse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAInC,MAAM,CAAC,OAAO,UAAU,QAAQ,CAC9B,QAAW,EACX,QAA2B,EAC3B,OAAiC,UAAU;IAE3C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACpB,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAA;IACnE,CAAC;IAED,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACpB,CAAC;AACH,CAAC"}