Skip to content

Repository files navigation

master build

Getting started

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.

overview

Data layer is defined as a superposition of three kinds of building blocks:

  • Record classes with typed attributes.
  • Ordered collections 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.

Installation and requirements

Is packed as UMD and ES6 module. No peer dependencies are required.

npm install type-r --save-dev

IE10+, Edge, Safari, Chrome, and Firefox are supported IE9 and Opera may work but has not been tested. IE8 won't work.

About

Reactive and serializable objects with transactional changes.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages