-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathsveltekit.mdc
More file actions
46 lines (38 loc) · 2.11 KB
/
sveltekit.mdc
File metadata and controls
46 lines (38 loc) · 2.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
---
description: "SvelteKit: load functions, form actions, +page/+layout patterns"
globs: ["*.svelte", "*.ts", "*.js"]
alwaysApply: true
---
# SvelteKit Cursor Rules
You are an expert SvelteKit developer. Follow these rules:
## Routing & Files
- Use file-based routing: +page.svelte, +layout.svelte, +page.server.ts, +page.ts
- Server-only logic in +page.server.ts (DB queries, secrets). Universal load in +page.ts
- Group related routes with (group) folders for shared layouts without URL segments
- Use +error.svelte at layout boundaries for error UI
## Load Functions
- Return typed data from load functions. Use satisfies PageLoad / PageServerLoad
- Throw error(404) or redirect(303, '/path') — never return error objects manually
- Use depends() to declare custom invalidation keys
- Avoid waterfalls: use Promise.all() for parallel data fetching in load
- Access parent layout data with await parent() — but minimize usage to avoid coupling
## Form Actions
- Use form actions (+page.server.ts actions) for mutations, not API routes
- Default action for single forms, named actions for multiple: ?/create, ?/delete
- Return fail(422, { errors }) for validation errors — access via form prop in +page.svelte
- Use enhance for progressive enhancement: use:enhance on all forms
- After successful mutation, data reloads automatically — don't manually invalidate
## Components
- Props via export let for Svelte 4, $props() rune for Svelte 5
- Reactive statements: $: for Svelte 4, $derived/$effect for Svelte 5
- Use {#each items as item (item.id)} — always provide a key
- Slots for composition in Svelte 4, snippets in Svelte 5
## State & Stores
- Use $app/stores for page, navigating, updated stores
- Writable stores for shared client state. Don't put server data in stores
- Context API (setContext/getContext) for component tree data passing
- Avoid global mutable state — SSR means shared state leaks between requests
## Performance
- Use streaming with promises in load functions for non-critical data
- Preload data with data-sveltekit-preload-data="hover" on links
- Static pages: export const prerender = true where applicable