From 7041e89a49165cd1b7b1b5006e9ff45210a9a500 Mon Sep 17 00:00:00 2001 From: "Chen, Tai-Lin" Date: Thu, 24 Aug 2023 15:05:50 +0800 Subject: [PATCH] feat: finish file-graph-algorithm (check required) --- packages/file-graph/fileGraph.js | 23 +++++++++++++++++++++++ packages/file-graph/fileNode.js | 18 ++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/packages/file-graph/fileGraph.js b/packages/file-graph/fileGraph.js index 1be06d2..708d57b 100644 --- a/packages/file-graph/fileGraph.js +++ b/packages/file-graph/fileGraph.js @@ -9,18 +9,41 @@ export default class FileGraph { // Logic to add the file node to the graph // You can implement the logic to find the appropriate location in the file graph // If the file node already exists, throw an error + + const newNode = new FileNode(file) + this.root.addChild(newNode, { makeParents: true }) } remove(file) { // Logic to remove a file node from the graph // If the file node is a folder, also remove all children // If the file node doesn't exist, throw an error + + const nodeToRemove = this.findNode(file) + if (nodeToRemove) { + const parentNode = this.findParentNode(file) + if (parentNode) { + parentNode.children = parentNode.children.filter( + (child) => child !== nodeToRemove + ) + } + } else { + throw new Error(`File node not found: ${file.path}`) + } } discover(eventFiles) { // Logic to handle the discover event // Overwrite the file graph with the provided files // Remove file nodes that don't exist anymore and add new ones + + const updatedNodes = eventFiles.map((file) => new FileNode(file)) + this.root = new FileNode({ + path: '/', + type: 'folder', + discovered: true, + children: updatedNodes, + }) } handleEvent(event) { diff --git a/packages/file-graph/fileNode.js b/packages/file-graph/fileNode.js index 0582974..d0c9874 100644 --- a/packages/file-graph/fileNode.js +++ b/packages/file-graph/fileNode.js @@ -92,4 +92,22 @@ export default class FileNode extends File { .join('') return `${indent}${this.name}${suffix}\n${childrenString}` } + + findNode(fileToFind) { + const pathFolders = fileToFind.path + .split('/') + .filter((folder) => folder.length > 0) + let currentNode = this + + for (const folder of pathFolders) { + currentNode = currentNode.children.find( + (child) => child.name === folder && child.type === 'folder' + ) + if (!currentNode) { + return null + } + } + + return currentNode + } }