Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 96 commits into from
Feb 21, 2025

Conversation

crutchcorn
Copy link
Member

@crutchcorn crutchcorn commented Jan 9, 2025

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

Copy link

nx-cloud bot commented Jan 9, 2025

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
Copy link

pkg-pr-new bot commented Jan 9, 2025

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
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
Copy link
Member

@Balastrong Balastrong left a comment

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
7 of 8 checks passed
@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
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Update TanStack Start adapter
3 participants