Skip to content

Commit 5b971db

Browse files
committed
fix: update zod dependency version and simplify schema validations in forms
1 parent a85cacd commit 5b971db

11 files changed

Lines changed: 51 additions & 100 deletions

File tree

bun.lock

Lines changed: 4 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,6 @@
4141
},
4242
"dependencies": {
4343
"lucide-svelte": "^0.515.0",
44-
"zod": "^3.25.71"
44+
"zod": "3.25.67"
4545
}
4646
}

src/lib/schemas/admin.ts

Lines changed: 3 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,11 @@
11
import { z } from 'zod';
22

3-
// Category schema
3+
// Simple category schema for forms
44
export const categorySchema = z.object({
5-
name: z
6-
.string()
7-
.min(1, 'Category name is required')
8-
.max(100, 'Category name must be 100 characters or less'),
9-
description: z.string().max(500, 'Description must be 500 characters or less'),
10-
parentId: z.string().optional()
11-
});
12-
13-
export const updateCategorySchema = categorySchema
14-
.extend({
15-
name: z
16-
.string()
17-
.min(1, 'Category name is required')
18-
.max(100, 'Category name must be 100 characters or less'),
19-
description: z.string().max(500, 'Description must be 500 characters or less').optional(),
20-
parentId: z.string()
21-
})
22-
.partial()
23-
.refine((data) => {
24-
// Ensure at least one field is provided for update
25-
return data.name || data.description || data.parentId !== undefined;
26-
});
27-
28-
// Discount schema
29-
export const discountSchema = z.object({
30-
code: z
31-
.string()
32-
.min(1, 'Discount code is required')
33-
.transform((val) => val.toUpperCase()),
5+
name: z.string().min(1, 'Category name is required').max(100),
346
description: z.string().optional(),
35-
type: z.enum(['percentage', 'fixed'], { required_error: 'Discount type is required' }),
36-
method: z.enum(['basket', 'product'], { required_error: 'Discount method is required' }),
37-
value: z.number().min(0, 'Value must be 0 or greater'),
38-
minimumOrderAmount: z.number().min(0, 'Minimum order amount must be 0 or greater').optional(),
39-
usageLimit: z.number().int().min(1, 'Usage limit must be at least 1').optional(),
40-
expiresAt: z.string().optional(),
41-
isActive: z.boolean().default(true)
42-
});
43-
44-
// Currency schema
45-
export const currencySchema = z.object({
46-
code: z
47-
.string()
48-
.min(3, 'Currency code must be 3 characters')
49-
.max(3, 'Currency code must be 3 characters')
50-
.transform((val) => val.toUpperCase()),
51-
name: z.string().min(1, 'Currency name is required'),
52-
symbol: z.string().min(1, 'Currency symbol is required'),
53-
exchangeRate: z.number().min(0.000001, 'Exchange rate must be greater than 0'),
54-
isEnabled: z.boolean().default(true)
7+
parentId: z.string().optional()
558
});
569

5710
// Type exports for use in components
5811
export type CategoryValidation = z.infer<typeof categorySchema>;
59-
export type DiscountValidation = z.infer<typeof discountSchema>;
60-
export type CurrencyValidation = z.infer<typeof currencySchema>;

src/lib/schemas/product.schema.ts

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,27 @@
11
import { z } from 'zod';
22

3-
// Product variant schema
3+
// Product variant schema for form validation (simplified)
44
export const productVariantSchema = z.object({
55
sku: z.string().min(1, 'SKU is required'),
6-
price: z.number().min(1, 'Price must be 0 or greater'),
6+
price: z.number().min(0, 'Price must be 0 or greater'),
77
stock: z.number().int().min(0, 'Stock must be 0 or greater'),
88
weight: z.number().min(0, 'Weight must be 0 or greater').optional(),
9-
attributes: z.record(z.string(), z.string()).default({}),
10-
images: z.array(z.string().url('Invalid image URL')).default([]),
11-
isDefault: z.boolean().default(false)
9+
attributes: z.record(z.string(), z.string()),
10+
images: z.array(z.string()),
11+
isDefault: z.boolean()
1212
});
1313

