update wasmgen
This commit is contained in:
4
.vscode/launch.json
vendored
4
.vscode/launch.json
vendored
@@ -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
2
.vscode/tasks.json
vendored
@@ -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"
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
Binary file not shown.
@@ -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
|
||||||
|
|
||||||
Reference in New Issue
Block a user