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 🙏

© 2024 – Pkg Stats / Ryan Hefner

powerform

v5.0.1-alpha1

Published

A powerful form model.

Downloads

477

Readme

Build Status

Logo by Anand

Introduction

A tiny super portable form model which can be used in apps with or without frameworks like React.

Showcase

Vanilla JS

React

Mithril

Breaking changes

v4 introduces significant changes which are not backward compatible with v3. Please checkout the change log.

Installation

yarn

yarn add powerform

npm

npm install powerform

Quick walk-through

// es6
import { powerform } from "powerform";
import { required, minLength, equalsTo } from "validatex";

const schema = {
  username: required(true),
  password: [required(true), minLength(8)],
  confirmPassword: [required(true), equalsTo("password")],
};

const form = powerform(schema);

// assign values to fields
form.username.setData("ausername");
form.password.setData("apassword");
form.confirmPassword.setData("bpassword");

// per field validation
console.log(form.username.validate()) > true;
console.log(form.password.validate()) > true;
console.log(form.confirmPassword.validate()) > false;
console.log(form.confirmPassword.getError()) > "Passwords do not match.";

// validate all the fields at once
console.log(form.validate()) > false;
console.log(form.getError()) >
  {
    username: undefined,
    password: undefined,
    confirmPassword: "Password and confirmation does not match.",
  };

API

Form

powerform(schema, config?: object)

Returns a form.

// reusing the schema from walkthrough
const form = powerform(schema);
Config schema
{
  data: object,
  onChange(data: object, form: Form): function,
  onError(error: object, form: Form): function,
  stopOnError: boolean
}
Set initial values of field

Pass an object at config.data to set initial field values.

const config = {
  data: {
    username: "a username",
    password: "a password",
  },
};
const form = powerform(schema, config);
console.log(form.username.getData()) > "a username";
console.log(form.password.getData()) > "a password";
Track changes in data and error

Changes to values and errors of fields can be tracked through config.onChange callback.

const config = {
  onChange: (data, form) => {
    console.log(data);
  },
  onError: (error, form) => {
    console.log(error);
  },
};

const form = powerform(schema, config);
form.username.setData("a username") >
  // logs data
  {
    username: "a username",
    password: null,
    confirmPassword: null,
  };
form.password.validate() >
  // logs changes to error
  {
    username: null,
    password: "This field is required.",
    confirmPassword: null,
  };
Validate one field at a time

It is possible to stop validation as soon as one of the fields fails. To enable this mode of validation set config.stopOnError to true. One can control the order at which fields are validated by supplying index to fields.

const loginSchema = {
  password: {validator: required(true), index: 2}
  username: {validator: required(true), index: 1}
}
const form = powerform(loginSchema, {stopOnError: true})

console.log(form.validate())
>> false

console.log(form.getError())
>> {username: "This field is required."}

form.setData(data: object)

Sets value of fields of a form.

const form = powerform(schema);
let data = {
  username: "a username",
  password: "a password",
};
form.setData(data);

console.log(form.username.getData()) > "a username";
console.log(form.password.getData()) > "a password";
console.log(form.confirmPassword.getData()) > null;

form.getData()

Returns key value pair of fields and their corresponding values.

const form = powerform(schema);
let data = {
  username: "a username",
  password: "a password",
};
form.setData(data);

console.log(form.getData()) >
  {
    username: "a username",
    password: "a password",
    confirmPassword: null,
  };

form.getUpdates()

Returns key value pair of updated fields and their corresponding values. The data it returns can be used for patching a resource over API.

const userFormSchema = {
  name: required(true),
  address: required(true),
  username: required(true),
};

const form = powerform(userFormSchema);
let data = {
  name: "a name",
  address: "an address",
};
form.setData(data);

console.log(form.getUpdates()) >
  {
    name: "a name",
    address: "an address",
  };

form.setError(errors: object)

Sets error of fields in a form.

const form = powerform(schema);
const errors = {
  username: "Invalid username.",
  password: "Password is too common.",
};
form.setError(errors);

console.log(form.username.getError()) > "Invalid username.";

console.log(form.password.getError()) > "Password is too common.";

console.log(form.confirmPassword.getError()) > null;

form.getError()

Returns key value pair of fields and their corresponding errors.

const form = powerform(schema);
form.password.setData("1234567");
form.confirmPassword.setData("12");
form.validate();

