import { existsSync, readFileSync, writeFileSync } from "node:fs";
import { join } from "node:path";
const root = join(import.meta.dirname, "..", "packages", "ui");
const componentsDir = join(root, "components");
const catalog = JSON.parse(readFileSync(join(root, "component-catalog.json"), "utf8"));
function add(name, source) {
const file = join(componentsDir, `${name}.wrn`);
const generated = existsSync(file) && readFileSync(file, "utf8").includes("props { ");
if (!existsSync(file) || generated) writeFileSync(file, `${source.trim()}\n`, "utf8");
}
function action(name) {
return `component ${name} {
props {
label = "Action"
href = ""
type = "button"
variant = "primary"
disabled = false
class = ""
}
view { {label} }
}`;
}
function form(name) {
if (name.endsWith("Form")) {
return `component ${name} {
props {
title = ""
description = ""
action = ""
method = "post"
submitLabel = "Submit"
loading = false
disabled = false
class = ""
}
view {
}
}`;
}
return `component ${name} {
props {
label = "${name.replace(/(Input|Field|Selector|Picker|Toggle|Group|Editor)$/, "")}"
name = ""
value = ""
placeholder = ""
type = "text"
required = false
disabled = false
readonly = false
help = ""
error = ""
class = ""
}
view { }
}`;
}
function overlay(name) {
return `component ${name} {
props {
title = ""
description = ""
open = false
closeLabel = "Close"
class = ""
}
view { }
}`;
}
function collection(name) {
return `component ${name} {
props {
title = ""
description = ""
empty = false
emptyText = "No items available."
class = ""
}
view { }
}`;
}
function visualization(name) {
return `component ${name} {
props {
title = ""
value = ""
description = ""
summary = ""
loading = false
class = ""
}
view { {title}{value}{description}
{summary}
}
}`;
}
function feedback(name) {
return `component ${name} {
props {
label = "${name.replace(/(Badge|Indicator|Counter|State|Alert|Banner|Notice|Skeleton)$/, "")}"
title = ""
description = ""
value = ""
variant = "default"
class = ""
}
view { }
}`;
}
function layout(name) {
return `component ${name} {
props {
eyebrow = ""
title = ""
description = ""
align = "start"
class = ""
}
view { {eyebrow}{title}
{description}
}
}`;
}
function content(name) {
return `component ${name} {
props {
eyebrow = ""
title = ""
description = ""
href = ""
actionLabel = "Learn more"
image = ""
alt = ""
class = ""
}
view {
{eyebrow}{title}
{description}
{actionLabel} }
}`;
}
const factories = {
actions: action,
forms: form,
overlays: overlay,
data: collection,
visualization,
feedback,
layout,
content,
};
for (const entry of catalog.components) {
add(entry.name, factories[entry.category](entry.name));
}