Skip to content

CL++ support for Cluaupp

Cluaupp connects the language to Roblox (Rojo, engine API, project init). CL++ is language-only. This contract lets Cluaupp swap the compile backend without rewriting the transpiler.

Current compiler: 0.7.0. Full CLI upgrade guide: Cluaupp 0.7.0 and Update Cluaupp (pin 0.7.0).

Terminal window
clpp api compile --file src/server/Leaderstats.server.clpp
echo '{"source":"void init() { post(\"ok\"); }","fileName":"init.server.clpp"}' | clpp api compile
clpp api manifest
clpp compile file.clpp --json
clpp build src -o out --json

Compile output (JSON):

{
"ok": true,
"luau": "-- Compiled by CL++ …",
"fileName": "init.server.clpp",
"outputHint": "init.server.luau",
"scriptKind": "server",
"isScript": true,
"isHeader": false,
"rojoClass": "Script",
"libraries": []
}

TypeScript types live in the repository at support/cluaupp.d.ts (GitHub).

const { spawnSync } = require("child_process");
function compileSource(source, fileName, options = {}) {
const r = spawnSync("clpp", ["api", "compile"], {
input: JSON.stringify({ source, fileName, strict: options.strict ?? null }),
encoding: "utf8",
});
const artifact = JSON.parse(r.stdout);
if (!artifact.ok) {
throw new Error(artifact.error || "clpp compile failed");
}
return artifact; // { luau, rojoClass, scriptKind, … }
}
use clpp::{compile_request, CompileRequest};
let art = compile_request(&CompileRequest {
source: src.into(),
file_name: "boot.server.clpp".into(),
strict: Some(true),
})?;
let luau = art.luau;

rojoClass is ready for Rojo (Script / LocalScript / ModuleScript).

Anonymous callbacks in .clpp / .clp must be func (params) { }. func [](…) and []() { } are a compile error. Full handoff: Cluaupp — anonymous callbacks.