1.0.5 • Published 3 days ago

@sergtyapkin/models-validator v1.0.5

Weekly downloads
-
License
MIT
Repository
-
Last release
3 days ago

Models validator

Run tests downloads

Models Validator for Objects. For example, for JSON-parsed Objects that received from network.


Docs for models:

All model fields describes as: from: fieldType

fieldType can be declared as:

  • Simple type: String, Number, Date, Object, Array,...

    Array in this case can contain any elements of any types

  • Enum: new Set(["some_val", 456, "val2"]) (Field can only be "some_val" or 456 or "val2")
  • Specialized Array (fixed length): [Number, String, String] (specialized type of every element in array)
  • Specialized Array (unlimited length):
    {
      type: Array,
      item: /**{{fieldType}}**/,
    }
  • Long type declaration (you can set optional param):
    {
      type: /**{{fieldType}}**/,
      optional: true, // |=>  field will not be exists in result object if it's not provided
      default: "SomeDefaultValue", // => If field not provided in source data, it will have this value
      from: "some_name", // |=>  field will be searched in the source model as a field with the name "some_name" 
    }
  • Nested object declaration:
    {
      type: Object,
      fields: {
        // from: fieldType,
        // ...    
      }
    }

Fields options at long declaration as a result:

  • type {{fieldType}} - Describes the type to which the original field value is converted.
  • optional [Boolean] - If it has value "false", field can be not provided.
  • default [Any value that converts to {{fieldType}}] - If field is optional and it's not provided in source data, it will have this value.
  • from [String] - Name of field with which it will be searched in the source model
  • item {{long or short fieldType}} - If field type is Array, it can be long or short declaring of field type.
  • fields {Object} - If field type is Object, it must be Object with long or short declaring of each object field.

Example model description:

const exampleModel = {
  field1: String, // |=> "some_string"
  field2: Number, // |=> 123.4123
  field3: Object, // |=> {any_fields: any_values, ...}
  field4: Array,  // |=> [any_types, ...]
  field5: [Number, String], // |=> [123.1244, "some_string"]
  field6: new Set(["some_val", 456, "val2"]), // |=> Enumeration. Can only be "some_val" or 456 or "val2"
  field7: {
    type: String
  }, // Equals as `field7: String`
  field8: {
    type: Object,
    fields: {
      // ... Any fields of nested model, for example:
      field8_1: String,
    },
  },
  field9: {
    type: Number,
    optional: true, // |=>  field will not be exists in result object if it's not provided
  },
  field10: {
    type: Array,
    item: String, // |=> short or long declaration of each field in array
    from: "some_field_10", // |=> field will searched as field "some_field_10" and written in "field10"
  },
  field11: {
    type: Array,
    item: {  // example of long declaration of each field in array:
      type: Object,
      fields: {
        field11_1: String,
      }
    },
  },
}

Example model validation:

const UserModel = { // declare model
  age: Number,
  userName: {
    type: [String, String], // maybe ["name", "surname"]
    from: "user_name", // name in API model
  }, 
  sex: new Set(['male', 'female']), // one of two values
  children: {
    type: Array, // array with unlimited length
    optional: true, // mey be not exists
    item: {
      type: Object,
      fields: {
        name: String,
        age: Number,
      }
    }
  }
}

const response = fetch('/user', {method: 'GET'}); // get unvalidated JSON data
const data = validateModel(UserModel, await response.text()); // validate

For more examples you can see file with tests validateModel.test.js

1.0.5

3 days ago

1.0.4

3 days ago

1.0.2

1 month ago

1.0.3

1 month ago

1.0.1

5 months ago

1.0.0

5 months ago