npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@hautajoki/hexagon

v0.1.0

Published

Luau and Roblox test/benchmark runner with exact-version Tessera execution

Readme

Hexagon

Hexagon is a Luau and Roblox test/benchmark runner. One package contains:

  • the hexagon Bun CLI;
  • the dependency-free Luau runtime and native runner;
  • a Roblox runner bundled into exact Tessera artifacts on demand;
  • TypeScript types for TypeScript-Go-Roblox suites.

It is intentionally a testing tool, not a task runner. Tessera remains responsible for project configuration, builds, saved place versions, credentials, and Open Cloud execution.

Install

During local development in this repository:

{
	"devDependencies": {
		"@hautajoki/hexagon": "workspace:*"
	}
}

A packaged consumer installs the release as a normal development dependency and exposes direct scripts:

bun add --dev @hautajoki/hexagon
{
	"scripts": {
		"test": "hexagon test",
		"bench": "hexagon bench"
	}
}

No second Hexagon config file is required.

Native runs require the luau executable. Cloud runs additionally require the tessera executable at version 0.2.0 or newer and an existing Tessera project/place configuration. Hexagon owns the transient <root>/test/hexagon path; add that path to the project ignore file so an interrupted run cannot surface generated runtime files as authored changes.

Conventions

  • *.local.spec.luau and *.local.bench.luau are native-capable and also run in cloud coverage.
  • *.spec.ts, *.bench.ts, *.spec.luau, and *.bench.luau run in a Roblox Open Cloud artifact.
  • Suites return or default-export (t) => { ... }.
  • Files are discovered in lexical order.
  • Correctness tests in benchmark modules always run before timings.
  • Empty selections and focused .only cases exit nonzero by default.

TypeScript suites import only the API type:

import type { Suite } from "@hautajoki/hexagon";

const suite: Suite = (t) => {
	t.test("works", () => {
		const resource = acquireResource();
		t.cleanup(() => resource.Destroy());
		t.expect(resource).toExist();
	});
};

export = suite;

Every t.cleanup callback runs once in LIFO order, even when the body or another cleanup fails. afterEach callbacks receive the same all-cleanups guarantee. Benchmark afterSample also runs when setup or timing fails, and a cleanup failure is retained alongside the primary failure.

Isolation

File isolation is the default:

  • native files run in separate luau processes and therefore separate VMs;
  • cloud files run in separate Open Cloud executions and therefore separate DataModels.

Cases within one file intentionally share that file's VM/DataModel. Use t.cleanup for case-owned state. --isolation run is a faster opt-in that loads all selected files in one VM/DataModel.

For cloud file isolation, Hexagon asks Tessera to build and save once, reads the exact version from tessera run --json, then invokes every suite against that same version.

For native execution, Hexagon temporarily materializes its runtime under <root>/test/hexagon as well. This keeps Luau's relative module resolution inside the consumer source tree even when the package manager stores Hexagon in an external cache.

Open Cloud artifact bundling

hexagon test --cloud temporarily materializes its version-matched Roblox runtime under <root>/test/hexagon, invokes tessera run --fresh, and removes the generated runtime afterward. The project keeps its normal tessera.config.ts; no generated suite manifest or second deployment config is committed.

Co-located suites are compiled by the project's existing source/build recipe, so the saved test artifact contains both suites and the runner. This includes native-capable .local.* suites. A custom source router can override the runner DataModel path with --runner.

This mechanism does not decide whether a project's production build excludes co-located suites. That remains an explicit build/release choice; use a dedicated test artifact or a project build variant when production exclusion is required.

Commands

hexagon test
hexagon bench terrain
hexagon test --cloud
hexagon test --cloud --environment development --place main
hexagon test --cloud --version 1234
hexagon test --cloud --isolation run
hexagon test --json

Fresh exact artifacts are the cloud default. --published is deliberately named for its weaker mutable-head semantics and is permitted only with shared run isolation. --allow-focused likewise requires --isolation run, ensuring that focus is global rather than scoped independently to each file. It is intended for a deliberate interactive run, not release validation.