14-
// Product schema (requires at least one variant)
14+
// Product schema for form validation (simplified)
1515
export const productSchema = z.object({
1616
name: z.string().min(1, 'Product name is required'),
17-
description: z.string().optional(),
17+
description: z.string(),
1818
currency: z.string().min(3, 'Currency is required').max(3, 'Currency must be 3 characters'),
1919
categoryId: z.string().min(1, 'Category ID is required'),
20-
images: z.array(z.string().url('Invalid image URL')).default([]),
21-
isActive: z.boolean().default(true),
20+
images: z.array(z.string()),
21+
isActive: z.boolean(),
2222
variants: z.array(productVariantSchema).min(1, 'At least one variant is required')
2323
});
2424

25-
export const updateProductSchema = productSchema.partial().extend({
26-
variants: z.array(productVariantSchema).optional()
27-
});
28-
29-
export const updateProductVariantSchema = productVariantSchema.partial();
30-
31-
export type ProductVariantSchema = z.infer<typeof productVariantSchema>;
32-
export type ProductSchema = z.infer<typeof productSchema>;
33-
34-
export type UpdateProductSchema = z.infer<typeof updateProductSchema>;
35-
export type UpdateProductVariantSchema = z.infer<typeof updateProductVariantSchema>;
25+
// Type exports
26+
export type ProductVariantSchema = typeof productVariantSchema;
27+
export type ProductSchema = typeof productSchema;

src/routes/admin/products/[id]/+page.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
TableHeader,
1111
TableRow
1212
} from '$lib/components/ui/table';
13-
import { ArrowLeft, Edit, Eye, Package } from 'lucide-svelte';
13+
import { ArrowLeft, Edit, Eye } from 'lucide-svelte';
1414
import { formatCurrency, getStockStatus } from '$lib';
1515
1616
let { data } = $props();

src/routes/admin/products/[id]/edit/+page.server.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,8 @@ import type { Actions } from '@sveltejs/kit';
22
import { fail, redirect } from '@sveltejs/kit';
33
import { superValidate } from 'sveltekit-superforms';
44
import { zod } from 'sveltekit-superforms/adapters';
5-
import {
6-
productSchema,
7-
productVariantSchema,
8-
updateProductSchema
9-
} from '$lib/schemas/product.schema';
5+
import { productSchema, productVariantSchema } from '$lib/schemas/product.schema';
6+
import type { CreateProductVariantInput } from '$lib/types/product.js';
107

