@weser/tree 1.0.0 → 2.0.0

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/README.md CHANGED
@@ -1,3 +1,3 @@
1
1
  # @weser/loops
2
2
 
3
- [Documentation](https://packages.weser.io/loops)
3
+ [Documentation](https://stack.weser.io/loops)
package/dist/add.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import { type BaseNode } from './types.js';
2
+ export default function add<T extends BaseNode<T>>(rootNode: T, id: string, newNode: T): T;
package/dist/add.js ADDED
@@ -0,0 +1,9 @@
1
+ import get from './get.js';
2
+ import insert from './insert.js';
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
+ }
@@ -0,0 +1,2 @@
1
+ import { type BaseNode } from './types.js';
2
+ export default function clone<T extends BaseNode<T>>(rootNode: T, id: string): T | null;
package/dist/clone.js ADDED
@@ -0,0 +1,22 @@
1
+ import get from './get.js';
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
+ }
@@ -0,0 +1,2 @@
1
+ import { type BaseNode, type BaseNodeInput } from './types.js';
2
+ export default function create<T extends BaseNode<T>>(node: BaseNodeInput<T>): T;
package/dist/create.js ADDED
@@ -0,0 +1,7 @@
1
+ export default function create(node) {
2
+ const id = crypto.randomUUID();
3
+ return {
4
+ ...node,
5
+ id,
6
+ };
7
+ }
package/dist/find.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import { type BaseNode } from './types.js';
2
+ export default function find<T extends BaseNode<T>>(rootNode: T, condition: (node: T) => boolean): T | null;
package/dist/find.js ADDED
@@ -0,0 +1,14 @@
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
+ }
@@ -0,0 +1,2 @@
1
+ import { type BaseNode } from './types.js';
2
+ export default function findAll<T extends BaseNode<T>>(rootNode: T, condition: (node: T) => boolean): Array<T>;
@@ -0,0 +1,12 @@
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
+ }
package/dist/get.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import { type BaseNode } from './types.js';
2
+ export default function get<T extends BaseNode<T>>(rootNode: T, id: string): T | null;
package/dist/get.js ADDED
@@ -0,0 +1,14 @@
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
+ }
@@ -0,0 +1,2 @@
1
+ import { type BaseNode } from './types.js';
2
+ export default function getParent<T extends BaseNode<T>>(rootNode: T, id: string): T | null;
@@ -0,0 +1,4 @@
1
+ import find from './find.js';
2
+ export default function getParent(rootNode, id) {
3
+ return find(rootNode, (node) => Boolean(node.children && node.children.find((node) => node.id === id)));
4
+ }
package/dist/index.d.ts CHANGED
@@ -1,14 +1,14 @@
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';
1
+ export { default as add } from './add.js';
2
+ export { default as clone } from './clone.js';
3
+ export { default as create } from './create.js';
4
+ export { default as find } from './find.js';
5
+ export { default as findAll } from './findAll.js';
6
+ export { default as get } from './get.js';
7
+ export { default as getParent } from './getParent.js';
8
+ export { default as insert } from './insert.js';
9
+ export { default as move } from './move.js';
10
+ export { default as remove } from './remove.js';
11
+ export { default as replace } from './replace.js';
12
12
  export { default as traverse } from './traverse.js';
13
- export { default as updateNode } from './updateNode.js';
13
+ export { default as update } from './update.js';
14
14
  export * from './types.js';
package/dist/index.js CHANGED
@@ -1,14 +1,14 @@
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';
1
+ export { default as add } from './add.js';
2
+ export { default as clone } from './clone.js';
3
+ export { default as create } from './create.js';
4
+ export { default as find } from './find.js';
5
+ export { default as findAll } from './findAll.js';
6
+ export { default as get } from './get.js';
7
+ export { default as getParent } from './getParent.js';
8
+ export { default as insert } from './insert.js';
9
+ export { default as move } from './move.js';
10
+ export { default as remove } from './remove.js';
11
+ export { default as replace } from './replace.js';
12
12
  export { default as traverse } from './traverse.js';
13
- export { default as updateNode } from './updateNode.js';
13
+ export { default as update } from './update.js';
14
14
  export * from './types.js';
@@ -0,0 +1,2 @@
1
+ import { type BaseNode } from './types.js';
2
+ export default function insert<T extends BaseNode<T>>(rootNode: T, id: string, index: number, newNode: T): T;
package/dist/insert.js ADDED
@@ -0,0 +1,17 @@
1
+ import get from './get.js';
2
+ import replace from './replace.js';
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
+ }
package/dist/move.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import { type BaseNode } from './types.js';
2
+ export default function move<T extends BaseNode<T>>(rootNode: T, id: string, parentId: string, index?: number): T;
package/dist/move.js ADDED
@@ -0,0 +1,12 @@
1
+ import get from './get.js';
2
+ import insert from './insert.js';
3
+ import remove from './remove.js';
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
+ }
@@ -0,0 +1,2 @@
1
+ import { type BaseNode } from './types.js';
2
+ export default function remove<T extends BaseNode<T>>(rootNode: T, id: string): T;
package/dist/remove.js ADDED
@@ -0,0 +1,14 @@
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
+ }
@@ -0,0 +1,2 @@
1
+ import { type BaseNode } from './types.js';
2
+ export default function replace<T extends BaseNode<T>>(rootNode: T, id: string, newNode: T): T;
@@ -0,0 +1,21 @@
1
+ import get from './get.js';
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
+ }
package/dist/traverse.js CHANGED
@@ -1,10 +1,10 @@
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);
@@ -1 +1 @@
1
- {"root":["../src/addnode.ts","../src/clonenode.ts","../src/createnode.ts","../src/findallnode.ts","../src/findnode.ts","../src/getnode.ts","../src/getparentnode.ts","../src/index.ts","../src/insertnode.ts","../src/movenode.ts","../src/removenode.ts","../src/replacenode.ts","../src/traverse.ts","../src/types.ts","../src/updatenode.ts"],"version":"5.9.2"}
1
+ {"root":["../src/add.ts","../src/clone.ts","../src/create.ts","../src/find.ts","../src/findall.ts","../src/get.ts","../src/getparent.ts","../src/index.ts","../src/insert.ts","../src/move.ts","../src/remove.ts","../src/replace.ts","../src/traverse.ts","../src/types.ts","../src/update.ts"],"version":"5.9.3"}
@@ -0,0 +1,2 @@
1
+ import { type BaseNode, type BaseNodeInput } from './types.js';
2
+ export default function update<T extends BaseNode<T>>(rootNode: T, id: string, newNode: Partial<BaseNodeInput<T>>): T;
package/dist/update.js ADDED
@@ -0,0 +1,12 @@
1
+ import get from './get.js';
2
+ import replace from './replace.js';
3
+ export default function update(rootNode, id, newNode) {
4
+ const node = get(rootNode, id);
5
+ if (!node) {
6
+ return rootNode;
7
+ }
8
+ return replace(rootNode, id, {
9
+ ...node,
10
+ ...newNode,
11
+ });
12
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weser/tree",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "Tiny helpers for working with tree data structure",
5
5
  "author": "Robin Weser <robin@weser.io>",
6
6
  "license": "MIT",
@@ -41,12 +41,12 @@
41
41
  "utils"
42
42
  ],
43
43
  "dependencies": {
44
- "@weser/loops": "^1.0.0"
44
+ "@weser/array": "1.0.0"
45
45
  },
46
46
  "devDependencies": {
47
47
  "ava": "^6.1.3",
48
48
  "rimraf": "^3.0.2",
49
49
  "typescript": "^5.4.5"
50
50
  },
51
- "gitHead": "afc0628ca4aeaba255eef9716652640fdc5b50c4"
51
+ "gitHead": "490b5b37e8da7f0cac2880543874914c6f6be5d6"
52
52
  }