@bext-stack/framework
v0.1.0
Published
PRISM — bext's zero-config JSX-to-string SSR engine. JSX compiles to h() string-builder calls (no React, no VDOM); components are (props) => string. Streaming, Suspense, async components, islands.
Maintainers
Readme
@bext-stack/framework
PRISM — bext's zero-config JSX-to-string SSR engine.
JSX compiles to h() string-builder calls (no React, no VDOM).
Components are (props) => string. Async components return
Promise<string> or AsyncIterable<string>. Suspense + streaming
work out of the box.
// tsconfig.json
// { "compilerOptions": { "jsx": "react-jsx", "jsxImportSource": "@bext-stack/framework" } }
// page.tsx — sync, returns a string
export default function Home() {
return <h1>Hello {props.name}</h1>;
}
// async page — returns Promise<string>
export default async function User({ id }: { id: string }) {
const u = await fetch(`/api/u/${id}`).then((r) => r.json());
return <p>{u.name}</p>;
}
// streaming page with Suspense
import { Suspense } from "@bext-stack/framework/streaming";
export default function Page() {
return (
<>
<h1>Static shell ships first</h1>
<Suspense fallback={<p>Loading…</p>}>
<SlowPart />
</Suspense>
</>
);
}Entry points
| Subpath | Purpose |
|---|---|
| @bext-stack/framework/jsx-runtime | JSX automatic runtime — { jsx, jsxs, Fragment } |
| @bext-stack/framework/streaming | Suspense, renderToStream, SUSPENSE_CLIENT_RUNTIME |
| @bext-stack/framework/island | island(name, props, fallback) for client-hydrated components |
| @bext-stack/framework/client | clientRuntime, clientRuntimeBody (SPA navigation, prefetch, view-transitions) |
| @bext-stack/framework/serve | Standalone Bun server (alternative to bext-server's PRISM dispatcher) |
| @bext-stack/framework/react | React SSR adapter (peer dep: react, react-dom) |
| @bext-stack/framework/solid | Solid SSR adapter (peer dep: solid-js) |
| @bext-stack/framework/preact | Preact SSR adapter (peer dep: preact, preact-render-to-string) |
| @bext-stack/framework/next/* | Next.js compat shims (next/link, next/image, next/navigation, …) |
Source-form distribution
This package ships TypeScript source files (src/**/*.ts). The intended
runtime is bext's PRISM dispatcher, which compiles .ts per request via
tsc-rs. Vite, esbuild, Bun, and Deno (with npm: specifiers) all read
the source directly. There is no dist/ build — the package has no
build step.
For consumers that need pre-compiled JS + .d.ts, run tsc against
src/ with your own settings.
Runtime contract
Every component returns a Renderable:
export type Renderable =
| string
| number
| boolean
| null
| undefined
| Promise<Renderable>
| AsyncIterable<Renderable>
| Renderable[];The h() factory (in jsx.ts) returns a string when the entire subtree
resolves synchronously, an AsyncIterable<string> as soon as anything
async appears in the tree. Hosts iterate the result directly into the
HTTP response body — no buffering for streaming use cases.
License
MIT
