## Demo: data-loading
### DataLoading.svelte
```svelte
{#if pokemon}
{:else}
No Pokémon found for "{id}".
{/if}
```
### PokemonSelector.svelte
```svelte
```
### PokemonHeader.svelte
```svelte
{isServer ? 'SERVER' : 'BROWSER'} | {isDev ? 'DEV' : 'PROD'}
```
### PokemonMeta.svelte
```svelte
```
### PokemonStats.svelte
```svelte
```
### routes.ts
```ts
import { Mochi, fail, redirect } from 'mochi-framework';
import type { MochiRouteValue } from 'mochi-framework';
export const routes: Record = {
'/demos/data-loading': (req: Request) => Response.redirect(new URL('/demos/data-loading/pikachu', req.url), 302),
'/demos/data-loading/:id': Mochi.page('./src/demos/data-loading/DataLoading.svelte', {
actions: {
default: async ({ formData }) => {
const pokemon = String(formData.get('pokemon') ?? '')
.trim()
.toLowerCase();
if (!pokemon) {
return fail(400, { error: 'Pokemon required' });
}
return redirect(303, `/demos/data-loading/${encodeURIComponent(pokemon)}`);
},
},
}),
};
```
### cache.ts
```ts
import { MochiCache } from 'mochi-framework';
export const pokemonCache = new MochiCache({
minTimeToStale: 10_000,
maxTimeToLive: 300_000,
});
```
### 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');
```