| # `@humanfs/node` | |
| by [Nicholas C. Zakas](https://humanwhocodes.com) | |
| If you find this useful, please consider supporting my work with a [donation](https://humanwhocodes.com/donate) or [nominate me](https://stars.github.com/nominate/) for a GitHub Star. | |
| ## Description | |
| The `hfs` bindings for use in Node.js and Node.js-compatible runtimes. | |
| > [!WARNING] | |
| > This project is **experimental** and may change significantly before v1.0.0. Use at your own caution and definitely not in production! | |
| ## Installation | |
| Install using your favorite package manager: | |
| ```shell | |
| npm install @humanfs/node | |
| # or | |
| pnpm install @humanfs/node | |
| # or | |
| yarn add @humanfs/node | |
| # or | |
| bun install @humanfs/node | |
| ``` | |
| ## Usage | |
| The easiest way to use hfs in your project is to import the `hfs` object: | |
| ```js | |
| import { hfs } from "@humanfs/node"; | |
| ``` | |
| Then, you can use the API methods: | |
| ```js | |
| // 1. Files | |
| // read from a text file | |
| const text = await hfs.text("file.txt"); | |
| // read from a JSON file | |
| const json = await hfs.json("file.json"); | |
| // read raw bytes from a text file | |
| const arrayBuffer = await hfs.arrayBuffer("file.txt"); | |
| // write text to a file | |
| await hfs.write("file.txt", "Hello world!"); | |
| // write bytes to a file | |
| await hfs.write("file.txt", new TextEncoder().encode("Hello world!")); | |
| // append text to a file | |
| await hfs.append("file.txt", "Hello world!"); | |
| // append bytes to a file | |
| await hfs.append("file.txt", new TextEncoder().encode("Hello world!")); | |
| // does the file exist? | |
| const found = await hfs.isFile("file.txt"); | |
| // how big is the file? | |
| const size = await hfs.size("file.txt"); | |
| // when was the file modified? | |
| const mtime = await hfs.lastModified("file.txt"); | |
| // copy a file from one location to another | |
| await hfs.copy("file.txt", "file-copy.txt"); | |
| // move a file from one location to another | |
| await hfs.move("file.txt", "renamed.txt"); | |
| // delete a file | |
| await hfs.delete("file.txt"); | |
| // 2. Directories | |
| // create a directory | |
| await hfs.createDirectory("dir"); | |
| // create a directory recursively | |
| await hfs.createDirectory("dir/subdir"); | |
| // does the directory exist? | |
| const dirFound = await hfs.isDirectory("dir"); | |
| // copy the entire directory | |
| hfs.copyAll("from-dir", "to-dir"); | |
| // move the entire directory | |
| hfs.moveAll("from-dir", "to-dir"); | |
| // delete a directory | |
| await hfs.delete("dir"); | |
| // delete a non-empty directory | |
| await hfs.deleteAll("dir"); | |
| ``` | |
| If you'd like to create your own instance, import the `NodeHfs` constructor: | |
| ```js | |
| import { NodeHfs } from "@humanfs/node"; | |
| import fsp from "fs/promises"; | |
| const hfs = new NodeHfs(); | |
| // optionally specify the fs/promises object to use | |
| const hfs = new NodeHfs({ fsp }); | |
| ``` | |
| If you'd like to use just the impl, import the `NodeHfsImpl` constructor: | |
| ```js | |
| import { NodeHfsImpl } from "@humanfs/node"; | |
| import fsp from "fs/promises"; | |
| const hfs = new NodeHfsImpl(); | |
| // optionally specify the fs/promises object to use | |
| const hfs = new NodeHfsImpl({ fsp }); | |
| ``` | |
| ## Errors Handled | |
| * `ENOENT` - in most cases, these errors are handled silently. | |
| * `ENFILE` and `EMFILE` - calls that result in these errors are retried for up to 60 seconds before giving up for good. | |
| ## License | |
| Apache 2.0 | |