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