Security News
tea.xyz Spam Plagues npm and RubyGems Package Registries
Tea.xyz, a crypto project aimed at rewarding open source contributions, is once again facing backlash due to an influx of spam packages flooding public package registries.
Readme
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.
$ npm install gotu
const { entity, field } = require('gotu')
const Feature =
entity('Feature', {
name: field(String),
hasAccess: field(Boolean)
})
const Plan =
entity('Plan', {
name: field(String),
monthlyCost: field(Number)
})
const User =
entity('User', {
name: field(String),
lastAccess: field(Date),
accessCount: field(Number),
features: field([Feature]),
plan: field(Plan),
})
const user = new User()
user.name = "Beth"
user.plan.monthlyCost = 10
user.features = [
new Feature(),
new Feature(),
new Feature()
]
user.validate()
A value of an field can be validated against the field type or its custom 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: [ wrongType: 'String' ], plan: { monthlyCost: [ wrongType: 'Number' ] } }
user.isValid() // false
You can also simplify you validation method using isValid()
method that execute validate implicit for you entity and return true/false in a single execution and also you can check the errors.
const Plan =
entity('Plan', {
...
monthlyCost: field(Number),
})
const plan = new Plan()
plan.plan.monthlyCost = true
plan.isValid() // false
plan.errors // { monthlyCost: [ wrongType: 'Number' ] }
For custom validation Gotu uses Herbs JS Suma library under the hood. It has no message defined, only error codes.
Use { validation: ... }
to specify a valid Suma validation (sorry) on the field definition.
const User =
entity('User', {
...
password: field(String, validation: {
presence: true,
length: { minimum: 6 }
}),
cardNumber: field(String, validation: {
custom: { invalidCardNumber: (value) => value.length === 16 }
})
})
const user = new User()
user.password = '1234'
user.cardNumber = '1234456'
user.validate()
user.errors // [{ password: [ { isTooShort: 6 } ] , { "invalidCardNumber": true }]
user.isValid // false
fromJSON(value)
Returns a new instance of a entity
const User =
entity('User', {
name: field(String)
})
// from object
const user = User.fromJSON({ name: 'Beth'})
// or string
const user = User.fromJSON(`{ "name": "Beth"}`)
By default fromJSON
serializes only keys that have been defined in the entity. If you want to add other keys during serialization, use .fromJSON(data, { allowExtraKeys: true })
.
By default, fromJSON
default field values will be applied for keys not present in value
.
JSON.stringify(entity)
To serialize an entity to JSON string use JSON.stringify
or entity.toJSON
function.
const json = JSON.stringify(user) // { "name": "Beth" }
By default toJSON
serializes only keys that have been defined in the entity. If you want to add other keys during serialization, use entity.toJSON({ allowExtraKeys: true })
.
A entity field type has a name, type, default value, validation and more.
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)
})
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)
})
For complex types, with deep relationship between entities, a field can contain a list of entity type:
const Plan =
entity('Plan', {
...
monthlyCost: field(Number),
})
const User =
entity('User', {
...
plan: field([Plan])
})
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:
Type | Default Value |
---|---|
Number | 0 |
String | "" |
Boolean | false |
Date | null |
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
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()
Entity.parentOf
Check if a instance is the same type from its parent entity class (similar to instanceOf
)
const AnEntity = entity('A entity', {})
const AnSecondEntity = entity('A second entity', {})
const instance1 = new AnEntity()
const instance2 = new AnSecondEntity()
AnEntity.parentOf(instance1) // true
AnEntity.parentOf(instance2) // false
entity.isEntity
Check if an object is a Gotu Entity class
const AnEntity = entity('A entity', {})
const instance1 = new AnEntity()
entity.isEntity(AnEntity) // true
entity.isEntity(Object) // false
Come with us to make an awesome Gotu.
Now, if you do not have technical knowledge and also have intend to help us, do not feel shy, click here to open an issue and collaborate their ideas, the contribution may be a criticism or a compliment (why not?)
If you would like to help contribute to this repository, please see CONTRIBUTING
Gotu Kola has been used historically to relieve congestion from upper respiratory infections and colds and for wound healing. It is very popular for treating varicose veins and memory loss.
https://en.wikipedia.org/wiki/Centella_asiatica
Gotu is released under the MIT license.
FAQs
Domain entities javascript library.
The npm package gotu receives a total of 11 weekly downloads. As such, gotu popularity was classified as not popular.
We found that gotu demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
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.
Security News
Tea.xyz, a crypto project aimed at rewarding open source contributions, is once again facing backlash due to an influx of spam packages flooding public package registries.
Security News
As cyber threats become more autonomous, AI-powered defenses are crucial for businesses to stay ahead of attackers who can exploit software vulnerabilities at scale.
Security News
UnitedHealth Group disclosed that the ransomware attack on Change Healthcare compromised protected health information for millions in the U.S., with estimated costs to the company expected to reach $1 billion.