Skip to content

Commit ff0db74

Browse files
committed
Fixes #208, posting of native enums.
1 parent 41dc3ce commit ff0db74

File tree

6 files changed

+134
-0
lines changed

6 files changed

+134
-0
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ Headlines: Added, Changed, Deprecated, Removed, Fixed, Security
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [Unreleased]
9+
10+
### Fixed
11+
12+
- Native string enums weren't working when posting the actual string value.
13+
814
## [1.1.2] - 2023-06-24
915

1016
### Added

src/lib/superValidate.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,12 @@ function formDataToValidation<T extends AnyZodObject>(
146146
return newValue;
147147
}
148148

149+
/*
150+
console.log(
151+
`FormData field "${field}" (${zodType._def.typeName}): ${value}`
152+
);
153+
*/
154+
149155
if (zodType._def.typeName == 'ZodString') {
150156
return value;
151157
} else if (zodType._def.typeName == 'ZodNumber') {
@@ -184,10 +190,16 @@ function formDataToValidation<T extends AnyZodObject>(
184190
return value;
185191
} else if (zodType._def.typeName == 'ZodNativeEnum') {
186192
const zodEnum = zodType as ZodNativeEnum<EnumLike>;
193+
187194
if (value !== null && value in zodEnum.enum) {
188195
const enumValue = zodEnum.enum[value];
189196
if (typeof enumValue === 'number') return enumValue;
190197
else if (enumValue in zodEnum.enum) return zodEnum.enum[enumValue];
198+
} else if (
199+
value !== null &&
200+
Object.values(zodEnum.enum).includes(value)
201+
) {
202+
return value;
191203
}
192204
return undefined;
193205
} else if (zodType._def.typeName == 'ZodSymbol') {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import type { Actions, PageServerLoad } from './$types';
2+
import { message, superValidate } from '$lib/server';
3+
import { fail } from '@sveltejs/kit';
4+
import { z } from 'zod';
5+
import { UserType, NumberType } from './UserType';
6+
7+
const schema = z.object({
8+
type: z.nativeEnum(UserType),
9+
number: z.nativeEnum(NumberType)
10+
});
11+
12+
///// Load //////////////////////////////////////////////////////////
13+
14+
export const load: PageServerLoad = async () => {
15+
const form = await superValidate(schema);
16+
return { form };
17+
};
18+
19+
///// Form actions //////////////////////////////////////////////////
20+
21+
export const actions: Actions = {
22+
default: async ({ request }) => {
23+
const formData = await request.formData();
24+
console.log(
25+
'🚀 ~ file: +page.server.ts:25 ~ default: ~ formData:',
26+
formData
27+
);
28+
const form = await superValidate(formData, schema);
29+
30+
console.log('POST', form);
31+
32+
if (!form.valid) return fail(400, { form });
33+
34+
return message(form, form.data.type + ' posted ' + form.data.number);
35+
}
36+
};
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<script lang="ts">
2+
import { superForm } from '$lib/client';
3+
import type { PageData } from './$types';
4+
import SuperDebug from '$lib/client/SuperDebug.svelte';
5+
import { page } from '$app/stores';
6+
import { UserType, NumberType } from './UserType';
7+
8+
export let data: PageData;
9+
10+
const { form, errors, message, enhance } = superForm(data.form);
11+
</script>
12+
13+
<h3>Native string enums</h3>
14+
15+
{#if $message}
16+
<div
17+
class="status"
18+
class:error={$page.status >= 400}
19+
class:success={$page.status == 200}
20+
>
21+
{$message}
22+
</div>
23+
{/if}
24+
25+
<form method="POST" use:enhance>
26+
<label>
27+
Type<br />
28+
<select bind:value={$form.type} name="type">
29+
<option value={UserType.WORKER}>{UserType.WORKER}</option>
30+
<option value={UserType.MANAGER}>{UserType.MANAGER}</option>
31+
</select>
32+
</label>
33+
34+
<label>
35+
Number<br />
36+
<select bind:value={$form.number} name="number">
37+
<option value={NumberType.WORKER}>{NumberType.WORKER}</option>
38+
<option value={NumberType.MANAGER}>{NumberType.MANAGER}</option>
39+
</select>
40+
</label>
41+
42+
<button>Submit</button>
43+
</form>
44+
45+
<style>
46+
.status {
47+
color: white;
48+
padding: 4px;
49+
padding-left: 8px;
50+
border-radius: 2px;
51+
font-weight: 500;
52+
}
53+
54+
.status.success {
55+
background-color: seagreen;
56+
}
57+
58+
.status.error {
59+
background-color: #ff2a02;
60+
}
61+
62+
form {
63+
padding-top: 1rem;
64+
padding-bottom: 1rem;
65+
}
66+
</style>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export enum UserType {
2+
WORKER = 'worker',
3+
MANAGER = 'manager'
4+
}
5+
6+
export enum NumberType {
7+
WORKER = 1,
8+
MANAGER = 10
9+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { z } from 'zod';
2+
3+
export const schema = z.object({
4+
name: z.string().min(1)
5+
});

0 commit comments

Comments
 (0)