@hyperfrontend/project-scope/core/fsfs
Safe, typed wrappers around Node.js synchronous filesystem APIs with structured error handling.
Covers four areas: reading (readFileContent, readFileBuffer, readJsonFile, plus *IfExists variants), writing (writeFileContent, writeJsonFile, ensureDir — automatically creates parent directories), directory operations (readDirectory, readDirectoryRecursive, createDirectory, removeDirectory), and stat/traversal helpers (exists, isFile, isDirectory, isSymlink, findUpwardWhere, locateByMarkers, traverseUpward).
All operations surface failures via createFileSystemError with codes (FS_NOT_FOUND, FS_READ_ERROR, FS_WRITE_ERROR, FS_PARSE_ERROR) carrying contextual paths.
API Reference
ƒ Functions
Parameters
Example
Creating directories
// Create nested directories
createDirectory('./output/reports/2024')
// Create single directory without parents
createDirectory('./logs', { recursive: false })createFileSystemError(message: string, code: FileSystemErrorCode, context: FileSystemErrorContext): Error
Parameters
Returns
ErrorExample
Creating a file system error
throw createFileSystemError(
'Cannot read file',
'FS_READ_ERROR',
{ path: './missing.txt', operation: 'read' }
)Parameters
| Name | Type | Description |
|---|---|---|
§dirPath | string | Directory path to ensure exists |
Example
Ensuring directory exists
ensureDir('./output/reports')
// Directory now exists (created if missing)Parameters
| Name | Type | Description |
|---|---|---|
§filePath | string | Path to check |
Returns
booleanExample
Checking if path exists
if (exists('./config.json')) {
const config = readJsonFile('./config.json')
}Parameters
Returns
stringExample
Finding directory with specific config
// Find directory with a specific config
const configDir = findUpwardWhere('./deep/nested/path', (dir) =>
existsSync(join(dir, '.eslintrc.js'))
)Parameters
Returns
FileStatsExample
Getting file statistics
const stats = getFileStat('./package.json')
if (stats) {
console.log(`Size: ${stats.size} bytes`)
console.log(`Modified: ${stats.modified}`)
}Parameters
| Name | Type | Description |
|---|---|---|
§dirPath | string | Path to check |
Returns
booleanExample
Checking if path is a directory
if (isDirectory('./src')) {
// Path exists and is a directory
}Parameters
| Name | Type | Description |
|---|---|---|
§filePath | string | Path to check |
Returns
booleanExample
Checking if path is a file
if (isFile('./package.json')) {
// Path exists and is a regular file
}Parameters
| Name | Type | Description |
|---|---|---|
§linkPath | string | Path to check |
Returns
booleanExample
Checking if path is a symlink
if (isSymlink('./node_modules/.bin/tsc')) {
// Path is a symbolic link
}Parameters
Returns
stringExample
Finding project root by marker files
// Find project root by looking for common marker files
const projectRoot = locateByMarkers('./src/components', [
'package.json',
'nx.json',
'tsconfig.base.json'
])
// => '/workspace/my-project'Parameters
| Name | Type | Description |
|---|---|---|
§dirPath | string | Absolute or relative path to the directory |
Returns
DirectoryEntry[]Example
Listing directory contents
import { readDirectory } from '@hyperfrontend/project-scope'
const entries = readDirectory('./src')
for (const entry of entries) {
console.log(entry.name, entry.isFile ? 'file' : 'directory')
}Parameters
Returns
DirectoryEntry[]Example
Recursive directory listing with options
import { readDirectoryRecursive } from '@hyperfrontend/project-scope'
// List all files up to 3 levels deep
const entries = readDirectoryRecursive('./src', { maxDepth: 3 })
// Include hidden files
const allEntries = readDirectoryRecursive('./project', { includeHidden: true })Parameters
| Name | Type | Description |
|---|---|---|
§filePath | string | Path to file |
Returns
BufferExample
Reading file as buffer
const buffer = readFileBuffer('./image.png')
console.log(buffer.length) // File size in bytesParameters
Returns
stringExample
Reading file contents
import { readFileContent } from '@hyperfrontend/project-scope'
const content = readFileContent('./package.json')
console.log(content) // JSON stringParameters
Returns
stringExample
Reading file if it exists
const content = readFileIfExists('./optional-config.json')
if (content) {
// File existed, use content
}Parameters
Returns
TExample
Reading JSON file
import { readJsonFile } from '@hyperfrontend/project-scope'
// Read with type inference
interface Config { port: number }
const config = readJsonFile<Config>('./config.json')
// Read with default fallback
const settings = readJsonFile('./settings.json', { default: {} })Parameters
| Name | Type | Description |
|---|---|---|
§filePath | string | Path to JSON file |
Returns
TExample
Reading JSON file if it exists
interface UserSettings { theme: string }
const settings = readJsonFileIfExists<UserSettings>('./user-settings.json')
const theme = settings?.theme ?? 'default'Parameters
Example
Removing directories
// Remove directory and all contents
removeDirectory('./temp', { recursive: true })
// Safe removal (no error if missing)
removeDirectory('./cache', { recursive: true, force: true })Parameters
Returns
stringExample
Finding directory containing README
// Find first directory containing a README
const readmeDir = traverseUpward('./src/utils', (dir) =>
existsSync(join(dir, 'README.md'))
)
// => '/project' or nullParameters
Example
Writing binary buffer to file
const imageBuffer = Buffer.from([0x89, 0x50, 0x4e, 0x47])
writeFileBuffer('./output/image.png', imageBuffer)Parameters
Example
Writing text content to file
import { writeFileContent } from '@hyperfrontend/project-scope'
// Write a simple text file
writeFileContent('./output/data.txt', 'Hello, World!')
// Write with custom encoding
writeFileContent('./output/data.txt', 'Content', { encoding: 'utf-8' })Parameters
Example
Writing JSON data to file
import { writeJsonFile } from '@hyperfrontend/project-scope'
// Write object to JSON file
writeJsonFile('./config.json', { port: 3000, debug: true })
// Write with custom indentation
writeJsonFile('./config.json', data, { indent: 4 })◈ Interfaces
Properties
◆ Types
type FileSystemErrorCode = "FS_NOT_FOUND" | "FS_READ_ERROR" | "FS_WRITE_ERROR" | "FS_PARSE_ERROR" | "FS_NOT_A_DIRECTORY"