Stdlib Expansion Roadmap

This document proposes new modules that would push the runtime closer to a truly "complete" standard library in the spirit of mature ecosystems like Python, while still respecting Luau's strengths:

This is not an audit of current modules. It is a forward-looking roadmap of what to add next.

Design Principles


Tier 1: Must-Have

These are the highest-value additions for everyday application development.

shutil

Purpose:

Suggested API:

local shutil = require("@eryx/shutil")

shutil.copy("a.txt", "b.txt")
shutil.copytree("src", "dist")
shutil.move("build/output", "release/output")
shutil.rmtree(".cache/tmp")
shutil.mirror("assets", "dist/assets")

Likely exports:

toml

Purpose:

Suggested API:

local toml = require("@eryx/toml")

local data = toml.decode([[
title = "App"
[server]
port = 8080
]])

local text = toml.encode({
    title = "App",
    server = { port = 8080 },
})

Likely exports:

url

Purpose:

Suggested API:

local url = require("@eryx/url")

local u = url.parse("https://example.com:8443/a/b?x=1#frag")
print(u.scheme, u.host, u.port, u.path, u.query, u.fragment)

url.format(u)
url.join("https://example.com/api/", "../v1/users")
url.withQuery("https://example.com", { q = "hello", page = 2 })

Likely exports:

env

Purpose:

Suggested API:

local env = require("@eryx/env")

local cfg = env.load({
    PORT = env.number({ default = 8080 }),
    DEBUG = env.boolean({ default = false }),
    DATABASE_URL = env.string({ required = true }),
})

Likely exports:

retry

Purpose:

Suggested API:

local retry = require("@eryx/retry")

local result = retry.run(function(attempt)
    return flakyCall()
end, {
    attempts = 5,
    backoff = "exponential",
    minDelay = 0.1,
    maxDelay = 2,
    jitter = true,
})

Likely exports:

cache

Purpose:

Suggested API:

local cache = require("@eryx/cache")

local c = cache.lru({ maxEntries = 1000 })
c:set("a", 1)
c:get("a")

local ttl = cache.ttl({ ttl = 60 })
local memoized = cache.memoize(function(x)
    return expensive(x)
end)

Likely exports:

Likely cache methods:

cli

Purpose:

Suggested API:

local cli = require("@eryx/cli")

print(cli.color("hello", "green"))
cli.table({
    { "Name", "Score" },
    { "Ada", 100 },
})

local bar = cli.progress({ total = 100 })
bar:advance(10)
bar:finish()

Likely exports:

schema

Purpose:

Suggested API:

local schema = require("@eryx/schema")

local User = schema.object({
    id = schema.string(),
    age = schema.number({ min = 0 }),
    admin = schema.boolean({ default = false }),
})

local value = User:parse(input)

Likely exports:

Tier 2: Strong Differentiators

These are less universally urgent, but would make the platform feel rich and unusually capable.

archive

Purpose:

Suggested API:

local archive = require("@eryx/archive")

archive.pack("dist", "dist.tar.gz")
archive.unpack("release.zip", "release/")
archive.list("release.zip")

Likely exports:

email

Purpose:

Suggested API:

local email = require("@eryx/email")

local msg = email.message({
    from = "[email protected]",
    to = { "[email protected]" },
    subject = "Hello",
    text = "Plain body",
    html = "<b>Hello</b>",
})

local raw = msg:render()
local parsed = email.parse(raw)

Likely exports:

dns

Purpose:

Suggested API:

local dns = require("@eryx/dns")

dns.lookup("example.com")
dns.resolve("example.com", "MX")
dns.reverse("8.8.8.8")

Likely exports:

metrics

Purpose:

Suggested API:

local metrics = require("@eryx/metrics")

local requests = metrics.counter("http_requests_total")
requests:inc()

local latency = metrics.histogram("http_latency_seconds")
latency:observe(0.12)

Likely exports:

trace

Purpose:

Suggested API:

local trace = require("@eryx/trace")

trace.withSpan("request", function(span)
    span:set("path", "/users")
    doWork()
end)

Likely exports:

benchmark

Purpose:

Suggested API:

local benchmark = require("@eryx/benchmark")

benchmark.run("json encode", function()
    json.encode(data)
end)

Likely exports:

diff

Purpose:

Suggested API:

local diff = require("@eryx/diff")

diff.text("a\nb\n", "a\nc\n")
diff.lines(left, right)
diff.table(oldValue, newValue)

unicode

Purpose:

Suggested API:

local unicode = require("@eryx/unicode")

unicode.normalize("NFC", text)
unicode.isLetter("a")
unicode.graphemes(text)

text

Purpose:

Suggested API:

local text = require("@eryx/text")

text.slug("Hello World")
text.wrap(longText, 80)
text.indent(text, 4)
text.truncate(text, 120)

collections

Purpose:

Suggested API:

local collections = require("@eryx/collections")

local deque = collections.deque()
deque:pushRight(1)
deque:pushLeft(0)
deque:popLeft()

local counter = collections.counter({ "a", "b", "a" })
print(counter:get("a"))

Likely exports:

enum

Purpose:

Suggested API:

local enum = require("@eryx/enum")

local Color = enum.new({ "Red", "Green", "Blue" })
print(Color.Red)

x509

Purpose:

Suggested API:

local x509 = require("@eryx/x509")

local cert = x509.parsePem(pem)
print(cert.subject, cert.issuer)

signing

Purpose:

Suggested API:

local signing = require("@eryx/signing")

local token = signing.sign(secret, payload)
local payload = signing.verify(secret, token)

Desktop helpers

Potential modules:

Suggested APIs:

local clipboard = require("@eryx/clipboard")
clipboard.writeText("hello")
clipboard.readText()

local dialog = require("@eryx/dialog")
dialog.openFile()
dialog.saveFile()
dialog.alert("Done")

Tier 3: Ambitious Extras

These are powerful, but either specialized or large in scope.

Networking and protocols

Mock API example:

local rpc = require("@eryx/rpc")

local client = rpc.connect("https://api.example.com/rpc")
client:call("sum", { 1, 2, 3 })

Serialization and config extras

Mock API example:

local dotenv = require("@eryx/dotenv")
dotenv.load(".env")

Systems and resource introspection

Mock API example:

local system = require("@eryx/system")

system.hostname()
system.cpus()
system.memory()
system.networkInterfaces()

Security extras

Mock API example:

local totp = require("@eryx/totp")

local secret = totp.generateSecret()
totp.code(secret)
totp.verify(secret, input)

Mock API example:

local search = require("@eryx/search")

search.fuzzy("helo", { "hello", "world" })