A TypeScriptToLua plugin that flattens luaBundle output, eliminating the module system entirely.
TSTL's bundler wraps each module in a closure with a require() runtime. This plugin rewrites the bundle to emit all module code in dependency order as top-level locals, removing the ____modules table, ____moduleCache, require() function, module closures, and import/export boilerplate.
Some Lua runtimes don't support or benefit from a module system, or are have tight limitations. If you're targeting an environment like this and using luaBundle, the generated runtime adds unnecessary overhead. This plugin strips it out and gives you clean, top-level code.
bun add -D @gwigz/tstl-bundle-flatten
# or
npm install -D @gwigz/tstl-bundle-flattenAdd the plugin to your tsconfig.json:
{
"tstl": {
"luaBundle": "bundle.lua",
"luaBundleEntry": "src/index.ts",
"luaPlugins": [
+ { "name": "@gwigz/tstl-bundle-flatten" }
]
}
}Options are passed inline in the plugin entry:
| Option | Type | Default | Description |
|---|---|---|---|
skipModules |
string[] |
[] |
Module names to leave untouched by the flattener |
format |
boolean |
true |
Add whitespace between logical code blocks in the output |
Given a bundle with two modules:
src/
├── greet.ts → export function greet(name: string) { ... }
└── index.ts → import { greet } from "./greet"
TSTL's default luaBundle output wraps everything in a module runtime. After tstl-bundle-flatten, you get:
local function greet(name)
print("Hello, " .. name)
end
greet("world")No ____modules, no require, no closures, just flat Lua.
{ "name": "@gwigz/tstl-bundle-flatten", // Modules to exclude from flattening (kept in the bundle runtime) "skipModules": ["constants"], // Insert blank lines at code boundaries for readability (default: true) "format": true, }