1.2.2 • Published 8 months ago

@nerd-coder/svelte-zod-form v1.2.2

Weekly downloads
-
License
MIT
Repository
github
Last release
8 months ago

🌵 Svelte Zod Form

version license bundlejs codecov

Building forms in Svelte with breeze, using Zod

Example

REPL: Simple login form REPL: Simple login form

Installation

npm i @nerd-coder/svelte-zod-form

How to use

First you need to create a Zod's schema

import { z } from 'zod'

const loginSchema = z.object({
  email: z.string().email(),
  pass: z.string().min(4),
})

Then pass the schema to ZodFormStore:

const form = new ZodFormStore(loginSchema, { onSubmit: (v) => console.log('Submitted values:', v) })

All the field's handler, value will be generated and typed for you:

// We need pull the generated field store out, in order
// to use the Svelte's "auto subscription" feature "$"
const { email_value, email_error, email_dirty, pass_value, pass_error, pass_dirty } = form.stores

Finally, use it in html

<form on:submit|preventDefault={form.triggerSubmit}>
  <fieldset>
    <input
      name="email"
      on:input={form.fields.email.handleChange}
      on:blur={form.fields.email.handleBlur}
      value={$email_value || ''}
      class:invalid={!!$email_error}
      class:valid={!$email_error && !!$email_dirty}
    />
    {#if $email_error}<p>{$email_error}</p>{/if}
  </fieldset>

  <fieldset>
    <input
      name="pass"
      type="password"
      on:input={form.fields.pass.handleChange}
      on:blur={form.fields.pass.handleBlur}
      value={$pass_value || ''}
      class:invalid={!!$pass_error}
      class:valid={!$pass_error && !!$pass_dirty}
    />
    {#if $pass_error}<p>{$pass_error}</p>{/if}
  </fieldset>

  <button type="submit">Sign In</button>
</form>

Configuration

initialValue

  • type: Partial<T>
  • required: false
  • default: undefined

The initial data in the form. Will revert to this value if call form.reset.

const form = new ZodFormStore(schema, {
  initialValue: { email: 'my@email.com' },
  ...
})

onSubmit

  • type: (v: T) => Promise<void | string> | string | void
  • required: true

Async callback to handle submmition of the form. Should return nothing, or an string contain error message

const form = new ZodFormStore(schema, {
  onSubmit: (values) => console.log('Submitted values:', values),
  ...
})

autoSubmitAfter

  • type: number
  • required: false
  • default: undefined

Auto trigger submit when any data changed, after the delay in ms. Passing falsy value (0 or undefined) to disabled.

const form = new ZodFormStore(schema, {
  autoSubmitAfter: 200,
  ...
})

debounceDelay

  • type: number
  • required: false
  • default: undefined

Debounce the value update, in ms. Passing falsy value (0 or undefined) to disabled.

const form = new ZodFormStore(schema, {
  debounceDelay: 200,
  ...
})

debug

  • type: boolean
  • required: false
  • default: false

Print various debug messages.

const form = new ZodFormStore(schema, {
  debug: true,
  ...
})

API

PropTypeDescription
modelReadable<T>Form's data. Will be passed to onSubmit handler
optionsreadonly ICreateFormOptions<T>Form settings. Should not be update
triggerSubmit() => Promise<void>Function to start parsing, validating and submit the form's data
reset() => voidFunction to reset the form to original state.
submittingReadable<boolean>True of submitting the form.
errorReadable<string>Error message returned from onSubmit handler, or custom validation message.
errorsReadable<string[]>Array of string contains all error messages (including fields's errors and error return from onSubmit handler).
dirtyReadable<boolean>Indicate if the form is edited or submitted.
validReadable<boolean>Indicate if the form is valid.
fieldsobjectGenerated fields's functions.
storesobjectGenerated fields's stores.

Generated stores's props

PropTypeDescription
stores.fieldname_valueReadable<T['fieldname']>Readable store holding field's value
stores.fieldname_touchedReadable<boolean>The field have been touched or not
stores.fieldname_dirtyReadable<boolean>The field value been changed or not
stores.fieldname_errorReadable<string>The field validation error message, if any
stores.fieldname_validReadable<boolean>The field value is valid or not

Generated field's functions

PropTypeDescription
fields.fieldname.updateValue(updater: Updater<T['fieldname']>) => voidFunction to update field's value
stores.fieldname.setValue(val: T['fieldname']) => voidFunction to set field's value
stores.fieldname.handleChange(val: unknown) => voidCallback to update field's value
stores.fieldname.handleBlur() => voidCallback to mark field as touched
stores.fieldname.reset() => voidReset field to original state
stores.fieldname.setError(msg: string) => voidManually set field error
stores.fieldname.setTouched(val: boolean) => voidManually set touched state

Features

  • Use Svelte native stores
  • Fast: only update what changed, and you only subscribe to what you need
  • Minimal - only ~1.55Kb in size (gzipped)
  • Build-in validation using Zod
  • TypeScript

Extra

Why the cactus?

> For it resilience

TODO

  • More tests
  • Support Array

Contributions

Any contributions are highly appreciate, please make a pull-request. If you would like to discuses a new feature, please create an issue first.

1.2.0

8 months ago

1.1.0

9 months ago

1.2.2

8 months ago

1.0.4

9 months ago

1.2.1

8 months ago

1.0.3

9 months ago

1.0.2

11 months ago

1.0.1

11 months ago

1.0.0

11 months ago

0.1.0

11 months ago

0.0.15

11 months ago

0.0.14

11 months ago

0.0.13

11 months ago

0.0.12

11 months ago

0.0.11

11 months ago

0.0.10

11 months ago

0.0.9

11 months ago

0.0.8

12 months ago

0.0.7

12 months ago

0.0.6

12 months ago

0.0.5

12 months ago

0.0.4

12 months ago

0.0.3

12 months ago

0.0.2

12 months ago