Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

gotu

Package Overview
Dependencies
Maintainers
1
Versions
23
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

gotu

Domain entities javascript library.

  • 1.0.0
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
496
increased by9820%
Maintainers
1
Weekly downloads
 
Created
Source

Gotu Kola

Gotu Kola helps define your business entities (*)

(*) Entities: they are the first natural place we should aim to place business logic in domain-driven applications.

Installing

$ npm install gotu

Using

const User = 
    entity('User', {
        name: field(String),
        lastAccess: field(Date),
        accessCount: field(Number),
        hasAccess: field(Boolean),
        plan: field(Plan),
    })

const user = new User()
user.name = "Beth"
user.plan.monthlyCost = 10
user.validate()

Validation

A value of an field can be validated against the field type or its custom validation.

Type Validation


const Plan = 
    entity('Plan', {
        ...
        monthlyCost: field(Number),
    })

const User = 
    entity('User', {
        name: field(String),
        plan: field(Plan)
    })

const user = new User()
user.name = 42
user.plan.monthlyCost = true
user.validate() 
user.errors // { name: ["name must be of type string"], plan: { monthlyCost: ["monthlyCost must be of type number"] } }
user.isValid // false

Custom Validation

For custom validation Gotu uses validate.js library under the hood.

Use { validation: ... } to specify a valid validate.js validation (sorry) on the field definition.

const User = 
    entity('User', {
        ...
        password: field(String, { 
            presence: true, 
            length: { minimum: 6 },
            message: "must be at least 6 characters"
        })
    })

const user = new User()
user.password = '1234'
user.validate() 
user.errors // { password: ["Password must be at least 6 characters"] }
user.isValid // false

Serialization

fromJSON(value)

Returns a new instance of a entity

const User = 
    entity('User', {
        name: field(String)
    })

// from hash
const user = User.fromJSON({ name: 'Beth'})
// or string
const user = User.fromJSON(`{ "name": "Beth"}`)

JSON.stringify(entity)

To serialize an entity to JSON string use JSON.stringify function.

const json = JSON.stringify(user) // { "name": "Beth"}

Field definition

A entity field type has a name, type, default value, validation and more.

Scalar types

A field in an entity can be of basic types, the same as those used by JavaScript:

Number: double-precision 64-bit binary format IEEE 754 value

String: a UTF‐16 character sequence

Boolean: true or false

Date: represents a single moment in time in a platform-independent format.

const User = 
    entity('User', {
        name: field(String),
        lastAccess: field(Date),
        accessCount: field(Number),
        hasAccess: field(Boolean)
    })

Entity type

For complex types, with deep relationship between entities, a field can be of entity type:

const Plan = 
    entity('Plan', {
        ...
        monthlyCost: field(Number),
    })

const User = 
    entity('User', {
        ...
        plan: field(Plan)
    })

Default value

It is possible to define a default value when an entity instance is initiate.

const User = 
    entity('User', {
        ...
        hasAccess: field(Boolean, { default: false })
    })


const user = new User()
user.hasAccess // false

If the default value is a function it will call the function and return the value as default value:

const User = 
    entity('User', {
        ...
        hasAccess: field(Boolean, { default: () => false })
    })


const user = new User()
user.hasAccess // false

For scalar types a default value is assumed if a default value is not given:

TypeDefault Value
Number0
String""
Booleanfalse
Datenull

For entity types the default value is a new instance of that type. It is possible to use null as default:

const User = 
    entity('User', {
        ...
        plan: field(Plan, { default: null })
    })

const user = new User()
user.plan // null

Method definition

A method can be defined to create custom behaviour in an entity:

const User = 
    entity('User', {
        ...
        role: field(String),
        hasAccess() { return this.role === "admin" },
    })

const user = new User()
const access = user.hasAccess()

TODO

  • Field basic JS type definition and validation (ex: "name": String)
  • Field entity type definition and validation (ex: "user": User)
  • Field enum type definition and validation (ex: "paymentType": ['CC', 'Check'])
  • Field list type definition and validation (ex: "users": [User])
  • Entity custom methods (ex: payment.calculate())
  • Default values
  • Entity (complex) validation (ex: payment.validate() )
  • Field validation error message (ex: payment.errors )
  • Field validation error code (ex: payment.errors )
  • I18n field validation error message
  • Entity hidrate (ex: fromJson)
  • Entity serialize (ex: toJson)
  • Extend / Custom field validation (ex: email, greater than, etc)
  • Be able to change validation lib (validate.js)
  • Valitation contexts (ex: Payment validation for [1] credit card or [2] check)
  • Conditional Validation (ex: if email is present, emailConfirmation must be present)
  • Entities Inheritance (schema and validations inheritance)

Keywords

FAQs

Package last updated on 28 Jan 2020

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc