Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 34s
The declarative picker markup is now a reusable SX component
(lib/host/sx/relate-picker.sx, defcomp ~relate-picker &key slug kind) instead of
inline markup in the editor. It is a CONTENT-ADDRESSED, CLIENT-EXPANDED component:
- Server: on a full page load render-page expands ~relate-picker server-side
(SEO / no-JS), exactly as before.
- Client: on a boosted SPA nav the edit body serialises to the compact
(~relate-picker :slug … :kind …), and the CLIENT expands it. The component
module is compiled to a content-addressed .sxbc, served immutably from
/sx/h/{hash}, and listed in the page's data-sx-manifest "boot" array so the
client eager-loads it after the web stack — registering its defcomp before any
boosted fragment references it.
Wiring:
- lib/host/sx/relate-picker.sx — the component.
- lib/host/blog.sx — editor emits (~relate-picker :slug s :kind k); the inline
form markup is gone.
- lib/host/static.sx — host/static-manifest-json emits boot:["relate-picker.sxbc"]
(the previously-empty boot array, now used as designed).
- hosts/ocaml/browser/sx-platform.js — loadWebStack eager-loads the page manifest's
boot[] modules (content-addressed) after the web stack.
- bundle.sh + compile-modules.js — copy/compile the component to .sxbc.
- serve.sh + conformance.sh — load the component module server-side.
This gives the host an app-component system: app defcomps shipped to the client by
hash, the same machinery as the kernel modules — the picker is the first, and it's
the model for publishing components externally.
Tests: conformance 272/272 (server expansion); relate-picker.spec.js 6/6 incl. the
boosted-nav populate (proves client-side component load + expansion) and the
error/retry case. WASM stack rebuilt (relate-picker.sxbc @ 6818110a).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
101 lines
3.2 KiB
Bash
Executable File
101 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# Bundle the WASM SX kernel + platform + .sx files for serving.
|
|
#
|
|
# Output goes to hosts/ocaml/browser/dist/
|
|
# Serve dist/ at /wasm/ or similar path.
|
|
|
|
set -e
|
|
cd "$(dirname "$0")"
|
|
|
|
BUILD=../_build/default/browser
|
|
DIST=dist
|
|
ROOT=../../..
|
|
|
|
echo "=== Bundling SX WASM browser engine ==="
|
|
|
|
rm -rf "$DIST"
|
|
mkdir -p "$DIST/sx"
|
|
|
|
# 1. WASM kernel
|
|
cp "$BUILD/sx_browser.bc.wasm.js" "$DIST/"
|
|
cp -r "$BUILD/sx_browser.bc.wasm.assets" "$DIST/"
|
|
|
|
# Also copy js_of_ocaml version as fallback
|
|
cp "$BUILD/sx_browser.bc.js" "$DIST/"
|
|
|
|
# 2. Platform JS
|
|
cp sx-platform.js "$DIST/"
|
|
|
|
# 3. Spec modules
|
|
cp "$ROOT/spec/signals.sx" "$DIST/sx/core-signals.sx"
|
|
cp "$ROOT/spec/render.sx" "$DIST/sx/"
|
|
cp "$ROOT/web/web-signals.sx" "$DIST/sx/signals.sx"
|
|
cp "$ROOT/web/deps.sx" "$DIST/sx/"
|
|
cp "$ROOT/web/router.sx" "$DIST/sx/"
|
|
cp "$ROOT/web/page-helpers.sx" "$DIST/sx/"
|
|
|
|
# 3b. Freeze scope (signal persistence) + highlight (syntax coloring)
|
|
cp "$ROOT/lib/freeze.sx" "$DIST/sx/"
|
|
cp "$ROOT/lib/highlight.sx" "$DIST/sx/"
|
|
|
|
# 4. Bytecode compiler + VM
|
|
cp "$ROOT/lib/bytecode.sx" "$DIST/sx/"
|
|
cp "$ROOT/lib/compiler.sx" "$DIST/sx/"
|
|
cp "$ROOT/lib/vm.sx" "$DIST/sx/"
|
|
|
|
# 5. Web libraries (8 FFI primitives)
|
|
cp "$ROOT/web/lib/dom.sx" "$DIST/sx/"
|
|
cp "$ROOT/web/lib/browser.sx" "$DIST/sx/"
|
|
|
|
# 6. Web adapters
|
|
cp "$ROOT/web/adapter-html.sx" "$DIST/sx/"
|
|
cp "$ROOT/web/adapter-sx.sx" "$DIST/sx/"
|
|
cp "$ROOT/web/adapter-dom.sx" "$DIST/sx/"
|
|
|
|
# 7. Boot helpers (platform functions in pure SX)
|
|
cp "$ROOT/web/lib/boot-helpers.sx" "$DIST/sx/"
|
|
cp "$ROOT/web/lib/hypersx.sx" "$DIST/sx/"
|
|
|
|
# 7b. Test harness (for inline test runners)
|
|
cp "$ROOT/spec/harness.sx" "$DIST/sx/"
|
|
cp "$ROOT/web/harness-reactive.sx" "$DIST/sx/"
|
|
cp "$ROOT/web/harness-web.sx" "$DIST/sx/"
|
|
|
|
# 8. Web framework
|
|
cp "$ROOT/web/engine.sx" "$DIST/sx/"
|
|
cp "$ROOT/web/orchestration.sx" "$DIST/sx/"
|
|
cp "$ROOT/web/boot.sx" "$DIST/sx/"
|
|
|
|
# 9. Styling (tw token engine)
|
|
cp "$ROOT/shared/sx/templates/tw-layout.sx" "$DIST/sx/"
|
|
cp "$ROOT/shared/sx/templates/tw-type.sx" "$DIST/sx/"
|
|
cp "$ROOT/shared/sx/templates/tw.sx" "$DIST/sx/"
|
|
|
|
# 9b. Host app components (content-addressed, client-expanded on boosted nav).
|
|
# Listed in the host's data-sx-manifest "boot" array so the client eager-loads
|
|
# them after the web stack — see lib/host/static.sx + sx-platform.js loadWebStack.
|
|
cp "$ROOT/lib/host/sx/relate-picker.sx" "$DIST/sx/"
|
|
|
|
# 10. Hyperscript
|
|
for f in tokenizer parser compiler runtime integration htmx; do
|
|
cp "$ROOT/lib/hyperscript/$f.sx" "$DIST/sx/hs-$f.sx"
|
|
done
|
|
for f in worker prolog; do
|
|
cp "$ROOT/lib/hyperscript/plugins/$f.sx" "$DIST/sx/hs-$f.sx"
|
|
done
|
|
|
|
# Summary
|
|
WASM_SIZE=$(du -sh "$DIST/sx_browser.bc.wasm.assets" | cut -f1)
|
|
JS_SIZE=$(du -sh "$DIST/sx_browser.bc.js" | cut -f1)
|
|
SX_SIZE=$(du -sh "$DIST/sx" | cut -f1)
|
|
echo " WASM kernel: $WASM_SIZE (assets)"
|
|
echo " JS fallback: $JS_SIZE"
|
|
echo " SX sources: $SX_SIZE ($(ls "$DIST/sx/" | wc -l) files)"
|
|
echo " Platform JS: $(du -sh "$DIST/sx-platform.js" | cut -f1)"
|
|
echo ""
|
|
echo " dist/ ready to serve"
|
|
echo ""
|
|
echo " HTML usage:"
|
|
echo ' <script src="/wasm/sx_browser.bc.wasm.js"></script>'
|
|
echo ' <script src="/wasm/sx-platform.js"></script>'
|