or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

examples

edge-cases.mdreal-world-scenarios.md
index.md
tile.json

real-world-scenarios.mddocs/examples/

Real-World Scenarios

Comprehensive usage examples for common SvelteKit patterns.

Authentication Flow

Server-Side Authentication

// src/hooks.server.ts
import type { Handle } from '@sveltejs/kit';

export const handle: Handle = async ({ event, resolve }) => {
  const session = event.cookies.get('session');
  
  if (session) {
    event.locals.user = await validateSession(session);
  }
  
  return resolve(event);
};
// src/routes/dashboard/+page.server.ts
import { error, redirect } from '@sveltejs/kit';

export async function load({ locals }) {
  if (!locals.user) {
    redirect(307, '/login');
  }
  
  return {
    user: locals.user,
    dashboard: await getDashboardData(locals.user.id)
  };
}

Login Form

// src/routes/login/+page.server.ts
import { fail, redirect } from '@sveltejs/kit';

export const actions = {
  default: async ({ request, cookies }) => {
    const data = await request.formData();
    const email = data.get('email');
    const password = data.get('password');
    
    const user = await authenticate(email, password);
    
    if (!user) {
      return fail(401, { email, incorrect: true });
    }
    
    cookies.set('session', user.sessionId, {
      path: '/',
      httpOnly: true,
      secure: true,
      sameSite: 'strict',
      maxAge: 60 * 60 * 24 * 7 // 1 week
    });
    
    redirect(303, '/dashboard');
  }
};

Data Fetching Patterns

Parallel Data Loading

// src/routes/blog/[slug]/+page.server.ts
export async function load({ params, fetch }) {
  // Load in parallel
  const [post, comments, related] = await Promise.all([
    fetch(`/api/posts/${params.slug}`).then(r => r.json()),
    fetch(`/api/posts/${params.slug}/comments`).then(r => r.json()),
    fetch(`/api/posts/${params.slug}/related`).then(r => r.json())
  ]);
  
  return { post, comments, related };
}

Dependent Data Loading

// src/routes/user/[id]/+page.server.ts
export async function load({ params, fetch }) {
  const user = await fetch(`/api/users/${params.id}`).then(r => r.json());
  
  // Load user's posts after getting user
  const posts = await fetch(`/api/users/${params.id}/posts`).then(r => r.json());
  
  return { user, posts };
}

Parent Data Access

// src/routes/+layout.server.ts
export async function load({ locals }) {
  return {
    user: locals.user,
    theme: locals.theme
  };
}

// src/routes/dashboard/+page.server.ts
export async function load({ parent, fetch }) {
  const { user } = await parent();
  
  const data = await fetch(`/api/users/${user.id}/dashboard`).then(r => r.json());
  
  return { data };
}

Form Patterns

Multi-Step Form

// src/routes/signup/+page.server.ts
export const actions = {
  step1: async ({ request }) => {
    const data = await request.formData();
    // Validate step 1
    return { step: 2, data: Object.fromEntries(data) };
  },
  
  step2: async ({ request }) => {
    const data = await request.formData();
    // Validate step 2
    return { step: 3, data: Object.fromEntries(data) };
  },
  
  complete: async ({ request, cookies }) => {
    const data = await request.formData();
    const user = await createUser(data);
    cookies.set('session', user.sessionId, { path: '/' });
    redirect(303, '/dashboard');
  }
};

File Upload

// src/routes/upload/+page.server.ts
import { fail } from '@sveltejs/kit';

export const actions = {
  upload: async ({ request }) => {
    const data = await request.formData();
    const file = data.get('file') as File;
    
    if (!file || file.size === 0) {
      return fail(400, { error: 'No file provided' });
    }
    
    if (file.size > 10 * 1024 * 1024) {
      return fail(400, { error: 'File too large' });
    }
    
    const url = await uploadFile(file);
    
    return { success: true, url };
  }
};

API Route Patterns

RESTful API

// src/routes/api/posts/+server.ts
import { json, error } from '@sveltejs/kit';

export async function GET({ url }) {
  const posts = await getPosts(url.searchParams);
  return json(posts);
}

export async function POST({ request }) {
  const data = await request.json();
  const post = await createPost(data);
  return json(post, { status: 201 });
}
// src/routes/api/posts/[id]/+server.ts
import { json, error } from '@sveltejs/kit';

export async function GET({ params }) {
  const post = await getPost(params.id);
  if (!post) error(404, 'Post not found');
  return json(post);
}

export async function PUT({ params, request }) {
  const data = await request.json();
  const post = await updatePost(params.id, data);
  return json(post);
}

export async function DELETE({ params }) {
  await deletePost(params.id);
  return new Response(null, { status: 204 });
}

Error Handling

Custom Error Pages

<!-- src/routes/+error.svelte -->
<script>
  import { page } from '$app/stores';
</script>

<h1>{$page.status}</h1>
<p>{$page.error?.message}</p>
// src/hooks.server.ts
import type { HandleServerError } from '@sveltejs/kit';

export const handleError: HandleServerError = ({ error, event, status, message }) => {
  console.error('Server error:', error);
  
  return {
    message: 'An error occurred',
    code: status
  };
};

Navigation Patterns

Programmatic Navigation

import { goto, invalidate } from '$app/navigation';

// Navigate with state
await goto('/dashboard', {
  state: { from: 'login' },
  replaceState: true
});

// Invalidate data after mutation
async function deletePost(id: string) {
  await fetch(`/api/posts/${id}`, { method: 'DELETE' });
  await invalidate('/api/posts');
  await goto('/posts');
}

Preloading

<script>
  import { preloadData } from '$app/navigation';
</script>

<a
  href="/slow-page"
  on:mouseenter={() => preloadData('/slow-page')}
>
  Hover to preload
</a>

State Management

Using Page State

<script>
  import { page } from '$app/state';
  import { pushState } from '$app/navigation';
  
  function openModal() {
    pushState('/modal', { modal: true });
  }
</script>

{#if $page.state.modal}
  <div class="modal">
    <!-- Modal content -->
  </div>
{/if}

See Also

  • Edge Cases - Advanced scenarios
  • Load Functions Reference
  • Forms Reference
  • Navigation Reference