mirror of
https://github.com/0x5eal/terracotta.git
synced 2024-12-12 12:50:35 +00:00
feat: provide user facing API
This commit is contained in:
parent
3ab2569e09
commit
8f45fc05f8
13 changed files with 196 additions and 23 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -3,4 +3,4 @@
|
||||||
.wax-tmp
|
.wax-tmp
|
||||||
|
|
||||||
# Compiled outputs
|
# Compiled outputs
|
||||||
terracotta.luau
|
dist/
|
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "clap"]
|
||||||
|
path = clap
|
||||||
|
url = https://github.com/0x5eal/clap.luau.git
|
|
@ -51,6 +51,10 @@ local BoxifyOutput = function(msg: string)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if not fs.isDir("dist/") then
|
||||||
|
fs.writeDir("dist/")
|
||||||
|
end
|
||||||
|
|
||||||
print(`{WAX_PREFIX_FORMAT("info", "[codegen]")} Generating darklua config file at darklua.config.json`)
|
print(`{WAX_PREFIX_FORMAT("info", "[codegen]")} Generating darklua config file at darklua.config.json`)
|
||||||
fs.writeFile(
|
fs.writeFile(
|
||||||
".darklua.json5",
|
".darklua.json5",
|
||||||
|
@ -85,10 +89,15 @@ local loader = task.spawn(function()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
task.spawn(function()
|
task.spawn(function()
|
||||||
local child = spawn(
|
local child = spawn("lune", {
|
||||||
"lune",
|
"wax",
|
||||||
{ "wax", "bundle", "input=default.project.json", "verbose=true", "minify=true", "output=terracotta.luau" }
|
"bundle",
|
||||||
)
|
"input=default.project.json",
|
||||||
|
"verbose=true",
|
||||||
|
"minify=true",
|
||||||
|
"ci-mode=true",
|
||||||
|
"output=dist/terracotta.luau",
|
||||||
|
})
|
||||||
|
|
||||||
task.cancel(loader)
|
task.cancel(loader)
|
||||||
print("\b \n")
|
print("\b \n")
|
||||||
|
|
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"luau-lsp.require.mode": "relativeToFile",
|
"luau-lsp.require.mode": "relativeToFile",
|
||||||
"luau-lsp.require.directoryAliases": {
|
"luau-lsp.require.directoryAliases": {
|
||||||
"@lune/": "~/.lune/.typedefs/0.7.7/"
|
"@lune/": "~/.lune/.typedefs/0.7.8/"
|
||||||
},
|
},
|
||||||
"editor.formatOnSave": true
|
"editor.formatOnSave": true
|
||||||
}
|
}
|
1
clap
Submodule
1
clap
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit be0dd886262ad7df5e06edc11daa38a19e98a1dd
|
10
cmd/init.luau
Normal file
10
cmd/init.luau
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
--> Placeholder file!
|
||||||
|
|
||||||
|
local clap = require("../clap/src/clap")
|
||||||
|
|
||||||
|
local Command = clap.Command
|
||||||
|
local Opt = clap.Opt
|
||||||
|
|
||||||
|
Command.new("terracotta", true)
|
||||||
|
:afterHelp("For more help, refer to the documentation.")
|
||||||
|
:author("Seal Gang (0x5eal), Erica Marigold (DevComp)")
|
|
@ -5,9 +5,12 @@ local FsUtils = require("../utils/fs")
|
||||||
local Codegen = require("codegen")
|
local Codegen = require("codegen")
|
||||||
|
|
||||||
local Bundler = {}
|
local Bundler = {}
|
||||||
type BundlerExtended =
|
export type BundlerExtended = typeof(Bundler.Prototype) & {
|
||||||
typeof(Bundler.Prototype)
|
darkluaPath: string?,
|
||||||
& { darkluaPath: string?, darklua: Darklua.Darklua?, config: { contents: string, path: string? } }
|
darklua: Darklua.Darklua?,
|
||||||
|
config: { contents: string, path: string? },
|
||||||
|
}
|
||||||
|
export type DarkluaRules = Codegen.Rules
|
||||||
|
|
||||||
Bundler.Prototype = {}
|
Bundler.Prototype = {}
|
||||||
Bundler.Interface = {}
|
Bundler.Interface = {}
|
||||||
|
@ -17,11 +20,11 @@ function Bundler.Prototype.Bundle(
|
||||||
self: BundlerExtended,
|
self: BundlerExtended,
|
||||||
sourceKind: "code" | "path",
|
sourceKind: "code" | "path",
|
||||||
sourceInner: string
|
sourceInner: string
|
||||||
): { error: string?, bundled: string? }
|
): { error: string?, processed: string? }
|
||||||
self.darklua = Darklua.new(self.darkluaPath)
|
self.darklua = Darklua.new(self.darkluaPath)
|
||||||
|
|
||||||
if self.darklua:IsOk() then
|
if self.darklua:IsOk() then
|
||||||
return self.darklua:Process("code", sourceInner, self.config.path or (function()
|
return self.darklua:Process(sourceKind, sourceInner, self.config.path or (function()
|
||||||
local _, path = FsUtils.MakeTemp()
|
local _, path = FsUtils.MakeTemp()
|
||||||
Fs.writeFile(
|
Fs.writeFile(
|
||||||
path,
|
path,
|
||||||
|
|
13
darklua/init.luau
Normal file
13
darklua/init.luau
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
local Bundler = require("bundler")
|
||||||
|
local Minifier = require("minifier")
|
||||||
|
|
||||||
|
export type Bundler = Bundler.BundlerExtended
|
||||||
|
export type Minifier = Minifier.MinfierExtended
|
||||||
|
|
||||||
|
local Darklua = {
|
||||||
|
bundler = Bundler,
|
||||||
|
minifier = Minifier,
|
||||||
|
__cmd = require("cmd"),
|
||||||
|
}
|
||||||
|
|
||||||
|
return Darklua
|
|
@ -1,7 +1,7 @@
|
||||||
local Darklua = require("cmd")
|
local Darklua = require("cmd")
|
||||||
|
|
||||||
local Minifier = {}
|
local Minifier = {}
|
||||||
type MinfierExtended = typeof(Minifier.Prototype) & { darkluaPath: string?, darklua: Darklua.Darklua? }
|
export type MinfierExtended = typeof(Minifier.Prototype) & { darkluaPath: string?, darklua: Darklua.Darklua? }
|
||||||
|
|
||||||
Minifier.Prototype = {}
|
Minifier.Prototype = {}
|
||||||
Minifier.Interface = {}
|
Minifier.Interface = {}
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "terracotta",
|
"name": "terracotta",
|
||||||
"tree": {
|
"tree": {
|
||||||
"$className": "Folder",
|
"$className": "Folder",
|
||||||
"terracotta": {
|
"terracotta": {
|
||||||
"$path": "src/"
|
"$path": "src/"
|
||||||
},
|
},
|
||||||
"darklua": {
|
"darklua": {
|
||||||
"$path": "darklua/"
|
"$path": "darklua/"
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1 +1,46 @@
|
||||||
{"name":"terracotta","className":"Folder","filePaths":["default.project.json"],"children":[{"name":"darklua","className":"Folder","children":[{"name":"bundler","className":"ModuleScript","filePaths":["darklua/bundler.luau"]},{"name":"cmd","className":"ModuleScript","filePaths":["darklua/cmd.luau"]},{"name":"codegen","className":"ModuleScript","filePaths":["darklua/codegen.luau"]},{"name":"minifier","className":"ModuleScript","filePaths":["darklua/minifier.luau"]}]},{"name":"terracotta","className":"Folder"}]}
|
{
|
||||||
|
"name": "terracotta",
|
||||||
|
"className": "Folder",
|
||||||
|
"filePaths": ["default.project.json"],
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"name": "darklua",
|
||||||
|
"className": "ModuleScript",
|
||||||
|
"filePaths": ["darklua/init.luau"],
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"name": "bundler",
|
||||||
|
"className": "ModuleScript",
|
||||||
|
"filePaths": ["darklua/bundler.luau"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "cmd",
|
||||||
|
"className": "ModuleScript",
|
||||||
|
"filePaths": ["darklua/cmd.luau"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "codegen",
|
||||||
|
"className": "ModuleScript",
|
||||||
|
"filePaths": ["darklua/codegen.luau"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "minifier",
|
||||||
|
"className": "ModuleScript",
|
||||||
|
"filePaths": ["darklua/minifier.luau"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "terracotta",
|
||||||
|
"className": "ModuleScript",
|
||||||
|
"filePaths": ["src/init.luau"],
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"name": "terracotta",
|
||||||
|
"className": "ModuleScript",
|
||||||
|
"filePaths": ["src/terracotta.luau"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
19
src/init.luau
Normal file
19
src/init.luau
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
local Fs = require("@lune/fs")
|
||||||
|
|
||||||
|
local Terracotta = require("terracotta")
|
||||||
|
|
||||||
|
Terracotta.Build({
|
||||||
|
entryPoints = { "utils/fs.luau", "darklua/cmd.luau" },
|
||||||
|
bundle = true,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- OR --
|
||||||
|
|
||||||
|
local terracotta = Terracotta.new()
|
||||||
|
|
||||||
|
local outputs = terracotta:Build({
|
||||||
|
entryPoints = { "utils/fs.luau", "darklua/cmd.luau" },
|
||||||
|
bundle = true,
|
||||||
|
})
|
||||||
|
|
||||||
|
Fs.writeFile("darklua.luau", outputs["darklua/cmd.luau"])
|
70
src/terracotta.luau
Normal file
70
src/terracotta.luau
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
local Darklua = require("../darklua")
|
||||||
|
local Codegen = require("../darklua/codegen")
|
||||||
|
|
||||||
|
local Terracotta = {}
|
||||||
|
Terracotta.Interface = {}
|
||||||
|
Terracotta.Prototype = {}
|
||||||
|
|
||||||
|
type DarkluaRules = Codegen.Rules
|
||||||
|
|
||||||
|
export type Terracotta = typeof(Terracotta) & {
|
||||||
|
bundler: Darklua.Bundler,
|
||||||
|
minifier: Darklua.Minifier,
|
||||||
|
}
|
||||||
|
|
||||||
|
function Terracotta.Prototype.Build(
|
||||||
|
self: Terracotta?,
|
||||||
|
opts: {
|
||||||
|
entryPoints: { string },
|
||||||
|
bundle: boolean?,
|
||||||
|
outFile: string?,
|
||||||
|
rules: { DarkluaRules }?,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
local bundler: Darklua.Bundler
|
||||||
|
|
||||||
|
if self ~= nil and self.bundler ~= nil then
|
||||||
|
bundler = self.bundler
|
||||||
|
else
|
||||||
|
bundler = Darklua.bundler.new(nil, {
|
||||||
|
generator = "dense",
|
||||||
|
sources = opts.entryPoints,
|
||||||
|
outFile = opts.outFile,
|
||||||
|
requireMode = (opts.bundle and "path") or nil,
|
||||||
|
rules = opts.rules or {
|
||||||
|
"remove_comments",
|
||||||
|
"rename_variables",
|
||||||
|
"remove_spaces",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
local builtOuts = {}
|
||||||
|
|
||||||
|
for _, path in opts.entryPoints do
|
||||||
|
local out = bundler:Bundle("path", path)
|
||||||
|
|
||||||
|
if out.error ~= nil then
|
||||||
|
error(out.error)
|
||||||
|
end
|
||||||
|
|
||||||
|
builtOuts[path] = out.processed
|
||||||
|
end
|
||||||
|
|
||||||
|
return builtOuts
|
||||||
|
end
|
||||||
|
|
||||||
|
function Terracotta.Interface.new()
|
||||||
|
return setmetatable({
|
||||||
|
minifier = nil,
|
||||||
|
bundler = nil,
|
||||||
|
}, {
|
||||||
|
__index = Terracotta.Prototype,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
function Terracotta.Interface.Build(opts: { bundle: boolean?, entryPoints: { string }, outFile: string? })
|
||||||
|
return Terracotta.Prototype.Build(nil, opts)
|
||||||
|
end
|
||||||
|
|
||||||
|
return Terracotta.Interface
|
Loading…
Reference in a new issue