118
export const load = async ({ params, locals }) => {
129
const productId = params.id;
@@ -94,7 +91,7 @@ export const actions: Actions = {
9491
}
9592

9693
const { commercify } = locals;
97-
const form = await superValidate(request, zod(updateProductSchema));
94+
const form = await superValidate(request, zod(productSchema));
9895

9996
if (!form.valid) {
10097
return fail(400, { form });
@@ -153,7 +150,17 @@ export const actions: Actions = {
153150
}
154151
console.log('Adding product variant with data:', form.data);
155152

156-
const result = await commercify.addProductVariant(productId, form.data);
153+
const input: CreateProductVariantInput = {
154+
sku: form.data.sku,
155+
price: form.data.price,
156+
stock: form.data.stock || 0,
157+
weight: form.data.weight || 0,
158+
attributes: form.data.attributes || {},
159+
images: form.data.images || [],
160+
isDefault: form.data.isDefault || false
161+
};
162+
163+
const result = await commercify.addProductVariant(productId, input);
157164
if (!result.success) {
158165
console.error('Error adding product variant:', result.error);
159166
return fail(400, {

src/routes/admin/products/[id]/edit/+page.svelte

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
import { Checkbox } from '$lib/components/ui/checkbox';
1111
import { productSchema, type ProductSchema } from '$lib/schemas/product.schema';
1212
import { toast } from 'svelte-sonner';
13-
import SuperDebug, { superForm, type SuperValidated } from 'sveltekit-superforms';
14-
import { zodClient } from 'sveltekit-superforms/adapters';
13+
import { superForm, type SuperValidated } from 'sveltekit-superforms';
14+
import { zodClient, type Infer } from 'sveltekit-superforms/adapters';
1515
import { generateSKU } from '$lib/utils/admin';
1616
import { ArrowLeft, Save, Plus, Trash2, Wand2, Upload, X, Settings } from 'lucide-svelte';
1717
import { cn } from '$lib/utils';
@@ -21,7 +21,7 @@
2121
data
2222
}: {
2323
data: {
24-
form: SuperValidated<ProductSchema>;
24+
form: SuperValidated<Infer<ProductSchema>>;
2525
currencies: Currency[];
2626
categories: Category[];
2727
product: any;
@@ -106,14 +106,14 @@
106106
const url = prompt('Enter image URL:');
107107
if (url && url.trim()) {
108108
$formData.variants[variantIndex].images = [
109-
...$formData.variants[variantIndex].images,
109+
...($formData.variants[variantIndex].images || []),
110110
url.trim()
111111
];
112112
}
113113
}
114114
115115
function removeImageFromVariant(variantIndex: number, imageIndex: number) {
116-
$formData.variants[variantIndex].images = $formData.variants[variantIndex].images.filter(
116+
$formData.variants[variantIndex].images = $formData.variants[variantIndex].images?.filter(
117117
(_, i) => i !== imageIndex
118118
);
119119
}

src/routes/admin/products/categories/+page.svelte

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<script lang="ts">
2-
import { page } from '$app/stores';
32
import { enhance } from '$app/forms';
43
import { invalidateAll } from '$app/navigation';
54
import { Button } from '$lib/components/ui/button';

src/routes/admin/products/categories/[id]/edit/+page.server.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { redirect, error } from '@sveltejs/kit';
22
import type { PageServerLoad, Actions } from './$types';
33
import { fail } from '@sveltejs/kit';
4-
import { categorySchema, updateCategorySchema } from '$lib/schemas/admin';
4+
import { categorySchema } from '$lib/schemas/admin';
55
import { zod } from 'sveltekit-superforms/adapters';
66
import { superValidate } from 'sveltekit-superforms';
77

@@ -31,7 +31,7 @@ export const load: PageServerLoad = async ({ params, locals }) => {
3131
description: category.description || '',
3232
parentId: category.parentId?.toString()
3333
},
34-
zod(updateCategorySchema)
34+
zod(categorySchema)
3535
);
3636

3737
return {
@@ -46,7 +46,7 @@ export const actions: Actions = {
4646
const { commercify } = locals;
4747

4848
const categoryId = params.id;
49-
const form = await superValidate(request, zod(updateCategorySchema));
49+
const form = await superValidate(request, zod(categorySchema));
5050

5151
if (!form.valid) {
5252
return fail(400, { form });

src/routes/admin/products/categories/[id]/edit/+page.svelte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<script lang="ts">
22
import { superForm } from 'sveltekit-superforms';
33
import { zodClient } from 'sveltekit-superforms/adapters';
4-
import { updateCategorySchema } from '$lib/schemas/admin';
54
import { Button } from '$lib/components/ui/button';
65
import {
76
Card,
@@ -15,11 +14,12 @@
1514
import * as Form from '$lib/components/ui/form';
1615
import * as Select from '$lib/components/ui/select';
1716
import { ArrowLeft, Save } from 'lucide-svelte';
17+
import { categorySchema } from '$lib/schemas/admin.js';
1818
1919
let { data } = $props();
2020
2121
const form = superForm(data.form, {
22-
validators: zodClient(updateCategorySchema)
22+
validators: zodClient(categorySchema)
2323
});
2424
2525
const { form: formData, enhance } = form;

0 commit comments

Comments
 (0)