#lua #transpiler #luau

bin+lib dalbit

A Luau-to-Lua transpiler

2 releases

new 0.1.1 Dec 11, 2024
0.1.0 Dec 11, 2024

#7 in #transpiler

MIT license

81KB
2K SLoC

Dalbit

Dalbit(달빛) is a Luau-to-Lua transpiler, designed specifically for Lua 5.3.

TO-DOs

  • Implement CLI.
  • Implement basic transpilation process using darklua and full-moon.
  • Implement modifiers (such as converting number literals and generalized iterations)
  • Implement basic lua polyfills.
  • Add tests for polyfills.
  • Add tests for transpilation. (to ensure the same results in lua and luau)
  • Add tests for dalbit internally.
  • Add logging for dalbit internally for debug.
  • convert_bit32 modifier now converts bit32.btest.
  • Add comments for docs and code readability. (WIP)
  • Optimize polyfill.

Installation

Using Cargo (from crates.io)

cargo install dalbit --locked

Usage

init

Initializes dalbit manifest file in the current path.

dalbit init

fetch

Fetches and updates lua polyfills.

  • This polyfill can be found here.
dalbit fetch

transpile

Transpiles luau code to lua code.

dalbit transpile

clean

Cleans polyfill caches from disk.

dalbit clean

Example

dalbit.toml

input = "input.luau"
output = "output.lua"
file_extension = "lua"
target_version = "lua53"
minify = true

[modifiers]

[polyfill]
repository = "https://github.com/CavefulGames/dalbit-polyfill"
injection_path = "__polyfill__"

inputs/input.luau

local obj = { items = {1, 4, 9} }
setmetatable(obj, { __iter = function(o) return next, o.items end })

for k, v in obj do
    print(k * k)
end

outputs/output.luau

local setmetatable=require'./__polyfill__'.setmetatable local __DALBIT_getmetatable_iter=require'./__polyfill__'.__DALBIT_getmetatable_iter local type=require'./__polyfill__'.type local next=require'./__polyfill__'.next local io=nil local module=nil local package=nil local dofile=nil local loadfile=nil local load=nil local obj={items={1,4,9}}
setmetatable(obj,{__iter=function(o)return next,o.items end})do local _DALBIT_REMOVE_GENERALIZED_ITERATION_itere234e8bef135bb4c, _DALBIT_REMOVE_GENERALIZED_ITERATION_invare234e8bef135bb4c, _DALBIT_REMOVE_GENERALIZED_ITERATION_controle234e8bef135bb4c=

obj if type(_DALBIT_REMOVE_GENERALIZED_ITERATION_itere234e8bef135bb4c)=='table'then local m=__DALBIT_getmetatable_iter(_DALBIT_REMOVE_GENERALIZED_ITERATION_itere234e8bef135bb4c)if type(m)=='table'and type(m.__iter)=='function'then _DALBIT_REMOVE_GENERALIZED_ITERATION_itere234e8bef135bb4c, _DALBIT_REMOVE_GENERALIZED_ITERATION_invare234e8bef135bb4c, _DALBIT_REMOVE_GENERALIZED_ITERATION_controle234e8bef135bb4c=m.__iter(_DALBIT_REMOVE_GENERALIZED_ITERATION_itere234e8bef135bb4c)else _DALBIT_REMOVE_GENERALIZED_ITERATION_itere234e8bef135bb4c, _DALBIT_REMOVE_GENERALIZED_ITERATION_invare234e8bef135bb4c, _DALBIT_REMOVE_GENERALIZED_ITERATION_controle234e8bef135bb4c=next, _DALBIT_REMOVE_GENERALIZED_ITERATION_itere234e8bef135bb4c end end for k,v in _DALBIT_REMOVE_GENERALIZED_ITERATION_itere234e8bef135bb4c,_DALBIT_REMOVE_GENERALIZED_ITERATION_invare234e8bef135bb4c,_DALBIT_REMOVE_GENERALIZED_ITERATION_controle234e8bef135bb4c do
print(k*k)
end end

How does it work?

  • Dalbit utilizes darklua and full-moon to transform lua scripts.

Why darklua-demo over darklua?

  • darklua-demo is a temporary fork to work properly with dal.
  • darklua-demo will be replaced by official darklua once darklua released with important features to work properly with dal.

Special Thanks

Trivia

The name of this project, Dalbit, translates to "moonshine" in Korean.

Dependencies

~27–43MB
~795K SLoC