Usage in your project

helping-js works in Node (CJS and ESM), Express, Vite, Vue, React, Next.js, Create React App, and other bundlers. No extra config — install and import. Below are multiple examples per stack.


Node (CommonJS)

Basic imports

const { isString, isNumber, isArray } = require('helping-js/core/types');
const { RX_EMAIL, RX_URL } = require('helping-js/core/regex');
const { validate } = require('helping-js/core/validate');

Using type checkers

const { isString, isPlainObject } = require('helping-js/core/types');

if (isString(input)) {
  console.log('Input is a string');
}
if (isPlainObject(config)) {
  console.log('Config is a plain object');
}

Using validate in Node (CJS)

const { validate } = require('helping-js/core/validate');
const { RX_EMAIL } = require('helping-js/core/regex');
const { isNumber } = require('helping-js/core/types');

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

Using regex only

const { RX_EMAIL, RX_PHONE } = require('helping-js/core/regex');

if (RX_EMAIL.test(email)) console.log('Valid email');
if (RX_PHONE.test(phone)) console.log('Valid phone');

Node (ESM)

Use "type": "module" in your package.json or use the .mjs extension.

Basic imports

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

Using the form preset (one import)

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

const result = validate(
  { email: 'a@b.co', age: 30 },
  { email: RX_EMAIL, age: isNumber }
);

Type checkers + regex

import { isNumeric, isEmptyString } from 'helping-js/core/types';
import { RX_UUID } from 'helping-js/core/regex';

if (isNumeric(str)) console.log('Numeric string');
if (!isEmptyString(name) && RX_UUID.test(id)) console.log('Valid UUID');

Express

In a route (CJS)

const express = require('express');
const { validate } = require('helping-js/core/validate');
const { RX_EMAIL } = require('helping-js/core/regex');
const { isString } = require('helping-js/core/types');

const app = express();
app.use(express.json());

app.post('/users', (req, res) => {
  const result = validate(req.body, {
    email: RX_EMAIL,
    name: isString,
  });
  if (!result.valid) {
    return res.status(400).json({ errors: result.errors });
  }
  // create user...
});

In a route (ESM)

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

const app = express();
app.use(express.json());

app.post('/api/contact', (req, res) => {
  const result = validate(req.body, {
    email: RX_EMAIL,
    message: isString,
  });
  if (!result.valid) return res.status(400).json(result.errors);
  res.json({ ok: true });
});

Middleware example (CJS)

const { validate } = require('helping-js/core/validate');
const { RX_EMAIL } = require('helping-js/core/regex');
const { isString } = require('helping-js/core/types');

const validateBody = (rules) => (req, res, next) => {
  const result = validate(req.body || {}, rules);
  if (!result.valid) return res.status(400).json({ errors: result.errors });
  next();
};

app.post('/login', validateBody({ email: RX_EMAIL }), (req, res) => {
  // req.body.email is valid
});

Using types for query/params

const { isNumeric, isString } = require('helping-js/core/types');

app.get('/users/:id', (req, res) => {
  if (!isNumeric(req.params.id)) {
    return res.status(400).send('Invalid id');
  }
  // ...
});

Vue 3

Composition API – types and regex

<script setup>
import { ref, computed } from 'vue';
import { isString, isNumber } from 'helping-js/core/types';
import { RX_EMAIL } from 'helping-js/core/regex';

const email = ref('');
const age = ref('');

const isEmailValid = computed(() => isString(email.value) && RX_EMAIL.test(email.value));
const isAgeValid = computed(() => isNumber(age.value) || (isString(age.value) && /^\d+$/.test(age.value)));
</script>

Composition API – validate on submit

<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({});

function onSubmit() {
  const result = validate(form, { email: RX_EMAIL, age: isNumber });
  errors.value = result.errors;
  if (result.valid) {
    // submit
  }
}
</script>

Options API – type checkers

<script>
import { isString, isArray } from 'helping-js/core/types';

export default {
  data() {
    return { items: [] };
  },
  methods: {
    add(item) {
      if (!isString(item)) return;
      if (!isArray(this.items)) this.items = [];
      this.items.push(item);
    },
  },
};
</script>

Vue 3 + script setup – full form example

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

const form = reactive({ email: '', phone: '', name: '' });
const errors = ref({});

const rules = {
  email: RX_EMAIL,
  phone: RX_PHONE,
  name: (v) => isString(v) && v.length >= 2,
};

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

<template>
  <form @submit.prevent="submit">
    <input v-model="form.name" placeholder="Name" />
    <span v-if="errors.name">Invalid name</span>
    <input v-model="form.email" type="email" placeholder="Email" />
    <span v-if="errors.email">Invalid email</span>
    <input v-model="form.phone" placeholder="Phone" />
    <span v-if="errors.phone">Invalid phone</span>
    <button type="submit">Submit</button>
  </form>
</template>

React

Hooks – type checkers

import { useState } from 'react';
import { isString, isNumber } from 'helping-js/core/types';

function useInput(initial) {
  const [value, setValue] = useState(initial);
  const isValid = isString(value) && value.trim().length > 0;
  return [value, setValue, isValid];
}

Hooks – validate on submit

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

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

  const handleSubmit = (e) => {
    e.preventDefault();
    const result = validate(form, { email: RX_EMAIL, age: isNumber });
    setErrors(result.errors);
    if (result.valid) {
      // submit
    }
  };

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

Class component – regex and types

import { Component } from 'react';
import { RX_EMAIL } from 'helping-js/core/regex';
import { isString } from 'helping-js/core/types';

class MyForm extends Component {
  state = { email: '' };

  isValid = () => isString(this.state.email) && RX_EMAIL.test(this.state.email);

  render() {
    return (
      <input
        value={this.state.email}
        onChange={(e) => this.setState({ email: e.target.value })}
      />
    );
  }
}

React – full form with validate

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

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

  const rules = {
    email: RX_EMAIL,
    phone: RX_PHONE,
    name: (v) => isString(v) && v.length >= 2,
  };

  function handleSubmit(e) {
    e.preventDefault();
    const result = validate(form, rules);
    setErrors(result.errors);
    if (result.valid) alert('Submitted');
  }

  return (
    <form onSubmit={handleSubmit}>
      <input
        value={form.name}
        onChange={(e) => setForm((s) => ({ ...s, name: e.target.value }))}
        placeholder="Name"
      />
      {errors.name && <span>Invalid name</span>}
      <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.phone}
        onChange={(e) => setForm((s) => ({ ...s, phone: e.target.value }))}
        placeholder="Phone"
      />
      {errors.phone && <span>Invalid phone</span>}
      <button type="submit">Sign up</button>
    </form>
  );
}

Vite

Vanilla JS (ESM)

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

Vue + Vite (script setup)

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

React + Vite

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

Next.js

Works in both client and server components; same ESM imports.

Server action / API route

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

export async function POST(request) {
  const body = await request.json();
  const result = validate(body, { email: RX_EMAIL, name: isString });
  if (!result.valid) {
    return Response.json({ errors: result.errors }, { status: 400 });
  }
  return Response.json({ ok: true });
}

Client component (React)

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

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

  const onSubmit = (e) => {
    e.preventDefault();
    const result = validate(form, { email: RX_EMAIL });
    setErrors(result.errors);
    if (result.valid) fetch('/api/contact', { method: 'POST', body: JSON.stringify(form) });
  };

  return (
    <form onSubmit={onSubmit}>
      <input
        value={form.email}
        onChange={(e) => setForm({ email: e.target.value })}
      />
      {errors.email && <span>Invalid email</span>}
      <button type="submit">Send</button>
    </form>
  );
}

Create React App

Functional component

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

With types only

import { isString, isArray } from 'helping-js/core/types';

With regex only

import { RX_EMAIL, RX_URL } from 'helping-js/core/regex';

CDN (browser ESM)

For browser-only usage without a bundler. Pin a version in production (e.g. helping-js@2).

Types and regex

import { isString } from 'https://unpkg.com/helping-js/core/types.js';
import { RX_EMAIL } from 'https://unpkg.com/helping-js/core/regex.js';

Form preset (validate + rules)

import { validate, RX_EMAIL, isNumber } from 'https://unpkg.com/helping-js/preset/form.js';

const result = validate(
  { email: 'user@example.com', age: 25 },
  { email: RX_EMAIL, age: isNumber }
);
Last Updated:
Contributors: parsajiravand