Form validation

Validate form data with validate(obj, rules) — no validator.js, no extra dependencies. Rules can be a RegExp (tests String(value)) or a function (value) => boolean.

Result shape

  • Valid: { valid: true, errors: {} }
  • Invalid: { valid: false, errors: { fieldName: false, ... } } for each field that failed.

Basic usage

import { validate, RX_EMAIL, isNumber } from 'helping-js/preset/form';

const result = validate(
  { email: 'user@example.com', age: 25 },
  { email: RX_EMAIL, age: isNumber }
);
if (!result.valid) {
  console.log('Errors:', result.errors); // e.g. { age: false }
}

Or use subpaths and build your own rules:

import { validate } from 'helping-js/core/validate';
import { RX_EMAIL, RX_PHONE } from 'helping-js/core/regex';
import { isString, isNumber } from 'helping-js/core/types';

const result = validate(
  { email, phone, age },
  { email: RX_EMAIL, phone: RX_PHONE, age: isNumber }
);

Preset: helping-js/preset/form re-exports validate, isString, isNumber, isNumeric, isUndefinedOrNull, isEmptyString, and RX_EMAIL, RX_URL, RX_PHONE so you can import everything for forms in one line.


Vue 3 example

Simple form: refs for inputs, validate(formData, rules) on submit, display errors.

<template>
  <form @submit.prevent="onSubmit">
    <input v-model="form.email" type="email" placeholder="Email" />
    <span v-if="errors.email">Invalid email</span>
    <input v-model.number="form.age" type="number" placeholder="Age" />
    <span v-if="errors.age">Invalid age</span>
    <button type="submit">Submit</button>
  </form>
</template>

<script setup>
import { ref, reactive } from 'vue';
import { validate, RX_EMAIL, isNumber } from 'helping-js/preset/form';

const form = reactive({ email: '', age: null });
const errors = ref({});

const rules = { email: RX_EMAIL, age: isNumber };

function onSubmit() {
  const result = validate(form, rules);
  errors.value = result.errors;
  if (result.valid) {
    // submit form
  }
}
</script>

React example

Simple form: useState for form data and errors, validate(formData, rules) on submit.

import { useState } from 'react';
import { validate, RX_EMAIL, isNumber } from 'helping-js/preset/form';

export function MyForm() {
  const [form, setForm] = useState({ email: '', age: '' });
  const [errors, setErrors] = useState({});

  const rules = { email: RX_EMAIL, age: isNumber };

  function onSubmit(e) {
    e.preventDefault();
    const result = validate(form, rules);
    setErrors(result.errors);
    if (result.valid) {
      // submit form
    }
  }

  return (
    <form onSubmit={onSubmit}>
      <input
        value={form.email}
        onChange={(e) => setForm((s) => ({ ...s, email: e.target.value }))}
        type="email"
        placeholder="Email"
      />
      {errors.email && <span>Invalid email</span>}
      <input
        value={form.age}
        onChange={(e) => setForm((s) => ({ ...s, age: e.target.value }))}
        type="number"
        placeholder="Age"
      />
      {errors.age && <span>Invalid age</span>}
      <button type="submit">Submit</button>
    </form>
  );
}

Rule types

RuleHow it’s used
RegExprule.test(String(value))
(value) => booleanrule(value) must return true to pass

Use helping-js/core/types (e.g. isString, isNumber, isNumeric) or helping-js/core/regex (e.g. RX_EMAIL, RX_PHONE) as rules, or pass your own functions/RegExps.

Last Updated:
Contributors: parsajiravand