moddle
A utility library for working with meta-model based data structures.
What is it good for?
moddle offers you a concise way to define meta models in JavaScript. You can use these models to consume documents, create model elements, and perform model validation.
Define a schema
You start by creating a moddle schema. It is a JSON file which describes types, their properties, and relationships:
{
"$schema": "https://unpkg.com/moddle/resources/schema/moddle.json",
"name": "Cars",
"uri": "http://cars",
"prefix": "c",
"types": [
{
"name": "Base",
"properties": [
{ "name": "id", "type": "String", "isAttr": true }
]
},
{
"name": "Root",
"superClass": [ "Base" ],
"properties": [
{ "name": "cars", "type": "Car", "isMany": true }
]
},
{
"name": "Car",
"superClass": [ "Base" ],
"properties": [
{ "name": "name", "type": "String", "isAttr": true, "default": "No Name" },
{ "name": "power", "type": "Integer", "isAttr": true },
{ "name": "similar", "type": "Car", "isMany": true, "isReference": true },
{ "name": "trunk", "type": "Element", "isMany": true }
]
}
]
}
You may attach the provided JSON schema to get your moddle descriptor validated by code editor.
Instantiate moddle
You can instantiate a moddle instance with a set of defined schemas:
import { Moddle } from 'moddle';
var cars = new Moddle([ carsJSON ]);
Create objects
Use a moddle instance to create objects of your defined types:
var taiga = cars.create('c:Car', { name: 'Taiga' });
console.log(taiga);
// { $type: 'c:Car', name: 'Taiga' };
var cheapCar = cars.create('c:Car');
console.log(cheapCar.name);
// "No Name"
// really?
cheapCar.get('similar').push(taiga);
Introspect things
Then again, given the knowledge moddle has, you can perform deep introspection:
var carDescriptor = cheapCar.$descriptor;
console.log(carDescriptor.properties);
// [ { name: 'id', type: 'String', ... }, { name: 'name', type: 'String', ...} ... ]
Access extensions
moddle is friendly towards extensions and keeps unknown any properties around:
taiga.set('specialProperty', 'not known to moddle');
console.log(taiga.get('specialProperty'));
// 'not known to moddle'
It also allows you to create any elements for namespaces that you did not explicitly define:
var screwdriver = cars.createAny('tools:Screwdriver', 'http://tools', {
make: 'ScrewIt!'
});
car.trunk.push(screwdriver);
There is more
Have a look at our test coverage to learn about everything that is currently supported.
Resources
Related
- moddle-xml: read xml documents based on moddle descriptors
License
MIT