npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

use-form-ts

v1.0.2

Published

Hooks for forms with TypeScript

Downloads

65

Readme

useForm TypeScript Hook

This is a lightweight form style for someone who would normally do it all themselves but with some helping types.

Installation

yarn add use-form-ts

Getting Started

Use the hook to get started, we'll use useState for the state management in this example

const [formState, setFormState] = React.useState({
  firstname: "",
  lastname: "",
});
const form = useForm({
  values: state.formState,
  onChange: (value) => setFormState({ ...state, ...value }),
});

Form has two methods, one is validate, and the other is createFormItem.

Validate

We use validate in the submit handler typically

const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
  e.preventDefault();
  if (form.validate()) {
    // Perform some action here
  }
};

createFormItem

We use createFormItem for defining the variables that go in to our component.

{
  form.createFormItem("firstname", {
    adaptor: (e: React.ChangeEvent<HTMLInputElement>) => e.target.value,
    meta: {
      label: "First Name",
    },
    required: true,
  })(({ errorText, meta: { label }, ...props }) => (
    <InputField label={label} {...props} errorText={errorText || ""} />
  ));
}

adaptor is a conversion if necessary for the callbacks, as typically input elements will return you an event and not the actual value that changed.

meta is a convenience pass through object, the purpose is that it allows you to define reusable components, which can be configured declaratively, for example yaml, that generates the form schema that then generate the code for the form.

The rest of the options in createFormItem are validation options.

Validation options

  • required is a common method for highlighting that something needs to be entered
  • validationMessages is a object that allows overwriting the default messages for the built in validation params.
  • custom is a handler if you want to perform your own custom validation
  • customAsync is a handler for async custom validation
  • validation: is an object that defines some built in validation methods, these are:
    • whitespace is like required but ignores whitespace as well
    • email checks for a valid email
    • regex allows checking for any regex