Skip to content

[FEAT] Allow returning anything in a validator, not just a string - #1104

Merged
crutchcorn merged 96 commits into
mainfrom
return-anything-not-just-string
Feb 21, 2025
Merged

crutchcorn merged 96 commits into
mainfrom
return-anything-not-just-string

Conversation

@crutchcorn

@crutchcorn crutchcorn commented Jan 9, 2025 •

Copy link
Copy Markdown
Member

This PR allows you to return non-string values from validators:

<form.Field name="password" validators={{onChange: () => ({hasUppercase: false, hasLowercase: true}) }} />

In addition, it also enforces type safety on the returned value on both errorMap and the errors array:

const form = new FormApi({
  defaultValues: {
    name: 'test',
  },
} as const)

const field = new FieldApi({
  form,
  name: 'name',
  validators: {
    onChange: () => {
      return 123 as const
    },
  },
})

assertType<123 | undefined>(field.state.meta.errorMap.onChange)

assertType<Array<123 | undefined>>(field.state.meta.errors)

Breaking Changes

  • Removes all validatorAdapters (packages, code, and props alike)
    • Instead, you can use our Standard Schema support for Valibot, Zod, and ArkType
    • As a result, however, Yup is no longer supported until this community PR is merged
  • When using Standard Schema validators:
    • form.errors is now Record<string, StandardSchemaIssue[]>
    • field.errors is now StandardSchemaIssue[] (flattened)
  • Vue 3.4 is the new minimum version
  • Vue JSX usage no longer works (fixes SFC usage)
  • TanStack Start adapter API changed (fixes Update TanStack Start adapter #1023)

TODO

  • Fix Start adapter
  • Think about how to handle schema validators' return types
  • Fix standard schema types
  • Fix adapters
    • vue-form
    • solid-form
    • react-form
    • lit-form
    • angular-form
  • Docs highlights of non-string returns
  • Docs mention of error array handling
  • Docs update for TanStack Start adapter
  • Docs updates for validations and errors

Future work

  • Add standard schema validation for SSR adapters
  • Add examples for standard schema for other libraries

@crutchcorn crutchcorn added the type: enhancement This requests an enhancement to existing behaviour. label Jan 9, 2025
@crutchcorn
crutchcorn requested a review from fulopkovacs January 9, 2025 08:43
@nx-cloud

nx-cloud Bot commented Jan 9, 2025 •

Copy link
Copy Markdown

View your CI Pipeline Execution ↗ for commit b6de203.

Command Status Duration Result
nx affected --targets=test:sherif,test:knip,tes... ✅ Succeeded 1m 29s View ↗
nx run-many --target=build --exclude=examples/** ✅ Succeeded <1s View ↗

☁️ Nx Cloud last updated this comment at 2025-02-21 03:23:36 UTC

@crutchcorn crutchcorn changed the title [FIX] Allow returning anything in a validator, not just a string [WIP] [FIX] Allow returning anything in a validator, not just a string Jan 9, 2025
@crutchcorn
crutchcorn marked this pull request as draft January 9, 2025 08:56
@pkg-pr-new

pkg-pr-new Bot commented Jan 9, 2025 •

Copy link
Copy Markdown

Open in Stackblitz

More templates

@tanstack/angular-form

npm i https://pkg.pr.new/@tanstack/angular-form@1104

@tanstack/form-core

npm i https://pkg.pr.new/@tanstack/form-core@1104

@tanstack/react-form

npm i https://pkg.pr.new/@tanstack/react-form@1104

@tanstack/lit-form

npm i https://pkg.pr.new/@tanstack/lit-form@1104

@tanstack/solid-form

npm i https://pkg.pr.new/@tanstack/solid-form@1104

@tanstack/vue-form

npm i https://pkg.pr.new/@tanstack/vue-form@1104

commit: b6de203

@crutchcorn crutchcorn changed the title [WIP] [FIX] Allow returning anything in a validator, not just a string [WIP] [FEAT] Allow returning anything in a validator, not just a string Jan 10, 2025
@Balastrong Balastrong mentioned this pull request Feb 20, 2025
2 tasks done
crutchcorn and others added 6 commits February 20, 2025 17:44
# Conflicts:
#	docs/reference/functions/mergeform.md
#	examples/angular/valibot/package.json
#	examples/angular/yup/package.json
#	examples/angular/zod/package.json
#	examples/react/query-integration/package.json
#	examples/react/standard-schema/package.json
#	examples/react/tanstack-start/package.json
#	examples/react/ui-libraries/package.json
#	examples/react/valibot/package.json
#	examples/react/yup/package.json
#	examples/react/zod/package.json
#	examples/solid/array/package.json
#	examples/solid/simple/package.json
#	examples/solid/valibot/package.json
#	examples/solid/yup/package.json
#	examples/solid/zod/package.json
#	examples/vue/array/package.json
#	examples/vue/simple/package.json
#	examples/vue/valibot/package.json
#	examples/vue/yup/package.json
#	examples/vue/zod/package.json
#	packages/valibot-form-adapter/package.json
#	packages/yup-form-adapter/package.json
#	packages/zod-form-adapter/package.json
#	pnpm-lock.yaml
@crutchcorn crutchcorn changed the title [WIP] [FEAT] Allow returning anything in a validator, not just a string [FEAT] Allow returning anything in a validator, not just a string Feb 21, 2025
@crutchcorn
crutchcorn marked this pull request as ready for review February 21, 2025 02:50

@Balastrong Balastrong left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's do it! 🚀

@crutchcorn
crutchcorn merged commit d8ed149 into main Feb 21, 2025
@crutchcorn
crutchcorn deleted the return-anything-not-just-string branch February 21, 2025 11:06
harry-whorlow pushed a commit to harry-whorlow/form that referenced this pull request Feb 21, 2025
* chore: WIP adding in inferencing to validator's return type

* chore: more work on fixing types

* chore: wip on things more

* chore: fix issues with FormApi and FieldApi

* chore: add more fields to infer

* chore: change typed from unknown to undefined

* chore: more fixes

* chore: add some new type tests

* chore: add more type tests

* ci: apply automated fixes and generate docs

* chore: migrate React components to use new prop types

* chore: move useTransform hook to new types

* chore: add convinience type for AnyFormAPI and AnyFieldAPI

* ci: apply automated fixes and generate docs

* chore: fix NextJS and Remix adapters

* chore: fix build of Start adapter

* ci: apply automated fixes and generate docs

* ci: apply automated fixes and generate docs

* chore: fix issues with Nx on Windows

* chore: fix issues with FieldAny in examples

* chore: upgrade React packages to stable

* chore: WIP attempt to fix Start package

* chore: fix mergeForm typing

* ci: apply automated fixes and generate docs

* chore: migrate Angular adapter to use new API

* ci: apply automated fixes and generate docs

* chore: migrate Lit adapter to new generics

* ci: apply automated fixes and generate docs

* chore: attempt 1 at fixing Vue's types

* chore: fix Vue types for JSX and Vue SFCs alike

* chore: migrate Vue type to use new generics

* chore: fix Vue test types

* chore: fix Vue examples

* ci: apply automated fixes and generate docs

* chore: migrate Solid to new generics system

* chore: fix Solid examples

* ci: apply automated fixes and generate docs

* ci: apply automated fixes and generate docs (attempt 2/3)

* chore: fix issues with Solid library

* chore: fix knip

* chore: fix issues with error casting

* chore: fix issue with ESLint

* docs: show errorMap and errorarray

* chore: upgrade all deps

* ci: apply automated fixes and generate docs

* ci: apply automated fixes and generate docs

* chore: address PR feedback

* ci: apply automated fixes and generate docs

* chore: fix build

* ci: apply automated fixes and generate docs

* chore: infer from SchemaV1

* ci: apply automated fixes and generate docs

* chore: fix zod form adapter test

* fix: legacy validators now work as intended for fields and onChange only

* Revert "fix: legacy validators now work as intended for fields and onChange only"

This reverts commit 266ea98.

* chore: wip migrate field away from return type to validator fn inferrencing

* chore: wip handle updating meta props

* chore: noinfer nothing

* chore: other cleanup on the API idea

* chore: revert adapter typing fix attempts

* chore: delete all form adapter codebases

* chore: remove now deleted packages from package.json

* chore: remove Yup examples

Yup does not yet support Standard Schema, so we're dropping support until it does

* feat: make standard schema return Issue objects, not a single string, add `disableErrorFlat` option, remove validators props

* chore: fix adapters types

* chore: remove old Zod and Valibot examples

Now we simply support standard schema

* chore: fix CI

* ci: apply automated fixes and generate docs

* chore: wip fixing issues with return types

* chore: WIP refactor return types

TODO: Refactor form adapters

* chore: add failing tests for `fields` type errors

* chore: fix edgecase with "fields" return type

* chore: fix standard schema typing edgecase

* ci: apply automated fixes and generate docs

* chore: fix Angular adapter's types

* ci: apply automated fixes and generate docs

* chore: fix Lit adapter

* ci: apply automated fixes and generate docs

* chore: fix react form types, add Standard Schema support to SSR adapters

* chore: fix typing problems with errors array

* chore: fix TS types for solid

* chore: fix Vue TS types

* chore: fix CI

* ci: apply automated fixes and generate docs

* docs: remove validatorAdapter mentions

* ci: apply automated fixes and generate docs

* docs: improve TanStack Start docs

* chore: fix build artifacts

* ci: apply automated fixes and generate docs

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type: enhancement This requests an enhancement to existing behaviour.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update TanStack Start adapter

3 participants