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

schema-json-form-atter

v0.2.1

Published

JSON schema generator and translator intergrated for forms

Downloads

444

Readme

Schema-JSON-Form-atter

Schema JSON Form-atter its a library that's able to build, standarize, and schematize forms facing to its storage and validation. Build a FormSchema anyway you want, statically or with a CMS. Convert it to an storable object and store it the way you want. Convert it to a validation schema the way you want with the library you want (native support for yup) and validate the payload from the form that you created. On the other side get a JSON from anywhere, then turn it to a FormSchema and map it the way you want to UI Components.

How to install

  • npm
npm install schema-json-form-atter
  • yarn
yarn add schema-json-form-atter
  • pnpm
pnpm add schema-json-form-atter

Table of Contents

Fragments

Fragments are the base of the Form-atter. Every Fragment should be in some point mapped to an UI Component some examples:

Examples

const inputFragment = new InputFragment('INPUT_TEXT','test-input-name','string',[
  {
    type: 'VALIDATION_REQUIRED',
    msg: 'This field is required'
  }
  //some validations
],{
  defaultValue: 'default',
  placeholder: 'Test',
  //some other custom props that you want to define
})

//this input fragment represents an Input component with
//custom props that can be mapped to a UI element and schema validation object.
const blockFragment = new BlockFragment(
  'BLOCK_ROW','test-row',
  [inputFragment] /*Array filled with childrens*/,
  undefined /*Some custom validation*/
)

toObject(): JsonObject

Serialize the class to JSON compatible object.

static fromJSON(obj: JsonObject, fromJSONParser?: FromJSONParser): Fragment

Parses incoming JSON to a new Fragment.

InputFragment

An InputFragment its a special Fragment that stands for input component in forms. This Fragments will also be used to generate the form schema. In case you need there's the options property to pass special options related to UI or behavior such the following:

  • placeholder
  • default value
  • label
  • options for select
  • loadOptions service with keywords

Some validations can be added to the Input Fragment.

Example

const inputFragment = new InputFragment('INPUT_TEXT','test-input-name','string',[
  {
    type: 'VALIDATION_REQUIRED',
    msg: 'This field is required'
  }
  //some validations
],{
  defaultValue: 'default',
  placeholder: 'Test',
  //some other custom props that you want to define
})

//this input fragment represents an Input component with
//custom props that can be mapped to a UI element and schema validation object.

BlockFragment

A BlockFragment it's an all purpose Fragment that it's intended to be mapped to whatever you want. It can be used as layout passing fields prop to render childrens of a block element.

Example

const blockFragment = new BlockFragment(
  'BLOCK_ROW','test-row',
  [inputFragment] /*Array filled with childrens*/,
  undefined /*Some custom validation*/
)

Defining new Fragments

To define a new fragment you should implement a new class that inherits class Fragment. Instead of definig a new class for UI components use BlockFragment. A new Fragment that can be defined is for Example MetaFragment, that stores in some way meta info about the form or the parent BlockFragment component.

FromJSONParser

A FromJSONParser its an object that stands to get the way any Fragment-like class is parsed from JSON. It's defined a FromJSONParser by default defaultFromJSONParser .

Validations

Some custom validations are defined by default but any new validation can be casted from somthing like:

const validation = {
  type: 'CUSTOM_VALIDATION_{test}',
  options:{
    //anything can be here
  }
}

Anything can be used as a validation as long as you add a way to handle it later.

SchemaTransformer

A SchemaTransformer it's an object intended to convert an Input to a Validation-like structure. It have a typeMapper that converts an input type to a base validation-like object withot any more restrictions than the type itself. It also have a validationTransformer that apply each validation to a validation-like object and return another object with the current validation applied.

public addTransformer(type: string, transformer: (validation: InputValidation, currentSchema: T) => T):void

Add a transformer to the validationTransformer

public addTypeMapper(type: string, mapper: () => T):void

Add a type to the typeMapper

yup

By default the Form-atter is integrated with yup for validation. Simply call

const transformer = YupSchemaTransformer()

Adding other validation libraries

If you want to integrate a new library for validation for example Joi. Just create a new TypeMapper and a new ValidationTransformer and create a new instance of SchemaTransformer using them.

FormSchema

A FormSchema is the main form component. It have fields for composing the form.

{
  "_id": "5a9b1b9e3d1e86653a79b1b9",
  "name": "Sample Form",
  "options": {
    "autoSubmit": true,
    "toLink": true
  },
  "fields": [
    {
      "_id": "1",
      "name": "email",
      "type": "INPUT_TEXT",
      "validation":[
        {
          "type": "VALIDATION_EMAIL",
          "msg": "Should be an email"
        }
      ],
      "dataType": "string",
      "options":{
        "placeholder": "Email",
        "label": "Email",
        "helperText": "please enter your email"
      },
      "excludeFromValidation": false,
      "FRAGMENT_TYPE": "INPUT"
    },
    {
      "_id": "2",
      "name": "age",
      "type": "INPUT_NUMBER",
      "validation":[
        {
          "type": "VALIDATION_MIN",
          "msg": "Should have at least 0 years",
          "value": 0
        },
        {
          "type": "VALIDATION_MAX",
          "value": 100,
          "msg": "Are you a human?"
        }
      ],
      "dataType": "number",
      "options":{
        "defaultValue": 18,
        "placeholder": "Age",
        "label": "Age"
      },
      "excludeFromValidation": false,
      "FRAGMENT_TYPE": "INPUT"
    }
  ]
}

Call FormSchema.fromJSON(json) to create a form from an incoming JSON-like object. Also can be serialized to an object calling form.toObject(). Calling form.toSchema(transformer) transform the form into a Validation-like object.

yup

By default the Form-atter is integrated with yup for validation. Simply call

const formSchema = FormYupSchema(...)
const schema = formSchema.toSchema()

Adding other validation libraries

If you want to integrate a new library for validation for example Joi. Just create a new FormSchema class that inherit from FormSchema and call it using previously defined SchemaTransformer while overriding methods.