UNPKG

effector-forms

Version:
1 lines 37.7 kB
{"version":3,"file":"index.mjs","sources":["../src/create-form-unit.ts","../src/field.ts","../src/validation.ts","../src/factory.ts","../src/react-hooks.ts"],"sourcesContent":["import { createStore, createEvent, Domain, Store, Event } from \"effector\"\n\ntype CreateStoreParams<Value> = {\n init: Value\n domain?: Domain\n existing?: Store<Value>\n}\n\nfunction store<Value>(\n { init, domain, existing }: CreateStoreParams<Value>,\n effectorData?: any\n) {\n if (existing) {\n return existing\n }\n return domain\n ? domain.store(init, effectorData)\n : createStore(init, effectorData)\n}\n\ntype CreateEventParams<Value> = {\n domain?: Domain\n existing?: Event<Value>\n}\n\nfunction event<Value>({ domain, existing }: CreateEventParams<Value>) {\n if (existing) {\n return existing\n }\n return domain ? domain.event<Value>() : createEvent<Value>()\n}\n\nexport const createFormUnit = {\n store,\n event,\n}\n","import {\n createStore,\n Domain,\n Event,\n Store,\n combine,\n sample,\n guard,\n merge,\n} from \"effector\"\nimport {\n ValidationError,\n Field,\n FieldData,\n FieldConfig,\n AnyFormValues,\n ValidationEvent,\n AddErrorPayload,\n FieldUnitShape,\n} from \"./types\"\nimport { createCombineValidator } from \"./validation\"\nimport { createFormUnit } from \"./create-form-unit\"\n\n/**\n * @group Factories\n */\nexport function createField(\n fieldName: string,\n fieldConfig: FieldConfig<any>,\n domain?: Domain,\n): Field<any> {\n const initValue = typeof fieldConfig.init === \"function\"\n ? fieldConfig.init()\n : fieldConfig.init\n\n const $value = createFormUnit.store({\n domain,\n existing: fieldConfig.units?.$value,\n init: initValue,\n }, {\n sid: `${fieldName}-$value`\n })\n\n const $errors = createFormUnit.store<ValidationError[]>({\n domain,\n existing: fieldConfig.units?.$errors,\n init: [],\n }, {\n sid: `${fieldName}-$errors`\n })\n\n\n const $firstError = $errors.map(\n (errors) => errors[0] ? errors[0] : null\n )\n\n const $initValue = createFormUnit.store({\n domain,\n existing: fieldConfig.units?.$initValue,\n init: initValue,\n }, {\n sid: `${fieldName}-$initValue`\n })\n\n const $touched = createFormUnit.store({\n domain,\n existing: fieldConfig.units?.$isTouched,\n init: false,\n }, {\n sid: `${fieldName}-$touched`\n })\n\n const $isDirty = combine($value, $initValue,\n (value, initValue) => value !== initValue,\n )\n\n const onChange = createFormUnit.event({\n domain,\n existing: fieldConfig.units?.onChange,\n })\n const onBlur = createFormUnit.event({\n domain,\n existing: fieldConfig.units?.onBlur,\n })\n const changed = createFormUnit.event({\n domain,\n existing: fieldConfig.units?.changed,\n })\n const addError = createFormUnit.event<{\n rule: string\n errorText?: string\n }>({\n domain,\n existing: fieldConfig.units?.addError,\n })\n const validate = createFormUnit.event({\n domain,\n existing: fieldConfig.units?.validate,\n })\n const resetErrors = createFormUnit.event({\n domain,\n existing: fieldConfig.units?.resetErrors,\n })\n const resetValue = createFormUnit.event({\n domain,\n existing: fieldConfig.units?.resetValue,\n })\n const reset = createFormUnit.event({\n domain,\n existing: fieldConfig.units?.reset,\n })\n\n const $isValid = $firstError.map((firstError) => firstError === null)\n const $errorText = $firstError.map(\n (firstError) => firstError?.errorText || \"\"\n )\n\n const $field = combine({\n value: $value,\n errors: $errors,\n firstError: $firstError,\n isValid: $isValid,\n isDirty: $isDirty,\n isTouched: $touched,\n })\n\n const unitShape: FieldUnitShape<any> = {\n value: $value,\n initValue: $initValue,\n isValid: $isValid,\n isDirty: $isDirty,\n touched: $touched,\n errors: $errors,\n firstError: $firstError,\n errorText: $errorText,\n onChange,\n onBlur,\n addError,\n validate,\n reset,\n resetErrors,\n resetValue,\n }\n\n return {\n changed,\n \"name\": fieldName,\n $initValue,\n $value,\n $errors,\n $firstError,\n $errorText,\n $isValid,\n $isDirty,\n \"$isTouched\": $touched,\n $touched,\n \"$field\": $field as Store<FieldData<any>>,\n onChange,\n onBlur,\n addError,\n validate,\n \"set\": onChange,\n reset,\n resetErrors,\n resetValue,\n \"filter\": fieldConfig.filter,\n \"@@unitShape\": () => unitShape,\n }\n}\n\ntype BindValidationParams = {\n form: {\n $values: Store<AnyFormValues>\n submit: Event<void>\n reset: Event<void>\n resetValues: Event<void>\n resetErrors: Event<void>\n addErrors: Event<AddErrorPayload[]>\n validate: Event<void>\n validateOn?: ValidationEvent[]\n }\n field: Field<any>\n fieldConfig: FieldConfig<any>\n}\n\nexport function bindValidation(\n params: BindValidationParams, effectorData?: any\n): void {\n const { form, field, fieldConfig } = params\n const rules = fieldConfig.rules || []\n const formValidationEvents = form.validateOn || [\"submit\"]\n const fieldValidationEvents = fieldConfig.validateOn || []\n\n const {\n $value,\n $errors,\n onBlur,\n changed,\n addError,\n validate,\n resetErrors,\n resetValue,\n reset,\n } = field\n\n const rulesSources = typeof rules === \"function\"\n ? createStore<any[]>([], { sid: `${field.name}-$rulesSources` })\n : combine(\n rules.map(({ source }, i) => {\n const sid = `${field.name}-$rulesSources-${i}`\n return source || createStore(null, { sid })\n })\n )\n\n const validator = createCombineValidator(rules)\n const eventsNames = [...formValidationEvents, ...fieldValidationEvents]\n const validationEvents: Event<{\n fieldValue: any\n form: AnyFormValues\n rulesSources: any[]\n }>[] = []\n\n if (eventsNames.includes(\"submit\")) {\n const validationTrigger = sample({\n source: combine({\n fieldValue: $value,\n form: form.$values,\n rulesSources,\n }),\n clock: form.submit,\n })\n\n validationEvents.push(validationTrigger)\n }\n\n if (eventsNames.includes(\"blur\")) {\n validationEvents.push(sample({\n source: combine({\n fieldValue: $value,\n form: form.$values,\n rulesSources,\n }),\n clock: onBlur,\n }))\n }\n\n if (eventsNames.includes(\"change\")) {\n validationEvents.push(sample({\n source: combine({\n fieldValue: $value,\n form: form.$values,\n rulesSources,\n }),\n clock: merge(\n [changed, resetValue, form.resetValues]\n ),\n }))\n }\n\n validationEvents.push(sample({\n source: combine({\n fieldValue: $value,\n form: form.$values,\n rulesSources,\n }),\n clock: validate,\n }))\n\n validationEvents.push(sample({\n source: combine({\n fieldValue: $value,\n form: form.$values,\n rulesSources,\n }),\n clock: form.validate,\n }))\n\n const addErrorWithValue = sample({\n source: $value,\n clock: addError,\n fn: (value, { rule, errorText }): ValidationError => ({\n rule,\n value,\n errorText,\n }),\n })\n\n const addErrorsWithValue = sample({\n source: $value,\n clock: form.addErrors,\n fn: (value, errors) => ({\n value,\n newErrors: errors,\n })\n })\n\n $errors\n .on(\n validationEvents,\n (_, { form, fieldValue, rulesSources }) => validator(\n fieldValue,\n form,\n rulesSources,\n )\n )\n .on(addErrorWithValue, (errors, newError) => [newError, ...errors])\n .on(addErrorsWithValue, (currErrors, { value, newErrors }) => {\n const matchedErrors: ValidationError[] = []\n\n for (const newError of newErrors) {\n if (newError.field !== field.name) continue\n matchedErrors.push({\n value,\n rule: newError.rule,\n errorText: newError.errorText,\n })\n }\n\n return [...matchedErrors, ...currErrors]\n })\n .reset(resetErrors, form.reset, reset, form.resetErrors)\n\n if (!eventsNames.includes(\"change\")) {\n $errors.reset(changed)\n }\n}\n\ntype BindChangeEventParams = {\n field: Field<any>\n form: {\n setForm: Event<Partial<AnyFormValues>>\n setInitialForm: Event<Partial<AnyFormValues>>\n resetForm: Event<void>\n resetTouched: Event<void>\n resetValues: Event<void>\n }\n}\n\nexport function bindChangeEvent({\n field,\n form,\n}: BindChangeEventParams): void {\n const {\n $value,\n $initValue,\n $touched,\n onChange,\n changed,\n name,\n reset,\n resetValue,\n filter\n } = field\n\n const {\n setForm,\n setInitialForm,\n resetForm,\n resetTouched,\n resetValues\n } = form\n\n const resetValueWithInit = sample({\n source: $initValue,\n clock: merge([\n reset,\n resetValue,\n resetValues,\n resetForm\n ]),\n })\n\n $touched\n .on(changed, () => true)\n .reset(reset, resetForm, resetTouched)\n\n guard({\n source: onChange,\n filter: filter || (() => true),\n target: changed,\n })\n\n $initValue\n .on(setInitialForm, (curr, updateSet) => updateSet.hasOwnProperty(name)\n ? updateSet[name]\n : curr\n )\n\n $value\n .on(changed, (_, value) => value)\n .on(\n [setForm, setInitialForm],\n (curr, updateSet) => updateSet.hasOwnProperty(name)\n ? updateSet[name]\n : curr\n )\n .on(resetValueWithInit, (_, initValue) => initValue)\n}\n","import { Store, combine } from \"effector\"\nimport {\n ValidationError,\n Rule,\n AnyFields,\n RuleResolver,\n} from \"./types\"\n\nexport function createCombineValidator<Value = any, Form = any>(\n rulesOrResolver: Rule<Value, Form, any>[] | RuleResolver<Value, Form>\n) {\n return (\n value: Value,\n form: Form,\n rulesSources?: any[]\n ): ValidationError<Value>[] => {\n\n const errors: ValidationError<Value>[] = []\n const rules = typeof rulesOrResolver === \"function\"\n ? rulesOrResolver(value, form)\n : rulesOrResolver\n\n for (let i = 0; i < rules.length; i++) {\n const rule = rules[i]\n const source = rulesSources ? rulesSources[i] : null\n const result = rule.validator(value, form, source)\n\n if (typeof result === \"boolean\" && !result) {\n errors.push({\n rule: rule.name,\n errorText: rule.errorText,\n value,\n })\n }\n\n if (typeof result === \"object\" && !result.isValid) {\n errors.push({\n rule: rule.name,\n errorText: result.errorText,\n value,\n })\n }\n }\n\n return errors\n }\n}\n\n\nexport function eachValid(fields: AnyFields) {\n const firstErrors: Store<ValidationError | null>[] = []\n\n for (const fieldName in fields) {\n if (!fields.hasOwnProperty(fieldName)) continue\n const { $firstError } = fields[fieldName]\n firstErrors.push($firstError)\n }\n\n const $firstErrors = combine(firstErrors)\n\n return $firstErrors.map((errors) => errors.every(error => error === null))\n}\n","import {\n Event,\n Store,\n combine,\n sample,\n guard,\n createStore,\n} from \"effector\"\nimport {\n AnyFields,\n AnyFormValues,\n FormConfig,\n Form,\n AddErrorPayload,\n FormUnitShape,\n} from \"./types\"\nimport { eachValid } from \"./validation\"\nimport {\n createField,\n bindValidation,\n bindChangeEvent,\n} from \"./field\"\nimport { createFormUnit } from \"./create-form-unit\"\n\nfunction createFormValuesStore(\n fields: AnyFields\n): Store<AnyFormValues> {\n const shape: { [key: string]: Store<any> } = {}\n\n for (const fieldName in fields) {\n if (!fields.hasOwnProperty(fieldName)) continue\n shape[fieldName] = fields[fieldName].$value\n }\n\n return combine(shape)\n}\n\n/**\n * This is the main factory in the library that creates\n * the forms shape according to the given configuration.\n * \n * Do not try to pass a type in the Values generic! Form types are inferred automatically from the passed \"fields\" object\n * \n * @param config - The form configuration object\n * @returns The shape of effector units\n * @example\n * \n * ```ts\n * const form = createForm({\n * fields: {\n * username: {\n * init: \"\",\n * rules: [\n * {\n * name: \"required\",\n * validator: (value: string) => Boolean(value)\n * }\n * ]\n * },\n * bio: {\n * init: \"\",\n * rules: []\n * }\n * },\n * validateOn: [\"change\"],\n * })\n * ```\n * @group Factories\n */\nexport function createForm<Values extends AnyFormValues>(\n config: FormConfig<Values>\n) {\n const {\n filter: $filter,\n domain,\n fields: fieldsConfigs,\n validateOn,\n units,\n } = config\n\n const fields: AnyFields = {}\n\n const dirtyFlagsArr: Store<boolean>[] = []\n const touchedFlagsArr: Store<boolean>[] = []\n\n // create units\n for (const fieldName in fieldsConfigs) {\n if (!fieldsConfigs.hasOwnProperty(fieldName)) continue\n\n const fieldConfig = fieldsConfigs[fieldName]\n const field = createField(fieldName, fieldConfig, domain)\n\n fields[fieldName] = field\n dirtyFlagsArr.push(field.$isDirty)\n touchedFlagsArr.push(field.$touched)\n }\n\n const $form = createFormValuesStore(fields)\n const $eachValid = eachValid(fields)\n const $isFormValid = $filter\n ? combine($eachValid, $filter, (valid, filter) => valid && filter)\n : $eachValid\n const $isDirty = combine(dirtyFlagsArr).map(\n (dirtyFlags) => dirtyFlags.some(Boolean)\n )\n const $touched = combine(touchedFlagsArr).map(\n (touchedFlags) => touchedFlags.some(Boolean)\n )\n\n const $meta = combine({\n isValid: $eachValid,\n isDirty: $isDirty,\n touched: $touched,\n })\n\n const validate = createFormUnit.event<void>({\n domain,\n existing: units?.validate,\n })\n\n const submitForm = createFormUnit.event<void>({\n domain,\n existing: units?.submit,\n })\n\n const formValidated = createFormUnit.event({\n domain,\n existing: units?.formValidated,\n })\n\n const setInitialForm = createFormUnit.event<Partial<AnyFormValues>>({\n domain,\n existing: units?.setInitialForm as Event<Partial<AnyFormValues>>,\n })\n\n const setForm = createFormUnit.event<Partial<AnyFormValues>>({\n domain,\n existing: units?.setForm as Event<Partial<AnyFormValues>>,\n })\n\n const addErrors = createFormUnit.event<AddErrorPayload[]>({\n domain,\n existing: units?.addErrors,\n })\n\n const resetForm = createFormUnit.event({\n domain,\n existing: units?.reset,\n })\n\n const resetValues = createFormUnit.event({\n domain,\n existing: units?.resetValues,\n })\n\n const resetErrors = createFormUnit.event({\n domain,\n existing: units?.resetErrors,\n })\n\n const resetTouched = createFormUnit.event({\n domain,\n existing: units?.resetTouched,\n })\n\n const submitWithFormData = sample({\n source: $form,\n clock: submitForm,\n })\n const validateWithFormData = sample({\n source: $form,\n clock: validate\n })\n\n // bind units\n for (const fieldName in fields) {\n if (!fields.hasOwnProperty(fieldName)) continue\n\n const fieldConfig = fieldsConfigs[fieldName]\n const field = fields[fieldName]\n\n bindChangeEvent({\n form: {\n setForm,\n setInitialForm,\n resetForm,\n resetTouched,\n resetValues\n },\n field,\n })\n bindValidation({\n form: {\n $values: $form,\n submit: submitForm,\n reset: resetForm,\n addErrors,\n resetValues,\n resetErrors,\n validate,\n validateOn,\n },\n fieldConfig,\n field,\n }, { sid: fieldName })\n }\n\n guard({\n source: submitWithFormData as unknown as Event<Values>,\n filter: $isFormValid,\n // TODO: fix\n target: formValidated,\n })\n\n guard({\n source: validateWithFormData as unknown as Event<Values>,\n filter: $isFormValid,\n target: formValidated,\n })\n\n const unitShape: FormUnitShape<any> = {\n isValid: $eachValid,\n isDirty: $isDirty,\n touched: $touched,\n submit: submitForm,\n reset: resetForm,\n addErrors: addErrors,\n validate,\n setForm,\n setInitialForm,\n resetTouched,\n resetValues,\n resetErrors,\n formValidated,\n }\n\n return {\n fields,\n \"$values\": $form,\n $eachValid,\n \"$isValid\": $eachValid,\n \"$isDirty\": $isDirty,\n \"$touched\": $touched,\n $meta,\n \"submit\": submitForm,\n validate,\n resetTouched,\n addErrors,\n \"reset\": resetForm,\n resetValues,\n resetErrors,\n setForm,\n setInitialForm,\n \"set\": setForm,\n formValidated,\n \"@@unitShape\": () => unitShape,\n } as unknown as Form<Values>\n}\n","import { useUnit } from \"effector-react\"\nimport {\n Field,\n ValidationError,\n AnyFormValues,\n Form\n} from \"./types\"\n\ntype ErrorTextMap = {\n [key: string]: string\n}\n\ntype AddErrorPayload = { rule: string; errorText?: string }\n\ntype ConnectedField<Value> = {\n name: string\n value: Value\n errors: ValidationError<Value>[]\n firstError: ValidationError<Value> | null\n hasError: () => boolean\n onChange: (v: Value) => Value\n onBlur: (v: void) => void\n errorText: (map?: ErrorTextMap) => string\n addError: (p: AddErrorPayload) => AddErrorPayload\n validate: (v: void) => void\n isValid: boolean\n isDirty: boolean\n isTouched: boolean\n touched: boolean\n reset: (v: void) => void\n set: (v: Value) => Value\n resetErrors: (v: void) => void\n}\n\ntype ConnectedFields<Values extends AnyFormValues> = {\n [K in keyof Values]: ConnectedField<Values[K]>\n}\n\ntype AnyConnectedFields = {\n [key: string]: ConnectedField<any>\n}\n\n/**\n * @group Hooks\n */\nexport function useField<Value>(field: Field<Value>): ConnectedField<Value> {\n const {\n value,\n errors,\n firstError,\n isValid,\n isDirty,\n isTouched: touched,\n } = useUnit(field.$field)\n\n return {\n name: field.name,\n value,\n errors,\n firstError,\n isValid,\n isDirty,\n touched,\n isTouched: touched,\n onChange: useUnit(field.onChange),\n onBlur: useUnit(field.onBlur),\n addError: useUnit(field.addError),\n validate: useUnit(field.validate),\n reset: useUnit(field.reset),\n set: useUnit(field.onChange),\n resetErrors: useUnit(field.resetErrors),\n hasError: () => {\n return firstError !== null\n },\n errorText: (map) => {\n if (!firstError) {\n return \"\"\n }\n if (!map) {\n return firstError.errorText || \"\"\n }\n if (map[firstError.rule]) {\n return map[firstError.rule]\n }\n return firstError.errorText || \"\"\n }\n }\n\n}\n\ntype Result<Values extends AnyFormValues> = {\n fields: ConnectedFields<Values>\n values: Values\n hasError: (fieldName?: keyof Values) => boolean\n eachValid: boolean\n isValid: boolean\n isDirty: boolean\n isTouched: boolean\n touched: boolean\n errors: (fieldName: keyof Values) => (\n ValidationError<Values[typeof fieldName]>[]\n )\n error: (fieldName: keyof Values) => (\n ValidationError<Values[typeof fieldName]>\n ) | null\n errorText: (fieldName: keyof Values, map?: ErrorTextMap) => string\n submit: (p: void) => void\n reset: (p: void) => void\n setForm: (p: Partial<Values>) => Partial<Values>\n set: (p: Partial<Values>) => Partial<Values>\n formValidated: (p: Values) => Values\n}\n\n/**\n * @group Hooks\n */\nexport function useForm<Values extends AnyFormValues>(\n form: Form<Values>\n): Result<Values> {\n const connectedFields = {} as AnyConnectedFields\n const values = {} as AnyFormValues\n\n for (const fieldName in form.fields) {\n if (!form.fields.hasOwnProperty(fieldName)) continue\n const field = form.fields[fieldName]\n const connectedField = useField(field)\n connectedFields[fieldName] = connectedField\n values[fieldName] = connectedField.value\n }\n\n const {\n isValid: eachValid,\n isDirty,\n touched,\n } = useUnit(form.$meta)\n\n\n const hasError = (fieldName?: string): boolean => {\n if (!fieldName) {\n return !eachValid\n }\n if (connectedFields[fieldName]) {\n return Boolean(connectedFields[fieldName].firstError)\n }\n return false\n }\n\n const error = (fieldName: string) => {\n if (connectedFields[fieldName]) {\n return connectedFields[fieldName].firstError\n }\n return null\n }\n\n const errors = (fieldName: string) => {\n if (connectedFields[fieldName]) {\n return connectedFields[fieldName].errors\n }\n return []\n }\n\n const errorText = (fieldName: string, map?: ErrorTextMap) => {\n const field = connectedFields[fieldName]\n if (!field) {\n return \"\"\n }\n if (!field.firstError) {\n return \"\"\n }\n if (!map) {\n return field.firstError.errorText || \"\"\n }\n if (map[field.firstError.rule]) {\n return map[field.firstError.rule]\n }\n return field.firstError.errorText || \"\"\n }\n\n return {\n fields: connectedFields as ConnectedFields<Values>,\n values,\n hasError,\n eachValid,\n isValid: eachValid,\n isDirty,\n isTouched: touched,\n touched,\n errors,\n error,\n errorText,\n reset: useUnit(form.reset),\n submit: useUnit(form.submit),\n setForm: useUnit(form.setForm),\n set: useUnit(form.setForm), // set form alias\n formValidated: useUnit(form.formValidated),\n } as Result<Values>\n}\n"],"names":["createFormUnit","store","init","domain","existing","effectorData","and","sid","createStore","event","createEvent","createField","fieldName","fieldConfig","_fieldConfig$units","_fieldConfig$units2","_fieldConfig$units3","_fieldConfig$units4","_fieldConfig$units5","_fieldConfig$units6","_fieldConfig$units7","_fieldConfig$units8","_fieldConfig$units9","_fieldConfig$units10","_fieldConfig$units11","_fieldConfig$units12","initValue","$value","units","name","$errors","$firstError","map","errors","$initValue","$touched","$isTouched","$isDirty","combine","value","or","onChange","onBlur","changed","addError","validate","resetErrors","resetValue","reset","$isValid","firstError","$errorText","errorText","$field","isValid","isDirty","isTouched","unitShape","touched","set","filter","bindValidation","params","form","field","rules","formValidationEvents","validateOn","fieldValidationEvents","rulesSources","source","i","validator","rulesOrResolver","length","rule","result","push","eventsNames","validationEvents","includes","validationTrigger","sample","fieldValue","$values","clock","submit","merge","resetValues","addErrorWithValue","fn","addErrorsWithValue","addErrors","newErrors","on","_","newError","currErrors","matchedErrors","bindChangeEvent","setForm","setInitialForm","resetForm","resetTouched","resetValueWithInit","guard","target","curr","updateSet","hasOwnProperty","createForm","config","$filter","fields","fieldsConfigs","dirtyFlagsArr","touchedFlagsArr","$form","shape","createFormValuesStore","$eachValid","firstErrors","every","error","eachValid","$isFormValid","valid","dirtyFlags","some","Boolean","touchedFlags","$meta","submitForm","formValidated","submitWithFormData","validateWithFormData","useField","useUnit","hasError","useForm","connectedFields","values","connectedField"],"mappings":"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"}