1.2.0 ⢠Published 5 months ago
mayonaka v1.2.0
Art by KyasarinHagaren
About
mayonaka š (ma-yo-na-ka) is a flexible folder builder for javascript runtimes. It provides a very minimal yet fluent builder interface on top of the familiar node:fs API with concurrency control
API Reference: https://ragrag.github.io/mayonaka
Installing
npm install mayonaka
Examples
Creating a similar directory with mayonaka
.
āāā foo
āāā bar
ā āāā qux
ā āāā quux
ā āāā readable.txt
ā āāā buffer.txt
ā āāā string.txt
ā āāā iterable.txt
āāā baz
import { Mayonaka } from "mayonaka";
import { Readable } from "node:stream";
await new Mayonaka(__dirname)
// similar to fs.mkdir
.addFolder("foo")
.addFolder("bar", (bar) => {
bar.addFolder("qux", (qux) => {
qux
.addFolder("quux")
// similar to fs.writeFile but data from an async source
.addFile(
"readable.txt",
async () => Readable.from(["mayonaka"]),
"utf-8"
)
.addFile("buffer.txt", async () => Buffer.from("mayonaka"), "utf-8")
.addFile("string.txt", async () => "mayonaka", "utf-8")
.addFile("iterable.txt", async () => iterable(), "utf-8");
});
})
.addFolder("baz")
.build();
function* iterable() {
const strings = ["m", "a", "y", "o", "n", "a", "k", "a"];
for (const str of strings) {
yield str;
}
}
Concurrency control
import { Mayonaka } from "mayonaka";
await new Mayonaka(__dirname, { maxConcurrency: 50 })
.addFolder("foo")
.addFolder("bar", (bar) => {
for (let i = 0; i < 1000; i++) {
bar.addFile(`${i}.txt`, async () => expensive(i), "utf-8");
}
})
.build();
Access permissions
import { MayonakaSync } from "mayonaka";
// global access permissions
new MayonakaSync(__dirname, { dirMode: 0o744, fileMode: 0o766 })
// local access permissions, overriding global permissions
.addFolder("foo", { mode: 0o777 })
.addFolder("bar", (bar) => {
bar.addFile("mayonaka.txt", () => "mayonaka š", "utf-8");
})
.addFile("baz.txt", () => "baz", "utf-8", { mode: 0o777 })
.build();
Using MayonakaCustom with custom creation functions
import { MayonakaCustom } from "mayonaka";
type Folder = { name: string; children: (Folder | File)[] };
type File = number;
const structure = await new MayonakaCustom<Folder, File>(
// initial root or null
{ name: 'root', children: [] },
// custom folder creation function
async (parentFolder, data) => {
const folder = { name: data.name, children: [] };
if (parentFolder) {
parentFolder.children.push(folder);
}
return folder;
},
// Custom file creation function
async (parentFolder, content) => {
if (parentFolder) {
parentFolder.children.push(content);
}
},
)
.addFile(async () => 'readme.txt')
.addFolder({ name: 'docs' }, docs => {
docs.addFolder({ name: 'images' }, images => {
images.addFile(async () => 'photo.jpg');
});
})
.build();