## ❓ What's rbxm-suite?
`rbxm-suite` is the spiritual successor to Rostruct, designed for exploiting with a Rojo-based workflow.
Store your modules, assets, and UI on the filesystem. Use Rojo to build your project to a rbxm file, and rbxm-suite can launch it in your exploit.
## ⚡ Features
🔌 Asset downloader - Download model assets from GitHub Releases
🚀 Faster launch times - Outspeed Rostruct by bundling on execution
🧬 Use modules across projects
❌ Verbose errors for cyclic dependencies
## 🌻 Motivation
[Rostruct](https://github.com/richie0866/Rostruct) is designed to mimic [Rojo](https://rojo.space) on execution, but it isn't complete.
I designed rbxm-suite as a **smarter alternative**. Instead of mimicking Rojo, it handles what Rojo can already generate. Build your project with Rojo, and leave the execution to rbxm-suite.
By moving the build process upstream, you can take advantage of a **true Rojo workflow**.
## 🔌 Installation
You can load rbxm-suite through a GitHub Release:
``` lua
local rbxmSuite = loadstring(game:HttpGetAsync("https://github.com/richie0866/rbxm-suite/releases/latest/download/rbxm-suite.lua"))()
```
Or, you can download `rbxm-suite.lua` from a release and modify it yourself:
``` lua
local rbxmSuite = (function()
-- This part will be automatically generated
)()
-- Use rbxm-suite
```
The unminified source is available in the `src` folder.
## ✨ Supported workflows
### ⚡ Rojo
* Build your Roblox projects with [Rojo](https://rojo.space).
### ⚡ TypeScript
* Write and compile TypeScript code with [roblox-ts](https://roblox-ts.com) (should be the `model` type!)
## 📜 Usage
🚀 Launch a project
> ``` ts
> function rbxmSuite.launch(path: string, options: Options): Instance
> ```
>
> Loads a rbxm(x) file into the game and loads all scripts. `path` may be a file path or a `rbxassetid` path as of v2.1.0.
>
> By default, it will run all enabled LocalScript objects.
```lua
local project = rbxmSuite.launch("path/to/Project.rbxm", {
runscripts = true,
deferred = true,
nocache = false,
nocirculardeps = true,
debug = false,
verbose = false,
})
```
> ⚙️ **`runscripts`**
>
> Run every enabled LocalScript in your project on new threads. Defaults to `true`.
> ⚙️ **`deferred`**
>
> Whether `runscripts` should use task.defer instead of task.spawn. Defaults to `true`.
> ⚙️ **`nocache`**
>
> For `rbxassetid` paths, prevent using cached data.
>
> This option manually requests from the web API to grab asset data.
> ⚙️ **`nocirculardeps`**
>
> Enable circular dependency prevention. Defaults to `true`.
>
> In rare cases, some workflows need this set to `false`.
> ⚙️ **`debug`**
>
> Enable debug mode. Defaults to `false`.
>
> When `true`, error traceback is preserved and scripts are lazy-loaded with multiple `loadstring` calls.
> When `false`, every script is compiled at the same time with one `loadstring` call. Typically faster when `false`.
>
> It should be left `false` in production, and set to `true` during development.
> ⚙️ **`verbose`**
>
> Enable verbose logging. Defaults to `false`.
🔭 Require a specific module
> ``` ts
> function rbxmSuite.require(module: LocalScript | ModuleScript): any
> ```
>
> Requires the module, and returns what the module returned. `module` must be a LocalScript or ModuleScript created by rbxmSuite.
>
> Note that **any script** in the project can be required!
```lua
local myModule = rbxmSuite.launch("path/to/MyModule.rbxm")
local MyModule = rbxmSuite.require(myModule)
MyModule.doSomething()
```
🐙 Download a project from GitHub
> ``` ts
> function rbxmSuite.download(repository: string, asset: string): string
> ```
>
> Downloads a rbxm(x) asset from a GitHub Release, and returns a path to the asset.
>
> The repository format is `user/repo@tag_name`.
```lua
local path = rbxmSuite.download("Roblox/roact@v1.4.0", "Roact.rbxm")
local model = rbxmSuite.launch(path)
local Roact = rbxmSuite.require(model)
Roact.createElement()
```
> Set `tag_name` to `latest` to download and cache the latest version. Version checking and updating is performed in the background where possible.
```lua
local path = rbxmSuite.download("Roblox/roact@latest", "Roact.rbxm")
```
## Notes
### 📌 In production, don't include unused modules.
When debug mode is `false`, modules that don't get required will still be bundled into one script.
If you have a lot of unused code, execution speed will be inconsistent between exploits. Be careful!
### 📌 GitHub is your friend.
Upload your project to GitHub, and create releases with an rbxm(x) file included as a binary file.
You can distribute your project publicly by using rbxm-suite to download and run the latest release.