1.2.0 • Published 5 months ago

mayonaka v1.2.0

Weekly downloads
-
License
MIT
Repository
github
Last release
5 months ago

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();
1.2.0

5 months ago

1.1.9

6 months ago

1.1.8

6 months ago

1.1.7

6 months ago

1.1.6

11 months ago

1.1.5

1 year ago

1.1.4

1 year ago

1.1.3

1 year ago

1.1.2

1 year ago

1.1.0

1 year ago

1.0.6

1 year ago

1.0.5

1 year ago

1.0.4

1 year ago

1.0.3

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago