update: improve project structure and add linting/formatting

- Remove duplicate lucide-svelte package, keep @lucide/svelte
- Move schema from src/lib/server/ to src/lib/db/ for better organization
- Add path aliases to svelte.config.js (, , , , )
- Add ESLint and Prettier configuration with 2-space indentation
- Update all imports to use new schema location and icon package
This commit is contained in:
Rasmus Q
2026-03-15 20:58:55 +00:00
parent 686b43bc18
commit 06c96f4b35
27 changed files with 103 additions and 25 deletions

8
.phase.json Normal file
View File

@@ -0,0 +1,8 @@
{
"version": "2",
"phaseApp": "wishlist",
"appId": "a4d85c7a-8df9-462b-9b91-5cb2957cdcd3",
"defaultEnv": "Production",
"envId": "496d0105-f2b4-424d-a1a1-a60602fc2252",
"monorepoSupport": false
}

15
.prettierignore Normal file
View File

@@ -0,0 +1,15 @@
# Ignore files for Prettier
build
.svelte-kit
dist
node_modules
# Ignore generated files
drizzle/meta
# Ignore lock files
bun.lock
package-lock.json
yarn.lock
pnpm-lock.yaml

9
.prettierrc Normal file
View File

@@ -0,0 +1,9 @@
{
"useTabs": false,
"tabWidth": 2,
"singleQuote": true,
"trailingComma": "none",
"printWidth": 100,
"plugins": ["prettier-plugin-svelte"],
"overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
}

View File

