## Demo: island-props ### ServerRenderedParent.svelte ```svelte

ServerRenderedParent.svelte

Runs only on the server. No mochi:hydrate directive, so this component ships zero JavaScript — its output is inert HTML. It builds a props bag covering every type devalue supports and hands it off to the child below. The Server type column in the child is captured here, before serialization; the Client type column is resolved after hydration. Matching values prove the round-trip preserved each type.

{`const dateVal = new Date('2025-01-15T12:00:00Z');
const mapVal = new Map([['a', 1], ['b', 2], ['c', 3]]);
const setVal = new Set([10, 20, 30]);
const bigintVal = 9007199254740993n;
const urlVal = new URL('https://mochi.dev/docs?version=5');
// ...
const cyclic: { name: string; self?: unknown } = { name: 'cyclic' };
cyclic.self = cyclic;
const cyclicRef = cyclic;`}
``` ### ClientRenderedChild.svelte ```svelte
ClientRenderedChild.svelte {isBrowser ? 'Client (hydrated)' : 'Server (SSR)'}
{#each rows as row (row.label)} {/each}
Prop Value Server type Client type
{row.label} {display(row.value)} {serverTypes[row.label] ?? '—'} {isBrowser ? typeOf(row.value) : '—'}
Repeated ref {repeatedRef[0] === repeatedRef[1] ? 'same ref' : 'different refs'} identity check {isBrowser ? 'identity check' : '—'}
Cyclic ref {cyclicRef.self === cyclicRef ? 'self === obj' : 'broken'} identity check {isBrowser ? 'identity check' : '—'}
``` ### devalueTypeOf.ts ```ts export function typeOf(v: unknown): string { if (v === undefined) { return 'undefined'; } if (v === null) { return 'null'; } if (typeof v === 'bigint') { return 'BigInt'; } if (typeof v === 'number') { if (Number.isNaN(v)) { return 'NaN'; } if (v === Infinity) { return 'Infinity'; } if (Object.is(v, -0)) { return '-0'; } } if (v instanceof Date) { return 'Date'; } if (v instanceof RegExp) { return 'RegExp'; } if (v instanceof Map) { return 'Map'; } if (v instanceof Set) { return 'Set'; } if (v instanceof URL) { return 'URL'; } if (v instanceof URLSearchParams) { return 'URLSearchParams'; } if (v instanceof Uint8Array) { return 'Uint8Array'; } if (ArrayBuffer.isView(v)) { return (v as { constructor: { name: string } }).constructor.name; } if (Array.isArray(v)) { return 'Array'; } return typeof v; } ``` ### routes.ts ```ts import { Mochi } from 'mochi-framework'; import type { MochiRouteValue } from 'mochi-framework'; export const routes: Record = { '/demos/island-props': Mochi.page('./src/demos/island-props/ServerRenderedParent.svelte'), }; ``` ### index.ts ```ts import { Mochi, logger } from 'mochi-framework'; await Mochi.serve({ port: 3333, development: process.env.MODE === 'development', routes: { '/': Mochi.page('./src/Home.svelte'), }, }); logger.info('Server running at http://localhost:3333'); ```