metaforge
v1.0.0
Published
Library that allow you to describe data structures by subset of JavaScript syntax and validate them at runtime
Downloads
14
Maintainers
Readme
Describe your data structures by subset of JavaScript and:
- 📝 Generate data relational structures (types, jsdoc, diagrams, migrations, etc.)
- 🔎 Validate it in runtime with strict & partial validations
- 👀 Send it to other server to validate data consistency
- 🛠️ Handle it with custom modules
- 💉 Calculate fields
Installation
npm i metaforge --save
Usage example
const userSchema = new Schema({
$id: 'userSchema',
$meta: { '@name': 'User', '@description': 'Schema for user testing' }, //? JSDOC
phone: { $type: 'union', types: ['number', 'string'] }, //? number or string
name: { $type: 'set', items: ['string', '?string'] }, //? set tuple
phrase: (sample, parent, root) => 'Hello ' + [...parent.name].join(' ') + ' !', // Calculated fields
mask: { $type: 'array', items: 'string' }, //? array of strings
ip: {
$meta: { '@description': 'User ip adress' },
$type: 'array',
$required: false,
$rules: [ip => ip[0] === '192'], //? custom rules
items: {
$type: 'union',
types: ['string', 'number', 'null'], // Array<string | null | number>
condition: 'oneof',
$required: true,
},
},
type: ['elite', 'member', 'guest'], //? enum
'/[a-Z]+Id/': { $type: '?number', isPattern: true }, // pattern fields
address: 'string',
secondAddress: '?string', // optional fields
options: { notifications: 'boolean', lvls: ['number', 'string'] },
});
const systemSchema = new Schema({ $type: 'array', items: userSchema });
const sample = [
{
myId: 1,
phone: '7(***)...',
ip: ['192', 168, '1', null],
type: 'elite',
mask: ['255', '255', '255', '0'],
name: new Set(['Alexander', undefined]),
options: { notifications: true, lvls: [2, '["admin", "user"]'] },
address: 'Pushkin street',
},
//...
];
systemSchema.warnings; // Inspect warnings after build
systemSchema.calculate(sample); // Will assign calculated fields
systemSchema.test(sample); // Schema validation
systemSchema.dts('SystemInterface'); // Typescript generation
systemSchema.pull('userSchema').test(sample[0]); // Subschema validation
systemSchema.pull('userSchema').test({ phone: 123 }, 'root', true); // Partial validation
systemSchema.pull('userSchema'); // Metadata: {..., name: 'user', description: 'schema for users testing'}
Docs
About modules / plugins
- Writing custom modules
- Metatype | generate type annotations from schema
- Handyman | quality of life module
- Metatest | adds prototype testing
About prototypes