{"_id":"@alwatr/loom","_rev":"5-6b90885b4d2fabffa019177a02e6ff51","name":"@alwatr/loom","dist-tags":{"latest":"10.2.0"},"versions":{"10.0.0":{"name":"@alwatr/loom","version":"10.0.0","keywords":["alwatr","bun","jsx","ssg","static-site-generator","tsx"],"author":{"name":"S. Ali Mihandoost","email":"ali.mihandoost@gmail.com"},"license":"MPL-2.0","_id":"@alwatr/loom@10.0.0","maintainers":[{"name":"alimd","email":"ali.mihan.doost@gmail.com"}],"homepage":"https://github.com/Alwatr/alwatr/tree/next/pkg/loom#readme","bugs":{"url":"https://github.com/Alwatr/alwatr/issues"},"dist":{"shasum":"4079ea75d004d982659d1d6de64dece4e6c33d6f","tarball":"https://registry.npmjs.org/@alwatr/loom/-/loom-10.0.0.tgz","fileCount":45,"integrity":"sha512-BdO0VrlOekOyCAzArYdhDB068sSq55niNAkAFvOVDD4Q6agtdXOKDz0S0l7rrDj1bRuokkVytjA6UiK3XV/8cQ==","signatures":[{"sig":"MEUCIQCJLqMwrLtRavABgpvJuk5StAm1xECNxgBTyBbTndbDtAIgWVh013a288ZtDxMhlZ6rNshjT3XByF/ZwqSw54Fphbw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89095},"type":"module","exports":{".":{"types":"./dist/main.d.ts","import":"./dist/main.js","default":"./dist/main.js","development":"./dist/dev/main.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","default":"./dist/jsx-runtime.js","development":"./dist/dev/jsx-runtime.js"},"./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","import":"./dist/jsx-dev-runtime.js","default":"./dist/jsx-dev-runtime.js","development":"./dist/dev/jsx-dev-runtime.js"}},"gitHead":"ad367007af237263a64306c359d05fea63fb2dc7","scripts":{"b":"bun run build","t":"bun run test","w":"bun run watch","cl":"bun run clean","lint":"eslint src/ --ext .ts","test":"bun test","build":"bun run build:ts && bun run build:es","clean":"rm -rfv dist *.tsbuildinfo","watch":"bun run watch:ts & bun run watch:es","format":"prettier --write \"src/**/*.ts\"","build:es":"bun run build:es:dev && bun run build:es:prod","build:ts":"tsc --build","watch:es":"bun run build:es:dev --watch","watch:ts":"bun run build:ts --watch --preserveWatchOutput","build:es:dev":"nano-build --preset=bun-service --packages=external --outdir=dist/dev src/*.ts","build:es:prod":"NODE_ENV=production nano-build --preset=bun-service --packages=external --outdir=dist src/*.ts"},"_npmUser":{"name":"alimd","email":"ali.mihan.doost@gmail.com"},"repository":{"url":"git+https://github.com/Alwatr/alwatr.git","type":"git","directory":"pkg/loom"},"_npmVersion":"lerna/5.4.2/node@v22.23.1+x64 (linux)","description":"A tiny, zero-dependency static site generator core that renders TSX templates to HTML strings — no React, no virtual DOM.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.14","typescript":"^7.0.2","@alwatr/standard":"10.0.0","@alwatr/nano-build":"10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/loom_10.0.0_1785075706133_0.7972533437795646","host":"s3://npm-registry-packages-npm-production"}},"10.0.1":{"name":"@alwatr/loom","version":"10.0.1","keywords":["alwatr","bun","jsx","ssg","static-site-generator","tsx"],"author":{"name":"S. Ali Mihandoost","email":"ali.mihandoost@gmail.com"},"license":"MPL-2.0","_id":"@alwatr/loom@10.0.1","maintainers":[{"name":"alimd","email":"ali.mihan.doost@gmail.com"}],"homepage":"https://github.com/Alwatr/alwatr/tree/next/pkg/loom#readme","bugs":{"url":"https://github.com/Alwatr/alwatr/issues"},"dist":{"shasum":"8a0ff7917d9706e4c41c02abf428413aa11f4303","tarball":"https://registry.npmjs.org/@alwatr/loom/-/loom-10.0.1.tgz","fileCount":52,"integrity":"sha512-8iaYaMgHy3F0CBPsj5tEaybSDX5YtTeQUMkysE0KjU/6tcQrSX73zHxPHMMKBqlwr6Aq/xG8ySlMh2cB7kTVRA==","signatures":[{"sig":"MEQCIGohmpRmxVX9zOTIcW9/2SuvYasbBHT3DvmvV95GOSDNAiBFRhX92jSWuK/q80f9PJ8FbU8XQkGfPSZbf+xO+xz2TQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161682},"type":"module","exports":{".":{"types":"./dist/main.d.ts","import":"./dist/main.js","default":"./dist/main.js","development":"./dist/dev/main.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","default":"./dist/jsx-runtime.js","development":"./dist/dev/jsx-runtime.js"},"./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","import":"./dist/jsx-dev-runtime.js","default":"./dist/jsx-dev-runtime.js","development":"./dist/dev/jsx-dev-runtime.js"}},"gitHead":"f5c58d9c370be18b310796f77a8f80d5d99dcfd5","scripts":{"b":"bun run build","t":"bun run test","w":"bun run watch","cl":"bun run clean","lint":"eslint src/ --ext .ts","test":"bun test","build":"bun run build:ts && bun run build:es","clean":"rm -rfv dist *.tsbuildinfo","watch":"bun run watch:ts & bun run watch:es","format":"prettier --write \"src/**/*.ts\"","build:es":"bun run build:es:dev && bun run build:es:prod","build:ts":"tsc --build","watch:es":"bun run build:es:dev --watch","watch:ts":"bun run build:ts --watch --preserveWatchOutput","build:es:dev":"nano-build --preset=module --outdir=dist/dev src/*.ts","build:es:prod":"NODE_ENV=production nano-build --preset=module --outdir=dist src/*.ts"},"_npmUser":{"name":"alimd","email":"ali.mihan.doost@gmail.com"},"repository":{"url":"git+https://github.com/Alwatr/alwatr.git","type":"git","directory":"pkg/loom"},"_npmVersion":"lerna/5.4.2/node@v22.23.1+x64 (linux)","description":"A tiny, zero-dependency static site generator core that renders TSX templates to HTML strings — no React, no virtual DOM.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.14","typescript":"^7.0.2","@alwatr/standard":"10.0.0","@alwatr/nano-build":"10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/loom_10.0.1_1785085503821_0.8080025625391529","host":"s3://npm-registry-packages-npm-production"}},"10.0.2":{"name":"@alwatr/loom","version":"10.0.2","keywords":["alwatr","bun","jsx","ssg","static-site-generator","tsx"],"author":{"name":"S. Ali Mihandoost","email":"ali.mihandoost@gmail.com"},"license":"MPL-2.0","_id":"@alwatr/loom@10.0.2","maintainers":[{"name":"alimd","email":"ali.mihan.doost@gmail.com"}],"homepage":"https://github.com/Alwatr/alwatr/tree/next/pkg/loom#readme","bugs":{"url":"https://github.com/Alwatr/alwatr/issues"},"dist":{"shasum":"b2930ebce6089c12c801c8929f174a2678134c9f","tarball":"https://registry.npmjs.org/@alwatr/loom/-/loom-10.0.2.tgz","fileCount":52,"integrity":"sha512-If1p7qO2LgmKzZ1TPHpgSoy+qVsEGMG8NdGT96Ed2VLLMMbZtW/aTZ472SB1WddHkddXz/GRzhdB2E+D0souZA==","signatures":[{"sig":"MEUCIQCvGzfDbLCtwleLUsw3wVM/MeOfheoBNjfg3a+cUteBzgIgERJXVcoWd9hzfM/FT6ryeDShi4eTFKAU6Qv5Xm170z8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":162742},"type":"module","exports":{".":{"types":"./dist/main.d.ts","import":"./dist/main.js","default":"./dist/main.js","development":"./dist/dev/main.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","default":"./dist/jsx-runtime.js","development":"./dist/dev/jsx-runtime.js"},"./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","import":"./dist/jsx-dev-runtime.js","default":"./dist/jsx-dev-runtime.js","development":"./dist/dev/jsx-dev-runtime.js"}},"gitHead":"70ed3eeabf6100731dbe4c90eab15b0c8ded1cf2","scripts":{"b":"bun run build","t":"bun run test","w":"bun run watch","cl":"bun run clean","lint":"eslint src/ --ext .ts","test":"bun test","build":"bun run build:ts && bun run build:es","clean":"rm -rfv dist *.tsbuildinfo","watch":"bun run watch:ts & bun run watch:es","format":"prettier --write \"src/**/*.ts\"","build:es":"bun run build:es:dev && bun run build:es:prod","build:ts":"tsc --build","watch:es":"bun run build:es:dev --watch","watch:ts":"bun run build:ts --watch --preserveWatchOutput","build:es:dev":"nano-build --preset=module --outdir=dist/dev src/*.ts","build:es:prod":"NODE_ENV=production nano-build --preset=module --outdir=dist src/*.ts"},"_npmUser":{"name":"alimd","email":"ali.mihan.doost@gmail.com"},"repository":{"url":"git+https://github.com/Alwatr/alwatr.git","type":"git","directory":"pkg/loom"},"_npmVersion":"lerna/5.4.2/node@v22.23.1+x64 (linux)","description":"A tiny, zero-dependency static site generator core that renders TSX templates to HTML strings — no React, no virtual DOM.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.14","typescript":"^7.0.2","@alwatr/standard":"10.0.0","@alwatr/nano-build":"10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/loom_10.0.2_1785240826498_0.5427128022989602","host":"s3://npm-registry-packages-npm-production"}},"10.1.0":{"name":"@alwatr/loom","version":"10.1.0","keywords":["alwatr","bun","jsx","ssg","static-site-generator","tsx"],"author":{"name":"S. Ali Mihandoost","email":"ali.mihandoost@gmail.com"},"license":"MPL-2.0","_id":"@alwatr/loom@10.1.0","maintainers":[{"name":"alimd","email":"ali.mihan.doost@gmail.com"}],"homepage":"https://github.com/Alwatr/alwatr/tree/next/pkg/loom#readme","bugs":{"url":"https://github.com/Alwatr/alwatr/issues"},"dist":{"shasum":"2f466b5a2aeba9d5ca8aff06690fd1df470af0f4","tarball":"https://registry.npmjs.org/@alwatr/loom/-/loom-10.1.0.tgz","fileCount":52,"integrity":"sha512-xbXlu8jAFdtWO6DunTVVa1iu/916uenhGBdlOC+kxNNwc26bGg/MtmZsnLy++8rdmY4gits3yGOhqenOP6exXg==","signatures":[{"sig":"MEUCIQCBvSrMy6Zo7rlMaPEKBBK0Uc9JAxLTmkhClWmaJNMOWwIgdTCLvAh9gtD0eytOv+b5nRlUe0g3u/huQnlBbVhC4Og=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":162741},"type":"module","exports":{".":{"types":"./dist/main.d.ts","import":"./dist/main.js","default":"./dist/main.js","development":"./dist/dev/main.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","default":"./dist/jsx-runtime.js","development":"./dist/dev/jsx-runtime.js"},"./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","import":"./dist/jsx-dev-runtime.js","default":"./dist/jsx-dev-runtime.js","development":"./dist/dev/jsx-dev-runtime.js"}},"gitHead":"b9efc218052a99652c3cb0bc990496f26b5b18cf","scripts":{"b":"bun run build","t":"bun run test","w":"bun run watch","cl":"bun run clean","lint":"eslint src/ --ext .ts","test":"bun test","build":"bun run build:ts && bun run build:es","clean":"rm -rfv dist *.tsbuildinfo","watch":"bun run watch:ts & bun run watch:es","format":"prettier --write \"src/**/*.ts\"","build:es":"bun run build:es:dev && bun run build:es:prod","build:ts":"tsc --build","watch:es":"bun run build:es:dev --watch","watch:ts":"bun run build:ts --watch --preserveWatchOutput","build:es:dev":"nano-build --preset=module --outdir=dist/dev src/*.ts","build:es:prod":"NODE_ENV=production nano-build --preset=module --outdir=dist src/*.ts"},"_npmUser":{"name":"alimd","email":"ali.mihan.doost@gmail.com"},"repository":{"url":"git+https://github.com/Alwatr/alwatr.git","type":"git","directory":"pkg/loom"},"_npmVersion":"lerna/5.6.1/node@v22.23.2+x64 (linux)","description":"A tiny, zero-dependency static site generator core that renders TSX templates to HTML strings — no React, no virtual DOM.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.4.0","typescript":"^7.0.2","@alwatr/standard":"10.0.0","@alwatr/nano-build":"10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/loom_10.1.0_1788188308088_0.7423010438426583","host":"s3://npm-registry-packages-npm-production"}},"10.2.0":{"name":"@alwatr/loom","version":"10.2.0","description":"A tiny, zero-dependency static site generator core that renders TSX templates to HTML strings — no React, no virtual DOM.","license":"MPL-2.0","author":{"name":"S. Ali Mihandoost","email":"ali.mihandoost@gmail.com"},"type":"module","repository":{"type":"git","url":"git+https://github.com/Alwatr/alwatr.git","directory":"pkg/loom"},"homepage":"https://github.com/Alwatr/alwatr/tree/next/pkg/loom#readme","bugs":{"url":"https://github.com/Alwatr/alwatr/issues"},"exports":{".":{"types":"./dist/main.d.ts","development":"./dist/dev/main.js","import":"./dist/main.js","default":"./dist/main.js"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","development":"./dist/dev/jsx-runtime.js","import":"./dist/jsx-runtime.js","default":"./dist/jsx-runtime.js"},"./jsx-dev-runtime":{"types":"./dist/jsx-dev-runtime.d.ts","development":"./dist/dev/jsx-dev-runtime.js","import":"./dist/jsx-dev-runtime.js","default":"./dist/jsx-dev-runtime.js"}},"sideEffects":false,"devDependencies":{"@alwatr/nano-build":"10.0.0","@alwatr/standard":"10.0.0","@types/bun":"^1.4.2","typescript":"^7.0.2"},"scripts":{"b":"bun run build","build":"bun run build:ts && bun run build:es","build:es":"bun run build:es:dev && bun run build:es:prod","build:es:dev":"nano-build --preset=module --outdir=dist/dev src/*.ts","build:es:prod":"NODE_ENV=production nano-build --preset=module --outdir=dist src/*.ts","build:ts":"tsc --build","cl":"bun run clean","clean":"rm -rfv dist *.tsbuildinfo","format":"prettier --write \"src/**/*.ts\"","lint":"eslint src/ --ext .ts","t":"bun run test","test":"ALWATR_DEBUG=0 bun test","w":"bun run watch","watch":"bun run watch:ts & bun run watch:es","watch:es":"bun run build:es:dev --watch","watch:ts":"bun run build:ts --watch --preserveWatchOutput"},"publishConfig":{"access":"public"},"keywords":["alwatr","bun","jsx","ssg","static-site-generator","tsx"],"gitHead":"2a0a52415ec6af039244806419c3b79734994c71","_id":"@alwatr/loom@10.2.0","_nodeVersion":"22.23.2","_npmVersion":"lerna/5.6.1/node@v22.23.2+x64 (linux)","dist":{"integrity":"sha512-QuXV6By5aCaPlEyGWOiRP12BTvt3EI3sddyFlO2lShKc3dmPE9bkPIR6sX1oug636Kcsa5FT9bIU+UuXDMO2yg==","shasum":"a10853d0141d77379ec000df238d32047f09ffda","tarball":"https://registry.npmjs.org/@alwatr/loom/-/loom-10.2.0.tgz","fileCount":52,"unpackedSize":162756,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDjOIA/MxYAzRkucu4jXaoKW9u6lkxsLiEqTQ9wq18npAIhAPi0nmJetxw3VHzVFunbToqFnXDm6Rs5678ILm4+UBkR"}]},"_npmUser":{"name":"alimd","email":"ali.mihan.doost@gmail.com"},"directories":{},"maintainers":[{"name":"alimd","email":"ali.mihan.doost@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/loom_10.2.0_1788887073385_0.1393558462703246"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-26T14:21:45.994Z","modified":"2026-09-08T17:04:33.717Z","10.0.0":"2026-07-26T14:21:46.260Z","10.0.1":"2026-07-26T17:05:03.949Z","10.0.2":"2026-07-28T12:13:46.678Z","10.1.0":"2026-08-31T14:58:28.240Z","10.2.0":"2026-09-08T17:04:33.511Z"},"bugs":{"url":"https://github.com/Alwatr/alwatr/issues"},"author":{"name":"S. Ali Mihandoost","email":"ali.mihandoost@gmail.com"},"license":"MPL-2.0","homepage":"https://github.com/Alwatr/alwatr/tree/next/pkg/loom#readme","keywords":["alwatr","bun","jsx","ssg","static-site-generator","tsx"],"repository":{"type":"git","url":"git+https://github.com/Alwatr/alwatr.git","directory":"pkg/loom"},"description":"A tiny, zero-dependency static site generator core that renders TSX templates to HTML strings — no React, no virtual DOM.","maintainers":[{"name":"alimd","email":"ali.mihan.doost@gmail.com"}],"readme":"# @alwatr/loom\n\n**Loom** is a tiny, zero-dependency static site generator core. You write pages as\n**TSX** components; Loom renders them to HTML strings. No React, no Preact, no\nvirtual DOM, no client runtime — JSX is just ergonomic syntax over functions that\nreturn HTML.\n\n## Why\n\n- **Own JSX runtime** — a string renderer in ~150 lines. The whole engine is yours.\n- **Zero dependencies** — pure TypeScript on Bun.\n- **Auto-escaping** — dynamic text is escaped by default; opt out explicitly with `raw()`.\n- **Honest HTML** — `class` (not `className`), and arbitrary attributes (`on-click`,\n  `scrim-overlay`, `data-*`, `aria-*`) pass through verbatim. Great for custom elements.\n- **Explicit routing** — a page exports its own `permalink`; no file-name magic.\n- **Fast** — synchronous, allocation-light string concatenation.\n\n## Setup\n\n`tsconfig.json`:\n\n```jsonc\n{\n  \"compilerOptions\": {\n    \"jsx\": \"react-jsx\",\n    \"jsxImportSource\": \"@alwatr/loom\",\n  },\n}\n```\n\n## Pages\n\nA page is a **named export**: an explicit `permalink` plus a `render` thunk. The\nthunk is pure — defining a page renders nothing and writes nothing.\n\n```tsx\n// src/page/about.tsx\nimport { definePage } from \"@alwatr/loom\";\nimport { Document } from \"../layout/document.tsx\";\n\nexport const aboutPage = definePage({\n  permalink: \"/about/\",\n  render: () => (\n    <Document title=\"About\">\n      <h1>About</h1>\n    </Document>\n  ),\n});\n```\n\n### Collections (one page per item — the typed replacement for pagination)\n\n```tsx\n// src/page/posts.tsx\nimport { collection } from \"@alwatr/loom\";\nimport { posts } from \"../data/posts.js\";\n\nexport const postPages = collection(posts, (post) => ({\n  permalink: `/post/${post.slug}/`,\n  render: () => <PostPage post={post} />,\n}));\n```\n\n### Layouts, partials, data\n\nThere is no magic. A **layout** is a component that takes `children`. A **partial**\nis a component you `import`. **Data** is a typed module you `import`. **Filters** are\nplain functions.\n\n## Registry & build\n\nRouting is an **explicit registry**, not file-system discovery: you import every\npage into one source-of-truth and list it. No globbing, no dynamic import — the\nroute set is a plain array your editor and bundler can see.\n\n```ts\n// src/site.ts — declarations only, zero side-effects\nimport { defineSite } from \"@alwatr/loom\";\nimport { homePage } from \"./page/index.tsx\";\nimport { aboutPage } from \"./page/about.tsx\";\nimport { postPages } from \"./page/posts.tsx\";\n\nexport const site = defineSite({\n  // outDir is optional: if omitted, no files are written to disk\n  outDir: \"dist\",\n  publicDir: \"public\", // copied verbatim\n  pages: [homePage, aboutPage, ...postPages],\n  // transform: (html) => minify(html),   // optional post-processing hook\n});\n```\n\n```ts\n// build.ts — the only file that touches the disk. Run: `bun run build.ts`\nimport { build } from \"@alwatr/loom\";\nimport { site } from \"./src/site.js\";\n\nconst results = await build(site);\n```\n\nDefinition (`site.ts`) is fully separate from execution (`build.ts`). Each page is\nwritten to `<permalink>/index.html`; permalinks with an extension (e.g. `/feed.xml`)\nare written as-is.\n\nIf `outDir` is omitted, `build()` will not write any files to disk. Instead, it returns the rendered pages in memory, allowing you to manually process or write them:\n\n```ts\nconst results = await build({\n  pages: [aboutPage],\n});\n// results = [{ permalink: '/about/', html: '<h1>About</h1>' }]\n```\n\n> [!TIP]\n> When `outDir` is provided, the raw `html` payload is omitted (undefined) from the returned array of `BuildResult` to save RAM overhead during large builds.\n\n## Standalone Data Pipeline\n\nThe build-time data pipeline (previously available as `@alwatr/loom/data`) has been extracted into a separate, independent package: [`@alwatr/bobbin`](../bobbin). Please use `@alwatr/bobbin` for declaring data sources, configurations, and running the data build pipeline.\n\n## Scope\n\nLoom renders TSX to a static site. Asset bundling (client JS, Tailwind/CSS),\nminification, and a dev server are intentionally **out of scope** — compose them in\nyour own build script, or hang minification off the `transform` hook.\n\n## API\n\n| Export                    | Description                                                                                |\n| ------------------------- | ------------------------------------------------------------------------------------------ |\n| `definePage(page)`        | Type a single page (`{permalink, render}`).                                                |\n| `collection(items, map)`  | Map a list to one page per item.                                                           |\n| `defineSite(config)`      | Type a site config (`{pages, outDir, …}`).                                                 |\n| `build(config)`           | Render pages. Writes to `outDir` if provided, otherwise returns `BuildResult[]` in memory. |\n| `render(node)`            | Render a JSX tree to an HTML string.                                                       |\n| `raw(html)`               | Mark a trusted string so it is emitted unescaped.                                          |\n| `Fragment`, `jsx`, `jsxs` | JSX runtime primitives (used by the compiler).                                             |\n\nSee [`example/`](./example) for a complete, runnable site.\n","readmeFilename":"README.md"}