monitor/core/lib/fs.ts
2025-04-16 22:30:27 +07:00

72 lines
2.5 KiB
TypeScript

import fs from 'node:fs';
import fsp from 'node:fs/promises';
import type { Dirent } from 'node:fs';
import { txEnv } from '@core/globalData';
import path from 'node:path';
/**
* Check if its possible to create a file in a folder
*/
export const canWriteToPath = async (targetPath: string) => {
try {
await fsp.access(path.dirname(targetPath), fs.constants.W_OK);
return true;
} catch (error) {
return false;
}
}
/**
* Returns an array of directory entries (files and directories) from the specified root path.
*/
export const getPathContent = async (root: string, filter?: (entry: Dirent) => boolean) => {
const stats = await fsp.stat(root);
if (!stats.isDirectory()) {
throw new Error(`Path '${root}' is not a directory`);
}
const allEntries = await fsp.readdir(root, { withFileTypes: true });
return allEntries.filter((entry) => (
(entry.isFile() || entry.isDirectory())
&& filter ? filter(entry) : true
));
}
/**
* Returns an array of file entries from the specified root path.
*/
export const getPathFiles = async (root: string, filter?: (entry: Dirent) => boolean) => {
const entries = await getPathContent(root, filter);
return entries.filter((entry) => entry.isFile());
}
/**
* Returns an array of subdirectory entries from the specified root path.
*/
export const getPathSubdirs = async (root: string, filter?: (entry: Dirent) => boolean) => {
const entries = await getPathContent(root, filter);
return entries.filter((entry) => entry.isDirectory());
}
/**
* Generates a user-friendly markdown error message for filesystem operations.
* Handles common cases like Windows paths on Linux and permission issues.
*/
export const getFsErrorMdMessage = (error: any, targetPath: string) => {
if(typeof error.message !== 'string') return 'unknown error';
if (!txEnv.isWindows && /^[a-zA-Z]:[\\/]/.test(targetPath)) {
return `Looks like you're using a Windows path on a Linux server.\nThis likely means you are attempting to use a path from your computer on a remote server.\nIf you want to use your local files, you will first need to upload them to the server.`;
} else if (error.message?.includes('ENOENT')) {
return `The path provided does not exist:\n\`${targetPath}\``;
} else if (error.message?.includes('EACCES') || error.message?.includes('EPERM')) {
return `The path provided is not accessible:\n\`${targetPath}\``;
}
return error.message as string;
}