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

yavljs

v2.0.0

Published

yet another validation library in javascript

Downloads

9

Readme

YAVLJS

yavl (pronounced /yavl/) is Yet Another Validation Library. js simply because it is a javascript library (and also because yavl was taken on npm :/).

What is exactly yavljs ?

yavl, as said earlier, is a validation library. One of the main goals of this library is to be able to use it in the most modular way (being able to tweak the settings easily without touching how it's being managed, separating concerns).

I especially put effort in it to discourage users from hardcoding their form validation settings. I highly recommend the use of JSON configuration files (both for locale and settings) which makes it easier for you to read, have access to and debug (required structure patterns will be shown below).

Another goal of this library is to be able to be used by anyone without any kind of dependencies (a decent version of your browser should do the trick). This also means that dependency injection is highly recommended.

What do I need to use this library ?

To use this library you will need three things:

  • The library itself
  • A configuration file (describes the form[s] structure[s])
  • A locale file (replaces the error messages with yours :D)

Get the library itself

It is pretty straightforward, you can:

  • Grab the yavl.js file and include it
  • Use npm (npm install yavljs) and most import systems (const yavl = require("yavljs");)

The configuration file

This will give you an idea of the required structure for a form, of course you can use an array of forms (lines marked //* are required elements)

{
  "form": "#form",//*  -  a selector to the form
  "fields": {
    "field": {
      "selector": "#field",//*
      "error_selector": "#field + p.form-error",//*
      "required": "true",
      "rules": {
        "regex": "^\\w+\\d+$",
        "minLength": "6",
        "maxLength": "64"
      }
    }
  }
}

This can then be imported in javascript and passed to yavl's constructor. Note that the fields's names can be whatever you want them to be, they are not tied to any kind of code, they are just here to remind you what they are :D !

The locale file

You might need to adapt the messages to the person that is visiting your site, therefore I decided to go with a configuration approach for the error messages. Just like you declare the form's constraints, you will replace the messages yourself (if desired):

{
    "NaN": "That should be a number, I guess. Sadly, it isn't one.",
    "required": "Hey did you think you could get past me ?",
    "min": "That should be ≥ %value%.",
    "max": "That should be ≤ %value%.",
    "nomatch_regex": "Format invalide.",
    "minLength": "At least %value% characters ffs.",
    "maxLength": "%value% characters is way too much !",
    "notEqual": "I can sense a disturbance in the equivalence."
}

Note that this is completely optionnal, yavl comes with default error messages and you can totally omit one in your locale files if you desire to do so.

(the above is a complete set of all available core features)

How do I use this ?

Well, let's imagine the following structure (you can also see the example page):

<form id="form">
  <input type="text" name="username"/>
  <p class="error"></p>
  <br/>

  <input type="password" name="password"/>
  <p class="error"></p>
  <br/>

  <input type="password" name="c_password"/>
  <p class="error"></p>
  <br/>

  <button type="submit">Log in</button>
</form>

I'll use the default locale and the following configuration file:

{
  "form": "#form",
  "fields": {
    "username": {
      "required": "true",
      "selector": "[name='username']",
      "error_selector": "[name='username'] + p.error",
      "rules": {
        "regex": "^\w{6}$",
        "userInDatabase": "true" //supposedly a library's rule
      },
      "password": {
        "required": "true",
        "type": "int", //stupid but exists
        "selector": "[name='password']",
        "error_selector": "[name='password'] + p.error",
        "rules": {
          "regex": "^\d+$",
          "passwordFor": "username" //supposedly a library's rule
        }
      },
      "confirmPassword": {
        "required": "true",
        "type": "int",
        "selector": "[name='c_password']",
        "error_selector": "[name='c_password'] + p.error",
        "rules": {
          "regex": "^\d+$",
          "match": "password"
        }
      }
    }
  }
}

And then the associated javascript file (usage of fetchJSON):

document.addEventListener("DOMContentLoaded", ()=>{
  fetchJSON("json/formConfig.json", config=>{
    const v = new yavl(
      config.form,
      config.fields
    );

    document.querySelector(config.form)
    .addEventListener("submit", event={
      v.validateForm(event);
    });
    
    document.querySelector(config.form + " *")
    .addEventListener("change", event=>{
      v.validateForm(event);
    })
  });
});

More specific details

The yavl constructor

An instance of yavl is (supposed to handle) one and only one form. The constructor is detailed this way :

new yavl(
  form's selector,
  form's field (as in the config file),
  locale object (as in the config file) [optional defaulted to {}],
  function used to validate a rule [optional defaulted],
  function used to "invalidate" a rule [optional defaulted]
);

Validation and "invalidation"

Validation and "invalidation" functions are defined as the following:

validate:: (error's selector) -> void
invalidate:: (event, error's selector, error message) -> true

Since yavl uses Array.prototype.some, you need to return true to interrupt the rules browsing when it encounters an error.

Extending yavl with custom rules

Extending yavl is fairly simple : I added a simple and straightforward plugin system.

Using yavl.registerRule(name, function) you can add a new rule to the list of plugin rules. Using yavl.removeRule(name, function) you can remove a rule from the list of plugin rules. *warning: * Be aware that you might override someone else's rule !

Internally, core rules have a higher priority than any of the plugins's rules.

A plugin/rule 's function is defined as follows:

rule:: (error messages database, validation function, invalidation function, event, error's selector, value, expected[optional], fieldsObj[optional]) -> void

To be an efficient rule, you need to :

  • Return the call of the validation function if the value meets the requirement
  • Return the call of the invalidation function if it doesn't
  • Use the correponding message from the message database for errors
  • Replace %value% with a value (usually the value that is given by the rule, sometimes the field's value itself) in the error message

Noticed that you can "implement" your own logic behind the scenes (for instance by replacing %formVal% by the input's value in your custom rule to let the user see what it typed wrong).

Default/core rules

This part is subject to change, but right now yavl provides these rules:

(user's input's type) name of the rule (value from config)

  • (number, number as string) min (number, number as string)
  • (number, number as string) max (number, number as string)
  • (as string) regex (javascript regex as string)
  • (as string) minLength (as string)
  • (as string) maxLength (as string)
  • (as string) match (another field's name from the config file)

Changes

V2.0.0

Most of the library has been rewritten in ES5 so that everyone can access it easily