1.0.0 • Published 1 year ago

@didkovsky/metatype v1.0.0

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

Metatype

Metatype is a runtime type validation system for browser and nodejs.

Installing

npm i @didkovsky/metatype

Usage

Check /examples folder.

Create objects

const { defineType, getFactory } = require('@didkovsky/metatype')

// Type name
const typeName = 'Human'

// Type description
const schema = { name: 'string', age: 'number' }

// Define type
const factory = defineType(typeName, schema)

{
  // Will works only for types defined by defineType()
  factory = getFactory(typeName)
}

// Create object
const human = factory.create({ name: 'John', age: 23 })

// { human: { name: 'John', age: 23 } }
console.dir({human})

// Will throw: Error: Invalid "age" type.
// factory.create({ name: 'John', age: '23' })

Validate objects

const { defineType } = require('@didkovsky/metatype')

// Type description
const schema = { name: 'string', age: 'number' }

// Define type
const factory = defineType('Human', schema)

// Validate struct (will return true)
const isValid = factory.validate({ name: 'John', age: 23 })

// { isValid: true }
console.dir({ isValid })

// Will throw: Error: Invalid "age" type.
// factory.validate({ name: 'John', age: '23' })

Type reference

const { defineType } = require('@didkovsky/metatype')

// Define types
const animalFactory = defineType('Animal', { name: 'string', age: 'number' })
const humanFactory = defineType('Human', { name: 'string', age: 'number', pet: 'Animal' })

// Create objects
const pet = animalFactory.create({ name: 'Lex', age: 3 })
const human = humanFactory.create({ name: 'John', age: 23, pet })

// { human: { name: 'John', age: 23, pet: { name: 'Lex', age: 3 } } }
console.dir({human})

// Or
{
  const human = humanFactory.create({ name: 'John', age: 23, pet: { name: 'Lex', age: 3 }})
}

// Validate (will return true)
const isValid = humanFactory.validate({ name: 'John', age: 23, pet: { name: 'Lex', age: 3 }})

// { isValid: true }
console.dir({isValid})

// Will throw: Error: Invalid "age" type.
// humanFactory.validate({ name: 'John', age: 23, pet: { name: 'Lex', age: '3' }})

Native objects reference

const { defineType } = require('@didkovsky/metatype')

// Custom function
function MyFunction () {}

// Custom class
class MyClass {}

// Define type
const factory = defineType('Type1', {
  arr: Array,
  buff: Buffer,
  customFunction: MyFunction,
  customClass: MyClass
})

// Create object
const obj = factory.create({
  arr: [1, 2, 3],
  buff: Buffer.alloc(1),
  customFunction: new MyFunction(),
  customClass: new MyClass()
})

/*
obj: {
    arr: [ 1, 2, 3 ],
    buff: Buffer(1) [Uint8Array] [ 0 ],
    customFunction: MyFunction {},
    customClass: MyClass {}
  }
*/
console.dir({obj})

Type indexes

const { MetaFactory } = require('@didkovsky/metatype')

// Types indexes
const indexA = new Map()
const indexB = new Map()

// Type name and definition
const typeName = 'MyType'
const schema = { a: 'string', b: 'number' }

// Create fectory in indexA
const factory = new MetaFactory(typeName, schema, indexA)
console.dir({factory})

// Will throw, because typeName already defined in indexA
// new MetaFactory(typeName, schema, indexA)

{
  // Ok, because typeName is not defined in indexB
  const factory = new MetaFactory(typeName, schema, indexB)
  console.dir({factory})
}