Skip to content

Commit 39bab45

Browse files
authored
Merge pull request #219 from x0k/remove-send-data
Remove send data
2 parents 3445c16 + 1659d51 commit 39bab45

File tree

8 files changed

+40
-57
lines changed

8 files changed

+40
-57
lines changed

.changeset/brown-boxes-grin.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@sjsf/sveltekit": major
3+
---
4+
5+
Remove `sendData` option from `ValidatedFormData` type

.changeset/ripe-tips-invent.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@sjsf/sveltekit": major
3+
---
4+
5+
Add `updateData` option to `ValidatedFormData` type

examples/sveltekit-starter/src/routes/native-form/+page.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export const load = async () => {
3838
};
3939

4040
export const actions = {
41-
defaults: createAction(
41+
default: createAction(
4242
{
4343
...defaults,
4444
name: "form",

packages/sveltekit/src/lib/client/form.svelte.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,7 @@ function initialFormData<Meta extends SvelteKitFormMeta<any, any, string, any>>(
3434
idPrefix: string
3535
): InitialFormData<Meta['__formValue']> | undefined {
3636
if (isRecord(page.form)) {
37-
const validationData = page.form[meta.name] as
38-
| ValidatedFormData<Meta['__sendData']>
39-
| undefined;
37+
const validationData = page.form[meta.name] as ValidatedFormData | undefined;
4038
if (
4139
validationData !== undefined &&
4240
validationData.idPrefix === idPrefix &&
@@ -75,13 +73,11 @@ export function createSvelteKitForm<
7573
if (!isRecord(page.form)) {
7674
return;
7775
}
78-
const validationData = page.form[meta.name] as
79-
| ValidatedFormData<Meta['__sendData']>
80-
| undefined;
76+
const validationData = page.form[meta.name] as ValidatedFormData | undefined;
8177
if (validationData === undefined || formIdPrefix !== validationData.idPrefix) {
8278
return;
8379
}
84-
if (validationData.sendData) {
80+
if (validationData.updateData) {
8581
form.value = validationData.data;
8682
}
8783
updateErrors(form, validationData.errors);

packages/sveltekit/src/lib/client/meta.ts

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,13 @@ export interface SvelteKitFormMeta<
88
PageData,
99
Name extends FormNameFromActionDataUnion<ActionData>,
1010
FallbackValue,
11-
IFD = InitialFromDataFromPageData<PageData, Name>,
12-
VFD = ValidatedFormDataFromActionDataUnion<ActionData, Name>
11+
IFD = InitialFromDataFromPageData<PageData, Name>
1312
> {
1413
name: Name;
1514
__actionData: ActionData;
1615
__pageData: PageData;
1716
__formValue: FormValueFromInitialFormData<IFD, FallbackValue>;
1817
__sendSchema: SendSchemaFromInitialFormData<IFD>;
19-
__sendData: SendDataFromValidatedFormData<VFD>;
2018
}
2119

2220
const proxy = new Proxy(
@@ -40,21 +38,13 @@ export function createMeta<ActionData, PageData, FallbackValue = SchemaValue>()
4038
}
4139

4240
type FormNameFromActionDataBranch<ActionData> = keyof {
43-
[K in keyof ActionData]: ActionData[K] extends ValidatedFormData<any> ? K : never;
41+
[K in keyof ActionData]: ActionData[K] extends ValidatedFormData ? K : never;
4442
};
4543

4644
type FormNameFromActionDataUnion<ActionData> = ActionData extends any
4745
? FormNameFromActionDataBranch<ActionData>
4846
: never;
4947

50-
type ValidatedFormDataFromActionDataBranch<ActionData, FormName extends keyof ActionData> =
51-
ActionData[FormName] extends ValidatedFormData<any> ? ActionData[FormName] : never;
52-
53-
type ValidatedFormDataFromActionDataUnion<
54-
ActionData,
55-
FormName extends keyof ActionData
56-
> = ActionData extends any ? ValidatedFormDataFromActionDataBranch<ActionData, FormName> : never;
57-
5848
type InitialFromDataFromPageData<PageData, FormName extends PropertyKey> = PageData extends {
5949
[K in FormName]: InitialFormData<any>;
6050
}
@@ -67,7 +57,4 @@ type FormValueFromInitialFormData<IFD, FallbackValue> = unknown extends IFD
6757
? T
6858
: never;
6959

70-
type SendDataFromValidatedFormData<VFD> =
71-
VFD extends ValidatedFormData<infer SendData> ? SendData : false;
72-
7360
type SendSchemaFromInitialFormData<IFD> = IFD extends { schema: Schema } ? true : false;

packages/sveltekit/src/lib/model.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ export type InitialFormData<T = unknown> = SerializableOptionalFormOptions<T> &
4747
uiSchema?: UiSchemaRoot;
4848
};
4949

50-
export interface ValidatedFormData<SendData extends boolean> {
50+
export interface ValidatedFormData {
5151
idPrefix: string;
5252
isValid: boolean;
53-
sendData?: SendData;
54-
data: SendData extends true ? SchemaValue | undefined : undefined;
53+
updateData: boolean;
54+
data: SchemaValue | undefined;
5555
errors: ValidationError[];
5656
}
5757

packages/sveltekit/src/lib/server/server.ts

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import {
3838
type UnknownEntryConverter
3939
} from '../internal/convert-form-data-entry.js';
4040

41-
export interface FormHandlerOptions<SendData extends boolean> extends IdOptions {
41+
export interface FormHandlerOptions extends IdOptions {
4242
schema: Schema;
4343
uiSchema?: UiSchemaRoot;
4444
uiOptionsRegistry?: UiOptionsRegistry;
@@ -48,7 +48,7 @@ export interface FormHandlerOptions<SendData extends boolean> extends IdOptions
4848
createEntryConverter?: Creatable<EntryConverter<FormDataEntryValue>, FormDataConverterOptions>;
4949
convertUnknownEntry?: UnknownEntryConverter;
5050
/** @default false */
51-
sendData?: SendData;
51+
sendData?: boolean | 'withoutClientSideUpdate';
5252
/** By default, handles conversion of `File` */
5353
createReviver?: (formData: FormData) => (key: string, value: any) => any;
5454
}
@@ -62,7 +62,7 @@ function createDefaultReviver(formData: FormData) {
6262
};
6363
}
6464

65-
export function createFormHandler<SendData extends boolean>({
65+
export function createFormHandler({
6666
schema,
6767
uiSchema = {},
6868
uiOptionsRegistry = {},
@@ -73,9 +73,9 @@ export function createFormHandler<SendData extends boolean>({
7373
idSeparator = DEFAULT_ID_SEPARATOR,
7474
idIndexSeparator = DEFAULT_INDEX_SEPARATOR,
7575
idPseudoSeparator = DEFAULT_ID_PSEUDO_SEPARATOR,
76-
sendData,
76+
sendData = false,
7777
createReviver = createDefaultReviver
78-
}: FormHandlerOptions<SendData>) {
78+
}: FormHandlerOptions) {
7979
const validator: Validator = create(createValidator, {
8080
schema,
8181
uiSchema,
@@ -98,13 +98,7 @@ export function createFormHandler<SendData extends boolean>({
9898
return async (
9999
signal: AbortSignal,
100100
formData: FormData
101-
): Promise<
102-
[
103-
ValidatedFormData<SendData>,
104-
FormValue,
105-
(errors: ValidationError[]) => ValidatedFormData<SendData>
106-
]
107-
> => {
101+
): Promise<[ValidatedFormData, FormValue, (errors: ValidationError[]) => ValidatedFormData]> => {
108102
const idPrefix = formData.get(SJSF_ID_PREFIX);
109103
if (typeof idPrefix !== 'string') {
110104
throw new Error(`"${SJSF_ID_PREFIX}" key is missing in FormData or not a string`);
@@ -129,24 +123,25 @@ export function createFormHandler<SendData extends boolean>({
129123
? validator.validateFormValue(schema, data)
130124
: [];
131125
function validated(errors: ValidationError[]) {
126+
const isValid = errors.length === 0
132127
return {
133128
idPrefix: idPrefix as string,
134-
isValid: errors.length === 0,
135-
sendData,
136-
data: (sendData ? data : undefined) as SendData extends true ? FormValue : undefined,
129+
isValid,
130+
data: sendData ? data : undefined,
131+
updateData: !isValid && (sendData === 'withoutClientSideUpdate' ? false : sendData),
137132
errors
138-
} satisfies ValidatedFormData<SendData>;
133+
} satisfies ValidatedFormData;
139134
}
140135
return [validated(errors), data, validated];
141136
};
142137
}
143138

144-
export function isValid<T>(vfd: ValidatedFormData<boolean>, data: unknown): data is T {
139+
export function isValid<T>(vfd: ValidatedFormData, data: unknown): data is T {
145140
return vfd.isValid;
146141
}
147142

148-
type FormRecord<F extends string, SendData extends boolean> = {
149-
[K in F]: ValidatedFormData<SendData>;
143+
type FormRecord<F extends string> = {
144+
[K in F]: ValidatedFormData;
150145
};
151146

152147
interface FormMeta {
@@ -155,11 +150,10 @@ interface FormMeta {
155150

156151
export function createAction<
157152
const F extends string,
158-
const SendData extends boolean,
159153
E extends RequestEvent,
160154
R extends Record<string, any> | void
161155
>(
162-
options: FormHandlerOptions<SendData> & {
156+
options: FormHandlerOptions & {
163157
name: F;
164158
},
165159
userAction: (
@@ -169,26 +163,24 @@ export function createAction<
169163
) => MaybePromise<ValidationError[] | R | void>
170164
) {
171165
const handle = createFormHandler(options);
172-
return async (
173-
event: E
174-
): Promise<(FormRecord<F, SendData> & R) | ActionFailure<FormRecord<F, SendData>>> => {
166+
return async (event: E): Promise<(FormRecord<F> & R) | ActionFailure<FormRecord<F>>> => {
175167
const [form, data, validated] = await handle(
176168
event.request.signal,
177169
await event.request.formData()
178170
);
179171
if (!form.isValid) {
180-
return fail(400, { [options.name]: form } as FormRecord<F, SendData>);
172+
return fail(400, { [options.name]: form } as FormRecord<F>);
181173
}
182174
let result = await userAction(data, event, form);
183175
if (Array.isArray(result)) {
184176
if (result.length > 0) {
185177
return fail(400, {
186178
[options.name]: validated(result)
187-
} as FormRecord<F, SendData>);
179+
} as FormRecord<F>);
188180
} else {
189181
result = undefined;
190182
}
191183
}
192-
return { ...result, [options.name]: form } as FormRecord<F, SendData> & R;
184+
return { ...result, [options.name]: form } as FormRecord<F> & R;
193185
};
194186
}

packages/sveltekit/src/routes/native-form.ssr.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,14 @@ describe.skip('native form SSR', () => {
5858
form: {
5959
idPrefix: 'root',
6060
isValid: false,
61-
sendData: true,
6261
data: 'validated value',
6362
errors: [
6463
{
6564
path: [],
6665
message: 'validation error message'
6766
}
6867
]
69-
} satisfies ValidatedFormData<true>
68+
} satisfies ValidatedFormData
7069
}
7170
});
7271
expect(body).toContain('Schema title');
@@ -91,15 +90,14 @@ describe.skip('native form SSR', () => {
9190
form: {
9291
idPrefix: 'root',
9392
isValid: true,
94-
sendData: true,
9593
data: 'validated value',
9694
errors: [
9795
{
9896
path: [],
9997
message: 'validation error message'
10098
}
10199
]
102-
} satisfies ValidatedFormData<true>
100+
} satisfies ValidatedFormData
103101
}
104102
});
105103
expect(body).toContain('Schema title');

0 commit comments

Comments
 (0)