You signed in with another tab or window.Reload to refresh your session.You signed out in another tab or window.Reload to refresh your session.You switched accounts on another tab or window.Reload to refresh your session.Dismiss alert
Type-R is the modern JS data framework to manage complex domain and UI application state. Features:
It's mapped to JSON by default. The mapping can handle sophisticated scenarios with nested JSON and relations by id, and can be easily customized for every particular attribute or class.
All changes are observable, happens in the scope of transactions, and there's the fine-grained change events system.
Validation is performed on the first access to the validation error and never happens twice for unchanged data.
Everything is typed at run-time and is protected from improper updates. The shape of generated JSON and data classes is guaranteed to match the definitions.
It still looks like regular JS classes and is freaking fast. Type-R data structures are about 10 times faster than Backbone models and collections.
Data layer is defined as a superposition of three kinds of building blocks:
Record classes with typed attributes.
Orderedcollections of records.
Stores are records with a set of collections in its attributes used to resolve id-references in JSON.
IOEndpoints is an entity encapsulating I/O transport which represent the persistent collection of records.
Type-R is completely unopinionated on the client-server transport protocol and the view layer technology. It's your perfect M and VM in modern MVVM or MVC architecture.
import{define,Record}from'type-r'// Define email attribute type with encapsulated validation check.constEmail=String.has.check(x=>x!||x.indexOf('@')>=0,'Invalid email');@defineclassUserextendsRecord{staticattributes={name :String.isRequired,// should not be empty for the record to be valid.email :Email.isRequired}}@defineclassMessageextendsRecord{staticattributes={created :Date// = new Date()author :User,// aggregated User record.to :User.Collection,// aggregating collection of userssubject :'',body :''}}constmsg=newMessage();assert(!msg.isValid());// Is not valid because msg.author has empty attributes// Listen for the changes in aggregation tree...msg.on('change',()=>console.log('change!!!'));msg.transaction(()=>{// Prepare to make the sequence of changes on msgmsg.author.name='John Dee';// No 'change' event yet as we're in the transaction.msg.author.email='dee@void.com';assert(msg.isValid());// Now msg is valid as all of its attributes are valid.});// Got single 'change!!!' message in the console.