.cursorrules (deprecated)
rules/svelte-kit/.cursorrules.cursorrules
Quality
81/100
Scores the file, not the repository.Length
1,056 words
21 headings · 7 code blocksRepository
16
— · pushed 109 days agoLast changed
2 days ago
First indexed 2 days ago.1# SvelteKit — Cursor Rules2# Comprehensive rules for SvelteKit application development34## Project Context5You are working on a SvelteKit application. The project uses Svelte 5 runes for6reactivity, SvelteKit for routing and server-side rendering, and TypeScript for type7safety. SvelteKit provides file-based routing, server-side rendering, and a clear8separation between server and client code.910## Tech Stack11- Svelte 5 with runes ($state, $derived, $effect)12- SvelteKit 2+ with file-based routing13- TypeScript (strict mode)14- Vite for building15- Tailwind CSS or vanilla CSS for styling16- Superforms or native form handling17- Vitest + Playwright for testing1819## Coding Style2021### Naming Conventions22- Components: PascalCase (e.g., `UserProfile.svelte`, `DataTable.svelte`)23- Route files: `+page.svelte`, `+page.server.ts`, `+layout.svelte`, `+server.ts`24- Stores: camelCase with descriptive names (e.g., `userStore.ts`, `cartItems.svelte.ts`)25- Utility functions: camelCase (e.g., `formatDate.ts`, `validateEmail.ts`)26- CSS classes: kebab-case or Tailwind utilities27- Events: kebab-case (e.g., `on:item-selected`)2829### File Structure30```31src/32 routes/33 +page.svelte # Home page34 +layout.svelte # Root layout35 +layout.server.ts # Root layout server load36 (app)/ # Route group for authenticated pages37 dashboard/38 +page.svelte39 +page.server.ts40 (marketing)/ # Route group for public pages41 about/42 +page.svelte43 api/44 webhooks/45 +server.ts # API endpoint46 lib/47 components/ # Shared components48 ui/ # UI primitives49 server/ # Server-only modules (database, auth)50 utils/ # Shared utilities51 types/ # TypeScript types52 stores/ # Svelte stores / rune-based state53 hooks.server.ts # Server hooks (auth, logging)54 hooks.client.ts # Client hooks (error handling)55```5657## Svelte 5 Runes5859### State Management60```svelte61<script lang="ts">62 // Reactive state with $state63 let count = $state(0);64 let user = $state<User | null>(null);6566 // Derived values with $derived67 let doubled = $derived(count * 2);68 let isLoggedIn = $derived(user !== null);6970 // Complex derived with $derived.by71 let summary = $derived.by(() => {72 if (!user) return 'Not logged in';73 return `${user.name} (${user.email})`;74 });7576 // Side effects with $effect77 $effect(() => {78 console.log('Count changed to', count);79 // Cleanup function (optional)80 return () => { /* cleanup */ };81 });82</script>83```8485### Props with Runes86```svelte87<script lang="ts">88 interface Props {89 title: string;90 count?: number;91 onUpdate?: (value: number) => void;92 children: import('svelte').Snippet;93 }9495 let { title, count = 0, onUpdate, children }: Props = $props();96</script>97```9899### Prefer100- Svelte 5 runes (`$state`, `$derived`, `$effect`) over Svelte 4 stores101- `$derived` over `$effect` for computing values (no unnecessary side effects)102- `$props()` for component inputs103- Snippets over slots for content projection (Svelte 5)104- `.svelte.ts` files for shared reactive state modules105- Form actions for form handling106- `$lib/` alias for imports from `src/lib/`107108### Avoid109- Svelte 4 syntax (`export let`, `$:` reactive declarations, `$$props`)110- Writable stores for local component state — use `$state` instead111- `$effect` for derived values — use `$derived` instead112- Direct DOM manipulation — use Svelte's reactivity113- `onMount` when `$effect` serves the same purpose114- Overusing context for simple prop passing115116## SvelteKit Data Loading117118### Server Load Functions119```ts120// +page.server.ts121import type { PageServerLoad } from './$types';122import { error, redirect } from '@sveltejs/kit';123124export const load: PageServerLoad = async ({ params, locals, depends }) => {125 depends('app:posts'); // For invalidation126127 const post = await db.post.findUnique({ where: { slug: params.slug } });128 if (!post) error(404, 'Post not found');129130 return { post };131};132```133134### Universal Load Functions135```ts136// +page.ts — runs on both server and client137import type { PageLoad } from './$types';138139export const load: PageLoad = async ({ fetch, params }) => {140 const response = await fetch(`/api/posts/${params.id}`);141 return { post: await response.json() };142};143```144145### Form Actions146```ts147// +page.server.ts148import type { Actions } from './$types';149import { fail, redirect } from '@sveltejs/kit';150151export const actions: Actions = {152 create: async ({ request, locals }) => {153 const formData = await request.formData();154 const title = formData.get('title')?.toString();155156 if (!title || title.length < 3) {157 return fail(400, { title, error: 'Title must be at least 3 characters' });158 }159160 const post = await db.post.create({ data: { title, authorId: locals.user.id } });161 redirect(303, `/posts/${post.id}`);162 },163164 delete: async ({ params, locals }) => {165 await db.post.delete({ where: { id: params.id, authorId: locals.user.id } });166 redirect(303, '/posts');167 },168};169```170171## Error Handling172- Use `error()` helper in load functions for expected errors (404, 403)173- Use `fail()` in form actions for validation errors174- Create `+error.svelte` pages for error UI at each route level175- Use `handleError` hook in `hooks.server.ts` for unexpected server errors176- Always provide user-friendly error messages177- Log unexpected errors to an error tracking service178179## API Routes180```ts181// routes/api/posts/+server.ts182import { json, error } from '@sveltejs/kit';183import type { RequestHandler } from './$types';184185export const GET: RequestHandler = async ({ url, locals }) => {186 const page = Number(url.searchParams.get('page')) || 1;187 const posts = await db.post.findMany({ skip: (page - 1) * 20, take: 20 });188 return json({ posts, page });189};190191export const POST: RequestHandler = async ({ request, locals }) => {192 if (!locals.user) error(401, 'Unauthorized');193 const body = await request.json();194 const post = await db.post.create({ data: { ...body, authorId: locals.user.id } });195 return json(post, { status: 201 });196};197```198199## Testing200- Use Vitest for unit tests of utilities, stores, and logic201- Use `@testing-library/svelte` for component tests202- Use Playwright for E2E tests via SvelteKit's integration203- Test load functions as regular async functions204- Test form actions by simulating FormData205- Place tests in `src/tests/` or co-locate with `*.test.ts` files206207## Performance Guidelines208- Use streaming with `await parent()` wisely — avoid waterfalls209- Preload data with `data-sveltekit-preload-data="hover"` on links210- Use `{#key}` blocks sparingly — they destroy and recreate DOM211- Lazy-load heavy components with dynamic imports212- Use `$effect.pre()` only when you need to run before DOM update213- Avoid expensive computations in `$derived` — memoize or debounce if needed214215## Common Pitfalls216- Forgetting to return data from load functions217- Not using `$types` imports for proper type inference in load/actions218- Using `$effect` to set state that could be `$derived`219- Mutating `$state` arrays/objects — mutations ARE tracked in Svelte 5 (unlike React)220- Not handling the `form` prop in `+page.svelte` after form actions221- Forgetting that `+page.server.ts` load data is serialized (no functions, dates as strings)222- Using `fetch` from `globalThis` instead of the `fetch` passed to load functions223- Not calling `await parent()` when needed in nested load functions224
Also in survivorforge/cursor-rules
Diff this repo’s formatsOne repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| survivorforge/cursor-rulesrules/ai-ml-python/.cursorrules · 16 | .cursorrules | teststylearchdeployment+2 | 81/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/api-design-rest/.cursorrules · 16 | .cursorrules | lint-formatstylesecurityapi+3 | 69/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/api-microservices/.cursorrules · 16 | .cursorrules | buildteststylearch+5 | 92/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/aws-serverless/.cursorrules · 16 | .cursorrules | teststylearchtypes+6 | 73/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/chrome-extension/.cursorrules · 16 | .cursorrules | teststylearchtesting-strategy+4 | 81/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/clean-code/.cursorrules · 16 | .cursorrules | styledo-notagent-behaviourdocs | 57/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/database-sql/.cursorrules · 16 | .cursorrules | styletypessecuritydatabase+3 | 65/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/devops-docker/.cursorrules · 16 | .cursorrules | setupbuildteststyle+4 | 93/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/devops-infrastructure/.cursorrules · 16 | .cursorrules | buildteststylesecurity+3 | 93/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/django-rest/.cursorrules · 16 | .cursorrules | buildteststylearch+5 | 84/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/docker-devops/.cursorrules · 16 | .cursorrules | setupteststylearch+6 | 85/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/flutter-dart/.cursorrules · 16 | .cursorrules | teststylearchtypes+5 | 89/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/fullstack-nextjs-prisma/.cursorrules · 16 | .cursorrules | teststylearchtypes+7 | 96/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/go-gin/.cursorrules · 16 | .cursorrules | testlint-formatstylearch+5 | 84/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/go-production/.cursorrules · 16 | .cursorrules | teststylearchtesting-strategy+3 | 89/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/golang-api/.cursorrules · 16 | .cursorrules | buildteststylearch+6 | 84/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/langchain-ai/.cursorrules · 16 | .cursorrules | testlint-formatstylearch+4 | 84/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/mcp-server/.cursorrules · 16 | .cursorrules | testlint-formatstylearch+7 | 68/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/mern-stack/.cursorrules · 16 | .cursorrules | setupteststylearch+6 | 81/100 | 2 days ago | |
| survivorforge/cursor-rulesrules/mobile-react-native/.cursorrules · 16 | .cursorrules | teststylearchtypes+7 | 89/100 | 2 days ago |
Diff against rules/ai-ml-python/.cursorrules Diff against rules/api-design-rest/.cursorrules Diff against rules/api-microservices/.cursorrules Diff against rules/aws-serverless/.cursorrules Diff against rules/chrome-extension/.cursorrules Diff against rules/clean-code/.cursorrules Diff against rules/database-sql/.cursorrules Diff against rules/devops-docker/.cursorrules Diff against rules/devops-infrastructure/.cursorrules Diff against rules/django-rest/.cursorrules Diff against rules/docker-devops/.cursorrules Diff against rules/flutter-dart/.cursorrules Diff against rules/fullstack-nextjs-prisma/.cursorrules Diff against rules/go-gin/.cursorrules Diff against rules/go-production/.cursorrules Diff against rules/golang-api/.cursorrules Diff against rules/langchain-ai/.cursorrules Diff against rules/mcp-server/.cursorrules Diff against rules/mern-stack/.cursorrules Diff against rules/mobile-react-native/.cursorrules
