feat: create FileNode class, addChild method

This commit is contained in:
wancat committed 2023-08-21 22:22:01 +08:00
1 parent fcaa088a31
commit 9b78f0d41c
4 files changed
+131

No files matched your search

+16
View File
@@ -0,0 +1,16 @@
export default class File {
constructor({ path, name, type, discovered }) {
this.path = path
this.name = name
this.type = type
this.discovered = discovered
}
isDirectory() {
return this.type === 'folder'
}
contains(file) {
return this.isDirectory() && file.path.startsWith(this.path)
}
}
+41
View File
@@ -0,0 +1,41 @@
import path from 'path'
import File from './file.js'
export default class FileNode extends File {
constructor(file) {
super(file)
this.children = []
}
addChild(fileInput) {
const file = new File(fileInput)
if (file.path === this.path) {
throw new Error('File already exists in the tree')
}
const parentPath = path.dirname(file.path)
if (parentPath === this.path) {
// Direct child of this node
this.children.push(new FileNode(file))
} else {
// Recursively call addChild on the correct child node
const childNode = this.children.find((child) => child.contains(file))
if (childNode) {
childNode.addChild(file)
} else {
console.log(fileInput, this)
throw new Error('Parent path not found in the tree')
}
}
}
toString() {
const indent = ' '.repeat(this.path.split('/').length - 1)
const childrenString = this.children
.map((child) => child.toString())
.join('')
return `${indent}${this.name}${
this.isDirectory() ? '/' : ''
}\n${childrenString}`
}
}
+64
View File
@@ -0,0 +1,64 @@
import FileNode from './fileNode.js'
test('addChild method adds a child node to the tree', () => {
const files = [
{
path: '/home/rudeus',
name: 'rudeus',
type: 'folder',
discovered: 'test',
},
{
path: '/home/rudeus/.bash_history',
name: '.bash_history',
type: 'file',
discovered: 'test',
},
{
path: '/home/rudeus/.viminfo',
name: '.viminfo',
type: 'file',
discovered: 'test',
},
{
path: '/home/rudeus/.zshrc',
name: '.zshrc',
type: 'file',
discovered: 'test',
},
{
path: '/home/rudeus/forgotten_scroll.txt',
name: 'forgotten_scroll.txt',
type: 'file',
discovered: 'test',
},
{
path: '/home/rudeus/test',
name: 'test',
type: 'folder',
discovered: 'test',
},
{
path: '/home/rudeus/test/.b',
name: '.b',
type: 'file',
discovered: false,
},
{
path: '/home/rudeus/test/a',
name: 'a',
type: 'file',
discovered: false,
},
]
const root = new FileNode(files[0])
files.slice(1).forEach((file) => {
root.addChild(file)
})
console.log(root.toString())
expect(root.children.length).toBe(5)
})
+10
View File
@@ -0,0 +1,10 @@
{
"name": "file-graph",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"type": "module",
"scripts": {
"test": "yarn node --experimental-vm-modules $(yarn bin jest)"
}
}