Refactor recipe add/edit routes from client-side fetch to proper SvelteKit form actions with progressive enhancement and comprehensive security improvements. **Security Enhancements:** - Implement 5-layer image validation (file size, MIME type, extension, magic bytes, Sharp structure) - Replace insecure base64 JSON encoding with FormData for file uploads - Add file-type@19 dependency for magic bytes validation - Validate actual file type via magic bytes to prevent file type spoofing **Progressive Enhancement:** - Forms now work without JavaScript using native browser submission - Add use:enhance for improved client-side UX when JS is available - Serialize complex nested data (ingredients/instructions) via JSON in hidden fields - Translation workflow integrated via programmatic form submission **Bug Fixes:** - Add type="button" to all interactive buttons in CreateIngredientList and CreateStepList to prevent premature form submission when clicking on ingredients/steps - Fix SSR errors by using season_local state instead of get_season() DOM query - Fix redirect handling in form actions (redirects were being caught as errors) - Fix TranslationApproval to handle recipes without images using null-safe checks - Add reactive effect to sync editableEnglish.images with germanData.images length - Detect and hide 150x150 placeholder images in CardAdd component **Features:** - Make image uploads optional for recipe creation (use placeholder based on short_name) - Handle three image scenarios in edit: keep existing, upload new, rename on short_name change - Automatic image file renaming across full/thumb/placeholder directories when short_name changes - Change detection for partial translation updates in edit mode **Technical Changes:** - Create imageValidation.ts utility with comprehensive file validation - Create recipeFormHelpers.ts for data extraction, validation, and serialization - Refactor /api/rezepte/img/add endpoint to use FormData instead of base64 - Update CardAdd component to upload via FormData immediately with proper error handling - Use Image API for placeholder detection (avoids CORS issues with fetch)
58 lines
1.9 KiB
JSON
58 lines
1.9 KiB
JSON
{
|
|
"name": "homepage",
|
|
"version": "1.0.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite dev",
|
|
"build": "vite build",
|
|
"preview": "vite preview",
|
|
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
|
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"test:ui": "vitest --ui",
|
|
"test:coverage": "vitest run --coverage",
|
|
"test:e2e": "playwright test",
|
|
"test:e2e:ui": "playwright test --ui",
|
|
"test:e2e:docker:up": "docker compose -f docker-compose.test.yml up -d",
|
|
"test:e2e:docker:down": "docker compose -f docker-compose.test.yml down -v",
|
|
"test:e2e:docker": "docker compose -f docker-compose.test.yml up -d && playwright test; docker compose -f docker-compose.test.yml down -v",
|
|
"test:e2e:docker:run": "docker run --rm --network host -v $(pwd):/app -w /app -e CI=true mcr.microsoft.com/playwright:v1.56.1-noble /bin/bash -c 'npm install -g pnpm@9.0.0 && pnpm install --frozen-lockfile && pnpm run build && pnpm exec playwright test --project=chromium'"
|
|
},
|
|
"packageManager": "pnpm@9.0.0",
|
|
"devDependencies": {
|
|
"@playwright/test": "1.56.1",
|
|
"@sveltejs/adapter-auto": "^6.1.0",
|
|
"@sveltejs/kit": "^2.37.0",
|
|
"@sveltejs/vite-plugin-svelte": "^6.1.3",
|
|
"@testing-library/jest-dom": "^6.9.1",
|
|
"@testing-library/svelte": "^5.2.9",
|
|
"@types/node": "^22.12.0",
|
|
"@types/node-cron": "^3.0.11",
|
|
"@vitest/ui": "^4.0.10",
|
|
"jsdom": "^27.2.0",
|
|
"svelte": "^5.38.6",
|
|
"svelte-check": "^4.0.0",
|
|
"tslib": "^2.6.0",
|
|
"typescript": "^5.1.6",
|
|
"vite": "^7.1.3",
|
|
"vitest": "^4.0.10"
|
|
},
|
|
"dependencies": {
|
|
"@auth/sveltekit": "^1.11.1",
|
|
"@sveltejs/adapter-node": "^5.0.0",
|
|
"chart.js": "^4.5.0",
|
|
"cheerio": "1.0.0-rc.12",
|
|
"file-type": "^19.0.0",
|
|
"ioredis": "^5.9.0",
|
|
"mongoose": "^8.0.0",
|
|
"node-cron": "^4.2.1",
|
|
"sharp": "^0.33.0"
|
|
},
|
|
"pnpm": {
|
|
"onlyBuiltDependencies": [
|
|
"esbuild"
|
|
]
|
|
}
|
|
} |