From 253bd0458854b30b5e1feb9c6c6af41f87f48346 Mon Sep 17 00:00:00 2001 From: wancat Date: Wed, 7 Feb 2024 10:03:53 +0800 Subject: [PATCH] finish file-graph and solve jest ts --- .eslintrc.js | 1 + jest.config.js | 6 ++-- package.json | 2 +- packages/file-graph/src/file.ts | 3 +- .../src/{fileGraph.js => fileGraph.ts} | 15 +++++++--- .../src/{fileNode.js => fileNode.ts} | 29 ++++++++++--------- packages/file-graph/src/index.js | 3 -- packages/file-graph/src/index.ts | 3 ++ .../file-graph/src/{utils.js => utils.ts} | 6 ++-- 9 files changed, 40 insertions(+), 28 deletions(-) rename packages/file-graph/src/{fileGraph.js => fileGraph.ts} (82%) rename packages/file-graph/src/{fileNode.js => fileNode.ts} (85%) delete mode 100644 packages/file-graph/src/index.js create mode 100644 packages/file-graph/src/index.ts rename packages/file-graph/src/{utils.js => utils.ts} (57%) diff --git a/.eslintrc.js b/.eslintrc.js index 0e3ae44..afc6b85 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -45,6 +45,7 @@ module.exports = { 'always', { exceptAfterSingleLine: true }, ], + 'no-use-before-define': 'off', '@typescript-eslint/explicit-module-boundary-types': 'off', diff --git a/jest.config.js b/jest.config.js index 0492673..9e953ad 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,6 +2,8 @@ // const { jsWithTs: tsjPreset } = require('ts-jest/presets') module.exports = { - preset: 'ts-jest/presets/js-with-ts', - testEnvironment: 'node', + preset: 'ts-jest/presets/default-esm', + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', // Redirect .js imports to .ts files + }, } diff --git a/package.json b/package.json index 1e28d49..0631702 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "cli": "yarn workspace client start", "lint": "eslint .", "format": "prettier --ignore-path .prettierignore --write app server", - "test": "yarn jest", + "test": "yarn node --experimental-vm-modules --no-warnings $(yarn bin jest)", "test:e2e": "yarn workspace tests test", "test:open": "yarn workspace tests test:open", "analytics": "yarn workspace analytics dev", diff --git a/packages/file-graph/src/file.ts b/packages/file-graph/src/file.ts index 1656e41..5fb5126 100644 --- a/packages/file-graph/src/file.ts +++ b/packages/file-graph/src/file.ts @@ -1,7 +1,6 @@ -/* eslint-disable lines-between-class-members */ import { basename } from './utils.js' -interface FileObject { +export interface FileObject { path: string type: string discovered: boolean diff --git a/packages/file-graph/src/fileGraph.js b/packages/file-graph/src/fileGraph.ts similarity index 82% rename from packages/file-graph/src/fileGraph.js rename to packages/file-graph/src/fileGraph.ts index a2a924e..5d63b18 100644 --- a/packages/file-graph/src/fileGraph.js +++ b/packages/file-graph/src/fileGraph.ts @@ -1,7 +1,14 @@ +import { FileObject } from './file.js' import FileNode from './fileNode.js' +export interface Event { + add?: FileObject[] + remove?: FileObject[] + discover?: FileObject[] +} + export default class FileGraph extends FileNode { - add(files) { + add(files: FileObject[]) { // 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 @@ -11,7 +18,7 @@ export default class FileGraph extends FileNode { }) } - remove(files) { + remove(files: FileObject[]) { // 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 @@ -21,7 +28,7 @@ export default class FileGraph extends FileNode { }) } - discover(eventFiles) { + discover(eventFiles: FileObject[]) { // 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 @@ -35,7 +42,7 @@ export default class FileGraph extends FileNode { this.merge(newNode) } - handleEvent(event) { + handleEvent(event: Event) { // eslint-disable-next-line default-case switch (true) { case !!event.add: diff --git a/packages/file-graph/src/fileNode.js b/packages/file-graph/src/fileNode.ts similarity index 85% rename from packages/file-graph/src/fileNode.js rename to packages/file-graph/src/fileNode.ts index cf8f089..7c64fe1 100644 --- a/packages/file-graph/src/fileNode.js +++ b/packages/file-graph/src/fileNode.ts @@ -1,19 +1,25 @@ -import File from './file.js' +import File, { FileObject } from './file.js' import { DuplicateItemError, ParentNotExistsError, FileNotExistsError, } from './errors.js' -import { basename, dirname } from './utils.js' +import { dirname } from './utils.js' export default class FileNode extends File { - constructor(file) { + children: FileNode[] + + constructor(file: FileObject | FileNode) { super(file) this.children = [] - if (file.children) this.children = file.children.map((f) => new FileNode(f)) + if ((file).children) + this.children = (file).children.map((f) => new FileNode(f)) } - addChild(fileInput, { makeParents } = {}) { + addChild( + fileInput: FileObject, + { makeParents }: { makeParents?: boolean } = {} + ) { const file = new FileNode(fileInput) if (file.path === this.path) { throw new DuplicateItemError( @@ -39,7 +45,6 @@ export default class FileNode extends File { } else if (makeParents) { const parent = new FileNode({ path: parentPath, - name: basename(parentPath), type: 'folder', discovered: false, children: [file], @@ -53,7 +58,7 @@ export default class FileNode extends File { } } - removeChild(fileToRemove) { + removeChild(fileToRemove: FileObject) { const file = new FileNode(fileToRemove) const parentPath = dirname(file.path) @@ -73,7 +78,7 @@ export default class FileNode extends File { } } - merge(fileNode) { + merge(fileNode: FileNode) { // Merge the children of the provided file node into this node // If a child already exists, merge the children of that child // If a child does not exist, add it to this node @@ -88,7 +93,7 @@ export default class FileNode extends File { if (existingChild) { existingChild.merge(child) } else { - this.children.push(child) + this.children.push(new FileNode(child)) } }) @@ -112,14 +117,12 @@ export default class FileNode extends File { } } else { throw new Error( - 'Cannot merge file nodes with different paths', - this.path, - fileNode.path + `Cannot merge file nodes with different paths: ${this.path}, ${fileNode.path}` ) } } - toString(level = 0) { + toString(level = 0): string { let { name } = this const indent = ' '.repeat(level) name = `${indent}${name}` diff --git a/packages/file-graph/src/index.js b/packages/file-graph/src/index.js deleted file mode 100644 index 4b1fcda..0000000 --- a/packages/file-graph/src/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export { default as File } from './file.js' -export { default as FileNode } from './fileNode.js' -export { default as FileGraph } from './fileGraph.js' diff --git a/packages/file-graph/src/index.ts b/packages/file-graph/src/index.ts new file mode 100644 index 0000000..f9dc793 --- /dev/null +++ b/packages/file-graph/src/index.ts @@ -0,0 +1,3 @@ +export { default as File, FileObject } from './file.js' +export { default as FileNode } from './fileNode.js' +export { default as FileGraph, Event } from './fileGraph.js' diff --git a/packages/file-graph/src/utils.js b/packages/file-graph/src/utils.ts similarity index 57% rename from packages/file-graph/src/utils.js rename to packages/file-graph/src/utils.ts index 48fffd9..5a637e4 100644 --- a/packages/file-graph/src/utils.js +++ b/packages/file-graph/src/utils.ts @@ -1,4 +1,4 @@ -export function dirname(path) { +export function dirname(path: string) { const parts = path.split('/') if (parts.length <= 2) { return '/' @@ -7,7 +7,7 @@ export function dirname(path) { return parts.join('/') } -export function basename(path) { +export function basename(path: string): string { const parts = path.split('/') - return parts.pop() + return parts.pop() ?? '' }