From b78f99e808cdb24bb554f9bd87b6f5110ea51d60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 19 Apr 2025 01:13:41 +0200 Subject: [PATCH] Form work --- .../extension-form/src/internal/FormField.ts | 15 +++++++++++---- packages/extension-form/src/internal/Formify.ts | 16 +++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/packages/extension-form/src/internal/FormField.ts b/packages/extension-form/src/internal/FormField.ts index 759b563..f33818f 100644 --- a/packages/extension-form/src/internal/FormField.ts +++ b/packages/extension-form/src/internal/FormField.ts @@ -35,12 +35,19 @@ export interface ArrayFormField< readonly elements: readonly Formify.Formify[] } -export interface StructFormField< +export type StructFormField< S extends Schema.Struct, Fields extends Schema.Struct.Fields, -> extends FormField { - readonly fields: { readonly [K in keyof Fields]: Formify.Formify } -} +> = ( + & FormField + & { readonly fields: { readonly [K in keyof Fields]: Formify.Formify } } + & { + [K in keyof Fields as Fields[K] extends + Schema.tag ? K : never + ]: Fields[K] extends + Schema.tag ? Tag : never + } +) export interface GenericFormField extends FormField { readonly value: S["Type"] diff --git a/packages/extension-form/src/internal/Formify.ts b/packages/extension-form/src/internal/Formify.ts index 79a9254..77a4bd1 100644 --- a/packages/extension-form/src/internal/Formify.ts +++ b/packages/extension-form/src/internal/Formify.ts @@ -22,7 +22,7 @@ export type Formify = ( ) -const LoginForm = Schema.Union( +const Login = Schema.Union( Schema.Struct({ _tag: Schema.tag("ByEmail"), email: Schema.String, @@ -34,12 +34,18 @@ const LoginForm = Schema.Union( phone: Schema.String, password: Schema.RedactedFromSelf(Schema.String), }), -) -type LoginFormTree = Formify -declare const loginFormTree: LoginFormTree -switch (loginFormTree.member.fields._tag.value) { + Schema.TaggedStruct("ByKey", { + id: Schema.String, + password: Schema.RedactedFromSelf(Schema.String), + }), +) +type LoginForm = Formify +declare const loginForm: LoginForm + +switch (loginForm.member._tag) { case "ByEmail": + loginForm.member break case "ByPhone": break