console.log(form.getError()) >
  {
    username: "This field is required.",
    password: "This field must be at least 8 characters long.",
    confirmPassword: "Passwords do not match.",
  };

form.isDirty()

Returns true if value of one of the fields in a form has been updated. Returns false if non of the fields has been updated.

const form = powerform(schema);

console.log(form.isDirty()) > false;

form.username.setData("a username");
console.log(f.isDirty()) > true;

form.makePristine()

Sets initial value to current value in every fields.

const form = powerform(schema);
form.username.setData("a username");

console.log(form.isDirty()) > true;

form.makePristine();
console.log(form.isDirty()) > false;
console.log(form.username.getData()) > "a username";

form.reset()

Resets all the fields of a form.

const form = powerform(schema);
form.username.setData("a username");
form.password.setData("a password");
console.log(form.getData()) >
  {
    username: "a username",
    password: "a password",
    confirmPassword: null,
  };

form.reset();
console.log(form.getData()) >
  {
    username: null,
    password: null,
    confirmPassword: null,
  };

form.isValid()

Returns true if all fields of a form are valid. Returns false if one of the fields in a form is invalid. Unlike form.validate() it does not set the error.

const form = powerform(schema);
form.password.setData("1234567");

console.log(form.isValid()) > false;

console.log(form.getError()) >
  {
    username: null,
    password: null,
    confirmPassword: null,
  };

Field

Every keys in a schema that is passed to powerform is turned into a Field. We do not need to directly instanciate it.

Field(config?: object| function | [function])

Creates and returns a field instance.

Config schema
{
  validator: function | [function],
  default?: any,
  debounce?: number,
  onChange(value: any, field: Field)?: function
  onError(error: any, field: Field)?: function
}
Set default value

A field can have default value.

const form = powerform({
  username: { validator: required(true), default: "orange" },
});

console.log(form.username.getData()) > "orange";
Trance changes in value and error

Changes in value and error of a field can be tracked through config.onChange and config.onError callbacks.

function logData(data, field) {
  console.log('data: ', data)
}

function logError(data, field) {
  console.log('error: ', error)
}

const form = powerform({
  username: {
    validator: required(true),
    default: 'orange',
    onChange: logData,
    onError: logError
  }
})
form.username.validate()
> "error: " "This field is required."

form.username.setData('orange')
> "data: " "orange"

form.username.validate()
> "error: " null
Debounce change in value

Changes in data can be debounced.

const form = powerform({
  username: {
    validator: required(true),
    default: 'orange',
    onChange: logData,
    onError: logError
  }
})

form.username.setData("banana")
// after 1 second
> "data: " "banana"

Field.setData(value: any)

Sets field value.

const form = powerform({
  name: required(true),
});
form.name.setData("a name");
console.log(form.name.getData()) > "a name";

Field.getData()

Returns field value.

Field.modify(newValue: any, oldValue: any)

Modifies user's input value. Example usage -

  • capitalize user name as user types
  • insert space or dash as user types card number
const form = powerform({
  name: {
    validator: required(true),
    modify(value) {
      if (!value) return null;
      return value.replace(/(?:^|\s)\S/g, (s) => s.toUpperCase());
    },
  },
});

form.name.setData("first last");
console.log(form.name.getData()) > "First Last";

Field.clean(value: any)

Cleans the value. form.getData() uses this method to get clean data. It is useful for situations where value in a view should be different to the value in stores.

const form = powerform({
  card: {
    validator: required(true),
    modify(newVal, oldVal) {
      return newVal.length === 16
        ? newCard
            .split("-")
            .join("")
            .replace(/(\d{4})/g, "$1-")
            .replace(/(.)$/, "")
        : newCard
            .split("-")
            .join("")
            .replace(/(\d{4})/g, "$1-");
    },
    clean(value) {
      return card.split("-").join("");
    },
  },
});

form.card.setData("1111222233334444");
console.log(form.card.getData()) > "1111-2222-3333-4444";
console.log(form.getData()) > { card: "1111222233334444" };

field.validate(value: any, allValues: object)

field.isValid()

Returns true or false based upon the validity.

field.setError(error: string)

Sets field error.

field.getError()

Returns field error. Call this method after validating the field.

field.isDirty()

Returns true if value of a field is changed else returns false.

field.makePristine()

Marks a field to be untouched. It sets current value as initial value.

field.reset()

It resets the field. Sets initial value as current value.

field.setAndValidate(value: any)

Sets and validates a field. It internally calls Field.setData() and Field.validate().