update wasmgen

This commit is contained in:
2026-07-13 00:53:44 -04:00
parent 3c494605ba
commit 261a7f2b4d
12 changed files with 22 additions and 22 deletions

4
.vscode/launch.json vendored
View File

@@ -23,11 +23,11 @@
"args": ["-watch=false"] "args": ["-watch=false"]
}, },
{ {
"name": "gowasm: codegen (gowasmgen)", "name": "gowasm: codegen (wasmgen)",
"type": "go", "type": "go",
"request": "launch", "request": "launch",
"mode": "auto", "mode": "auto",
"program": "${workspaceFolder}/go/cmd/gowasmgen", "program": "${workspaceFolder}/go/cmd/wasmgen",
"cwd": "${workspaceFolder}/go/cmd/examples/go-wasm-web", "cwd": "${workspaceFolder}/go/cmd/examples/go-wasm-web",
"args": ["./app"] "args": ["./app"]
} }

2
.vscode/tasks.json vendored
View File

@@ -39,7 +39,7 @@
"label": "gowasm: codegen", "label": "gowasm: codegen",
"detail": "Regenerate app/*.gen.go from //gowasm: directives", "detail": "Regenerate app/*.gen.go from //gowasm: directives",
"type": "shell", "type": "shell",
"command": "go run kjol/cmd/gowasmgen ./app", "command": "go run kjol/cmd/wasmgen ./app",
"options": { "cwd": "${workspaceFolder}/go/cmd/examples/go-wasm-web" }, "options": { "cwd": "${workspaceFolder}/go/cmd/examples/go-wasm-web" },
"problemMatcher": ["$go"], "problemMatcher": ["$go"],
"group": "build" "group": "build"

View File

@@ -36,7 +36,7 @@ Language-first, **not** feature-first. Consequence: the **bundler is Go** and li
Packages, imported as `kjol/<name>`: `appenv basic chrono config csv dbutil finance httputil Packages, imported as `kjol/<name>`: `appenv basic chrono config csv dbutil finance httputil
l4g security snailmail validation bundler`, plus the **gowasm** web-UI engine (`vdom` l4g security snailmail validation bundler`, plus the **gowasm** web-UI engine (`vdom`
`wasmruntime` `rsc` `wasmdevserver` — author components in pure Go compiled to WebAssembly; `wasmruntime` `rsc` `wasmdevserver` — author components in pure Go compiled to WebAssembly;
all stdlib-only), and `cmd/{bundle,migrate,loc,passgen,typecheck,gowasmgen}`. A runnable all stdlib-only), and `cmd/{bundle,migrate,loc,passgen,typecheck,wasmgen}`. A runnable
example lives in `cmd/examples/go-wasm-web` (its own nested module so its go-chart dep stays example lives in `cmd/examples/go-wasm-web` (its own nested module so its go-chart dep stays
out of kjol). out of kjol).

View File

@@ -36,7 +36,7 @@ app/ the application — neutral, standalone functions (no centra
pages.go Deps + Shell + App/Public layouts + nav + Counter + pages pages.go Deps + Shell + App/Public layouts + nav + Counter + pages
chart.go Chart page (go-chart, renders on both sides) chart.go Chart page (go-chart, renders on both sides)
server_counter.go //gowasm:server component (server-only; clicks-over-time chart) server_counter.go //gowasm:server component (server-only; clicks-over-time chart)
*.gen.go GENERATED by kjol/cmd/gowasmgen (routes, layout dispatch, stubs) *.gen.go GENERATED by kjol/cmd/wasmgen (routes, layout dispatch, stubs)
wasm/ the js/wasm client entry point (main_native.go is a host stub) wasm/ the js/wasm client entry point (main_native.go is a host stub)
server/ the dev-server main: injects Build/Render/Document into wasmdevserver server/ the dev-server main: injects Build/Render/Document into wasmdevserver
wwwroot/ bootstrap.js, bootstrap.min.css (+ generated wasm_exec.js, app.wasm) wwwroot/ bootstrap.js, bootstrap.min.css (+ generated wasm_exec.js, app.wasm)
@@ -50,14 +50,14 @@ wwwroot/ bootstrap.js, bootstrap.min.css (+ generated wasm_exec.js, a
| `kjol/wasmruntime` | wasm client runtime: reconcile, `Run`/`Hydrate`, router, fetch, HMR state | `wasm/main.go` calls `Hydrate`/`Run` | | `kjol/wasmruntime` | wasm client runtime: reconcile, `Run`/`Hydrate`, router, fetch, HMR state | `wasm/main.go` calls `Hydrate`/`Run` |
| `kjol/rsc` | stateless server components over HTTP (gob) | `//gowasm:server` + the generated client stub | | `kjol/rsc` | stateless server components over HTTP (gob) | `//gowasm:server` + the generated client stub |
| `kjol/wasmdevserver` | reusable dev server: SSR, `/rsc`, hot reload, error overlay | `server/main.go` fills a `wasmdevserver.Config` | | `kjol/wasmdevserver` | reusable dev server: SSR, `/rsc`, hot reload, error overlay | `server/main.go` fills a `wasmdevserver.Config` |
| `kjol/cmd/gowasmgen` | directive codegen → `app/*.gen.go` | run by `buildWasm` and `//go:generate` | | `kjol/cmd/wasmgen` | directive codegen → `app/*.gen.go` | run by `buildWasm` and `//go:generate` |
The **golden rule** holds: `wasmdevserver` imports no app code. The app injects The **golden rule** holds: `wasmdevserver` imports no app code. The app injects
`Build` (how to compile the wasm), `Render` (SSR a route → HTML), and `Document` `Build` (how to compile the wasm), `Render` (SSR a route → HTML), and `Document`
(wrap it in a page) via `wasmdevserver.Config` — the same coupling inversion kjol (wrap it in a page) via `wasmdevserver.Config` — the same coupling inversion kjol
uses elsewhere. uses elsewhere.
## Directives (expanded by `gowasmgen` at build time) ## Directives (expanded by `wasmgen` at build time)
```go ```go
//gowasm:page / static layout=public // a route; `static` SSRs it, `layout=` wraps it //gowasm:page / static layout=public // a route; `static` SSRs it, `layout=` wraps it

View File

@@ -1,4 +1,4 @@
// Code generated by gowasmgen. DO NOT EDIT. // Code generated by wasmgen. DO NOT EDIT.
//go:build js && wasm //go:build js && wasm

View File

@@ -2,7 +2,7 @@
// functions (no central App struct). It is platform-neutral, so the SAME code // functions (no central App struct). It is platform-neutral, so the SAME code
// renders on the server (SSR) and hydrates on the client. // renders on the server (SSR) and hydrates on the client.
// //
// Directives (processed by cmd/gowasmgen at build time): // Directives (processed by cmd/wasmgen at build time):
// //
// //gowasm:page <path> [static] [layout=<name>] // //gowasm:page <path> [static] [layout=<name>]
// marks a page factory as a route. `static` // marks a page factory as a route. `static`
@@ -19,7 +19,7 @@
// generated from these directives. // generated from these directives.
package app package app
//go:generate go run kjol/cmd/gowasmgen . //go:generate go run kjol/cmd/wasmgen .
import ( import (
"strconv" "strconv"

View File

@@ -1,4 +1,4 @@
// Code generated by gowasmgen. DO NOT EDIT. // Code generated by wasmgen. DO NOT EDIT.
package app package app
import "kjol/vdom" import "kjol/vdom"

View File

@@ -1,4 +1,4 @@
// Code generated by gowasmgen. DO NOT EDIT. // Code generated by wasmgen. DO NOT EDIT.
//go:build !(js && wasm) //go:build !(js && wasm)

View File

@@ -7,7 +7,7 @@ set -euo pipefail
cd "$(dirname "$0")" cd "$(dirname "$0")"
echo "==> Generating directive glue (//gowasm:page, //gowasm:layout, //gowasm:server)" echo "==> Generating directive glue (//gowasm:page, //gowasm:layout, //gowasm:server)"
go run kjol/cmd/gowasmgen ./app go run kjol/cmd/wasmgen ./app
echo "==> Compiling ./wasm to wwwroot/app.wasm (GOOS=js GOARCH=wasm)" echo "==> Compiling ./wasm to wwwroot/app.wasm (GOOS=js GOARCH=wasm)"
GOOS=js GOARCH=wasm go build -o wwwroot/app.wasm ./wasm GOOS=js GOARCH=wasm go build -o wwwroot/app.wasm ./wasm

View File

@@ -69,11 +69,11 @@ func document(inner string) string {
</html>` </html>`
} }
// buildWasm runs the directive codegen (kjol/cmd/gowasmgen), then compiles // buildWasm runs the directive codegen (kjol/cmd/wasmgen), then compiles
// ./wasm to wwwroot/app.wasm. Returned combined output is shown in the browser // ./wasm to wwwroot/app.wasm. Returned combined output is shown in the browser
// overlay on failure. // overlay on failure.
func buildWasm() ([]byte, error) { func buildWasm() ([]byte, error) {
if out, err := exec.Command("go", "run", "kjol/cmd/gowasmgen", "./app").CombinedOutput(); err != nil { if out, err := exec.Command("go", "run", "kjol/cmd/wasmgen", "./app").CombinedOutput(); err != nil {
return out, err return out, err
} }
cmd := exec.Command("go", "build", "-o", filepath.Join("wwwroot", "app.wasm"), "./wasm") cmd := exec.Command("go", "build", "-o", filepath.Join("wwwroot", "app.wasm"), "./wasm")

View File

@@ -1,4 +1,4 @@
// Command gowasmgen preprocesses component directives into glue code so that // Command wasmgen preprocesses component directives into glue code so that
// server-component calls look identical to client-component calls, and routes // server-component calls look identical to client-component calls, and routes
// can opt into SSR with a tag. // can opt into SSR with a tag.
// //
@@ -61,7 +61,7 @@ func main() {
return !strings.HasSuffix(fi.Name(), ".gen.go") return !strings.HasSuffix(fi.Name(), ".gen.go")
}, parser.ParseComments) }, parser.ParseComments)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, "gowasmgen: parse:", err) fmt.Fprintln(os.Stderr, "wasmgen: parse:", err)
os.Exit(1) os.Exit(1)
} }
@@ -129,7 +129,7 @@ func main() {
write(filepath.Join(dir, "server.gen.go"), serverTmpl, data) write(filepath.Join(dir, "server.gen.go"), serverTmpl, data)
write(filepath.Join(dir, "client.gen.go"), clientTmpl, data) write(filepath.Join(dir, "client.gen.go"), clientTmpl, data)
fmt.Printf("gowasmgen: %d page(s), %d server component(s)\n", len(data.Pages), len(data.Servers)) fmt.Printf("wasmgen: %d page(s), %d server component(s)\n", len(data.Pages), len(data.Servers))
} }
func write(path, tmpl string, data genData) { func write(path, tmpl string, data genData) {
@@ -139,7 +139,7 @@ func write(path, tmpl string, data genData) {
} }
src, err := format.Source([]byte(b.String())) src, err := format.Source([]byte(b.String()))
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "gowasmgen: format %s: %v\n---\n%s\n", path, err, b.String()) fmt.Fprintf(os.Stderr, "wasmgen: format %s: %v\n---\n%s\n", path, err, b.String())
os.Exit(1) os.Exit(1)
} }
// Only write when changed, so re-running codegen doesn't churn mtimes (which // Only write when changed, so re-running codegen doesn't churn mtimes (which
@@ -152,7 +152,7 @@ func write(path, tmpl string, data genData) {
} }
} }
const routesTmpl = `// Code generated by gowasmgen. DO NOT EDIT. const routesTmpl = `// Code generated by wasmgen. DO NOT EDIT.
package app package app
import "kjol/vdom" import "kjol/vdom"
@@ -185,7 +185,7 @@ func LayoutFor(d Deps, path string, content *vdom.VNode) *vdom.VNode {
{{end}}} {{end}}}
` `
const serverTmpl = `// Code generated by gowasmgen. DO NOT EDIT. const serverTmpl = `// Code generated by wasmgen. DO NOT EDIT.
//go:build !(js && wasm) //go:build !(js && wasm)
@@ -198,7 +198,7 @@ func init() {
{{end}}} {{end}}}
` `
const clientTmpl = `// Code generated by gowasmgen. DO NOT EDIT. const clientTmpl = `// Code generated by wasmgen. DO NOT EDIT.
//go:build js && wasm //go:build js && wasm