@@ -1,7 +1,7 @@
import type { Config } from 'drizzle-kit';
export default {
schema: './src/lib/server/schema.ts',
schema: './src/lib/db/schema.ts',
out: './drizzle',
dialect: 'postgresql',
dbCredentials: {

30
eslint.config.js Normal file
View File

@@ -0,0 +1,30 @@
import js from '@eslint/js';
import ts from 'typescript-eslint';
import svelte from 'eslint-plugin-svelte';
import globals from 'globals';
/** @type {import('eslint').Linter.Config[]} */
export default [
js.configs.recommended,
...ts.configs.recommended,
...svelte.configs['flat/recommended'],
{
languageOptions: {
globals: {
...globals.browser,
...globals.node
}
}
},
{
files: ['**/*.svelte'],
languageOptions: {
parserOptions: {
parser: ts.parser
}
}
},
{
ignores: ['build/', '.svelte-kit/', 'dist/']
}
];

View File

@@ -14,9 +14,12 @@
"db:generate": "drizzle-kit generate",
"db:migrate": "drizzle-kit migrate",
"db:push": "drizzle-kit push",
"db:studio": "drizzle-kit studio"
"db:studio": "drizzle-kit studio",
"lint": "prettier --check . && eslint .",
"format": "prettier --write ."
},
"devDependencies": {
"@eslint/js": "^9.25.0",
"@lucide/svelte": "^0.544.0",
"@sveltejs/adapter-auto": "^7.0.0",
"@sveltejs/adapter-node": "^5.4.0",
@@ -25,13 +28,19 @@
"@tailwindcss/vite": "^4.1.17",
"@types/bcrypt": "^6.0.0",
"drizzle-kit": "^0.31.7",
"eslint": "^9.25.0",
"eslint-plugin-svelte": "^3.5.1",
"globals": "^16.0.0",
"patch-package": "^8.0.1",
"postinstall-postinstall": "^2.1.0",
"prettier": "^3.5.3",
"prettier-plugin-svelte": "^3.3.3",
"svelte": "^5.43.8",
"svelte-check": "^4.3.4",
"tailwindcss": "^4.1.17",
"tw-animate-css": "^1.4.0",
"typescript": "^5.9.3",
"typescript-eslint": "^8.31.0",
"vite": "^7.2.2"
},
"dependencies": {
@@ -44,7 +53,7 @@
"bits-ui": "^2.14.4",
"clsx": "^2.1.1",
"drizzle-orm": "^0.44.7",
"lucide-svelte": "^0.554.0",
"postgres": "^3.4.7",
"svelte-dnd-action": "^0.9.67",
"tailwind-merge": "^3.4.0",

View File

@@ -4,7 +4,7 @@ import Credentials from '@auth/core/providers/credentials';
import Google from '@auth/core/providers/google';
import type { OAuthConfig } from '@auth/core/providers';
import { db } from '$lib/server/db';
import { users } from '$lib/server/schema';
import { users } from '$lib/db/schema';
import { eq } from 'drizzle-orm';
import bcrypt from 'bcrypt';
import { env } from '$env/dynamic/private';

View File

@@ -3,7 +3,7 @@
import WishlistSection from '$lib/components/dashboard/WishlistSection.svelte';
import { getLocalWishlists, forgetLocalWishlist, toggleLocalFavorite, type LocalWishlist } from '$lib/utils/localWishlists';
import { languageStore } from '$lib/stores/language.svelte';
import { Star } from 'lucide-svelte';
import { Star } from '@lucide/svelte';
import { onMount } from 'svelte';
let {

View File

@@ -3,7 +3,7 @@
import WishlistGrid from '$lib/components/dashboard/WishlistGrid.svelte';
import WishlistCard from '$lib/components/dashboard/WishlistCard.svelte';
import { enhance } from '$app/forms';
import { Star } from 'lucide-svelte';
import { Star } from '@lucide/svelte';
import { languageStore } from '$lib/stores/language.svelte';
import SearchBar from '$lib/components/ui/SearchBar.svelte';
import UnlockButton from '$lib/components/ui/UnlockButton.svelte';

View File

@@ -2,7 +2,7 @@
import { Button } from '$lib/components/ui/button';
import { ThemeToggle } from '$lib/components/ui/theme-toggle';
import { LanguageToggle } from '$lib/components/ui/language-toggle';
import { LayoutDashboard } from 'lucide-svelte';
import { LayoutDashboard } from '@lucide/svelte';
import { languageStore } from '$lib/stores/language.svelte';
let {

View File

@@ -1,5 +1,5 @@
<script lang="ts">
import { X, Pencil } from 'lucide-svelte';
import { X, Pencil } from '@lucide/svelte';
import IconButton from './IconButton.svelte';
let {

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import { Button } from '$lib/components/ui/button';
import { Lock, LockOpen } from 'lucide-svelte';
import { Lock, LockOpen } from '@lucide/svelte';
import { languageStore } from '$lib/stores/language.svelte';
let {

View File

@@ -2,7 +2,7 @@
import { languageStore } from '$lib/stores/language.svelte';
import { languages } from '$lib/i18n/translations';
import Dropdown from '$lib/components/ui/Dropdown.svelte';
import { Languages } from 'lucide-svelte';
import { Languages } from '@lucide/svelte';
let { color }: { color?: string | null } = $props();

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import Dropdown from '$lib/components/ui/Dropdown.svelte';
import { Palette } from 'lucide-svelte';
import { Palette } from '@lucide/svelte';
import { AVAILABLE_THEMES } from '$lib/utils/themes';
let {

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import { themeStore } from '$lib/stores/theme.svelte';
import { Sun, Moon, Monitor } from 'lucide-svelte';
import { Sun, Moon, Monitor } from '@lucide/svelte';
import IconButton from '../IconButton.svelte';
let {

View File

@@ -3,11 +3,11 @@
import { Input } from "$lib/components/ui/input";
import { Label } from "$lib/components/ui/label";
import { Textarea } from "$lib/components/ui/textarea";
import { Pencil, Check, X } from "lucide-svelte";
import { Pencil, Check, X } from "@lucide/svelte";
import ColorPicker from "$lib/components/ui/ColorPicker.svelte";
import ThemePicker from "$lib/components/ui/theme-picker.svelte";
import IconButton from "$lib/components/ui/IconButton.svelte";
import type { Wishlist } from "$lib/server/schema";
import type { Wishlist } from "$lib/db/schema";
import { languageStore } from '$lib/stores/language.svelte';
import { getCardStyle } from '$lib/utils/colors';

View File

@@ -1,7 +1,7 @@
<script lang="ts">
import { Card, CardContent } from "$lib/components/ui/card";
import type { Item } from "$lib/server/schema";
import { GripVertical, ExternalLink } from "lucide-svelte";
import type { Item } from "$lib/db/schema";
import { GripVertical, ExternalLink } from "@lucide/svelte";
import { getCardStyle } from '$lib/utils/colors';
import { Button } from "$lib/components/ui/button";
import { languageStore } from '$lib/stores/language.svelte';

View File

@@ -1,7 +1,7 @@
import { drizzle } from 'drizzle-orm/postgres-js';
import postgres from 'postgres';
import { env } from '$env/dynamic/private';
import * as schema from './schema';
import * as schema from '$lib/db/schema';
const client = postgres(env.DATABASE_URL!);
export const db = drizzle(client, { schema });

View File

@@ -1,7 +1,7 @@
import { json } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
import { db } from '$lib/server/db';
import { wishlists } from '$lib/server/schema';
import { wishlists } from '$lib/db/schema';
import { eq, or } from 'drizzle-orm';
export const GET: RequestHandler = async ({ params }) => {

View File

@@ -1,7 +1,7 @@
import { json } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
import { db } from '$lib/server/db';
import { wishlists } from '$lib/server/schema';
import { wishlists } from '$lib/db/schema';
import { createId } from '@paralleldrive/cuid2';
import { sanitizeString, sanitizeColor } from '$lib/server/validation';

View File

@@ -1,7 +1,7 @@
import { redirect } from '@sveltejs/kit';
import type { PageServerLoad, Actions } from './$types';
import { db } from '$lib/server/db';
import { wishlists, savedWishlists, users } from '$lib/server/schema';
import { wishlists, savedWishlists, users } from '$lib/db/schema';
import { eq, and } from 'drizzle-orm';
export const load: PageServerLoad = async (event) => {

View File

@@ -6,7 +6,7 @@
import WishlistSection from '$lib/components/dashboard/WishlistSection.svelte';
import LocalWishlistsSection from '$lib/components/dashboard/LocalWishlistsSection.svelte';
import { enhance } from '$app/forms';
import { Star } from 'lucide-svelte';
import { Star } from '@lucide/svelte';
import { languageStore } from '$lib/stores/language.svelte';
let { data }: { data: PageData } = $props();

View File

@@ -1,7 +1,7 @@
import { fail, redirect } from '@sveltejs/kit';
import type { Actions, PageServerLoad } from './$types';
import { db } from '$lib/server/db';
import { users } from '$lib/server/schema';
import { users } from '$lib/db/schema';
import { eq } from 'drizzle-orm';
import bcrypt from 'bcrypt';
import { env } from '$env/dynamic/private';

View File

@@ -1,7 +1,7 @@
import { error } from '@sveltejs/kit';
import type { PageServerLoad, Actions } from './$types';
import { db } from '$lib/server/db';
import { wishlists, items, reservations, savedWishlists } from '$lib/server/schema';
import { wishlists, items, reservations, savedWishlists } from '$lib/db/schema';
import { eq, and } from 'drizzle-orm';
export const load: PageServerLoad = async ({ params, locals }) => {

View File

@@ -1,7 +1,7 @@
import { error } from '@sveltejs/kit';
import type { PageServerLoad, Actions } from './$types';
import { db } from '$lib/server/db';
import { wishlists, items, savedWishlists } from '$lib/server/schema';
import { wishlists, items, savedWishlists } from '$lib/db/schema';
import { eq, and } from 'drizzle-orm';
export const load: PageServerLoad = async ({ params, locals }) => {

View File

@@ -10,7 +10,14 @@ const config = {
kit: {
adapter: adapter({
out: 'build'
})
}),
alias: {
'$db': './src/lib/db',
'$components': './src/lib/components',
'$utils': './src/lib/utils',
'$stores': './src/lib/stores',
'$i18n': './src/lib/i18n'
}
}
};