go-html/cmd/codegen/main.go
Virgil 56bd6638db
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
feat(codegen): add TypeScript declarations
Generate .d.ts output for Web Component bundles and add a CLI -dts mode.\n\nCo-Authored-By: Virgil <virgil@lethean.io>
2026-04-03 16:42:41 +00:00

72 lines
1.6 KiB
Go

// Package main provides a build-time CLI for generating Web Component JS bundles.
// Reads a JSON slot map from stdin, writes the generated JS to stdout.
//
// Usage:
//
// echo '{"H":"nav-bar","C":"main-content"}' | go run ./cmd/codegen/ > components.js
// echo '{"H":"nav-bar","C":"main-content"}' | go run ./cmd/codegen/ -dts > components.d.ts
package main
import (
"encoding/json"
"flag"
goio "io"
"os"
"dappco.re/go/core/html/codegen"
log "dappco.re/go/core/log"
)
var emitTypeDefinitions = flag.Bool("dts", false, "emit TypeScript declarations instead of JavaScript")
func run(r goio.Reader, w goio.Writer) error {
return runWithMode(r, w, false)
}
func runTypeDefinitions(r goio.Reader, w goio.Writer) error {
return runWithMode(r, w, true)
}
func runWithMode(r goio.Reader, w goio.Writer, emitTypes bool) error {
data, err := goio.ReadAll(r)
if err != nil {
return log.E("codegen", "reading stdin", err)
}
var slots map[string]string
if err := json.Unmarshal(data, &slots); err != nil {
return log.E("codegen", "invalid JSON", err)
}
if emitTypes {
dts, err := codegen.GenerateTypeDefinitions(slots)
if err != nil {
return err
}
_, err = goio.WriteString(w, dts)
return err
}
js, err := codegen.GenerateBundle(slots)
if err != nil {
return err
}
_, err = goio.WriteString(w, js)
return err
}
func main() {
flag.Parse()
var err error
if *emitTypeDefinitions {
err = runTypeDefinitions(os.Stdin, os.Stdout)
} else {
err = run(os.Stdin, os.Stdout)
}
if err != nil {
log.Error("codegen failed", "err", err)
os.Exit(1)
}
}