Skip to content
This repository has been archived by the owner on Mar 17, 2023. It is now read-only.

Build fast and strict JavaScript object form validators using IPLD Schemas

License

Notifications You must be signed in to change notification settings

rvagg/js-ipld-schema-validator

Repository files navigation

ipld-schema-validator

ARCHIVED: The functionality of this library has been rolled in to @ipld/schema, found here: https://github.com/ipld/js-ipld-schema

Build fast and strict JavaScript object form validators using IPLD Schemas.

Example

import { parse as parseSchema } from 'ipld-schema'
import { create as createValidator } from 'ipld-schema-validator'

// Build an IPLD Schema from the text form
const schemaText = `
type FooBarBazStruct struct {
  bim Int
  bam String
  boom Bool
} representation tuple

type MyList [Int]

type MyStruct struct {
  foo FooBarBazStruct
  bar MyList
  baz String
}
`

// Compile it to its object descriptor form which SchemaValidator consumes
const schemaDescriptor = parseSchema(schemaText)

// Create a validator function from the Schema descriptor, with 'MyStruct' as the
// root type to inspect
const myStructValidator = createValidator(schemaDescriptor, 'MyStruct')

// An object that matches our schema
const obj = {
  foo: [1, 'one', true],
  bar: [1, 2, 3, 4],
  baz: 'baz'
}

console.log('Validating object as MyStruct:', myStructValidator(obj)) // true
obj.boop = true // modify the object, adding an additional property not defined by the schema
console.log('Validating modified object as MyStruct:', myStructValidator(obj)) // false

// Make another validator function but use the 'MyList' (`[Int]`) type as the root
const myListValidator = createValidator(schemaDescriptor, 'MyList')

console.log('Validating [1, 2, 3] as MyStruct:', myListValidator([1, 2, 3])) // true
console.log('Validating object as MyStruct:', myListValidator(obj)) // false
console.log('Validating [1, \'one\', true] as MyStruct:', myListValidator([1, 'one', true])) // false
console.log('Validating {} as MyStruct:', myListValidator({})) // false

Note that ipld-schema is needed to if you want to use the human-readable Schema text form. ipld-schema-validator consumes the object descriptor form, it is not recommended that you craft this form by hand.

Limitations

Currently ipld-schema-validator supports the full IPLD Schema specification except for the following:

  • Maps with stringpairs representation
  • Struct with stringpairs representation
  • Struct with stringjoin representation

Floats & Ints

Unfortunately, in JavaScript, an "integer" is really just a floating point number with a 0 after the decimal point (all numbers in JavaScript are IEEE754 double-precision floats). So we have no clean way to say whether a number is strictly an integer and not a "float" in terms of the IPLD Data Model.

This library takes the following approach:

  • An "int" is a number that passes the Number.isInteger() test.
  • A "float" is a number that is not Infinity or -Infinity.

Therefore, it is possible for the same number to pass as both an int and a float IPLD kind.

License & Copyright

Copyright 2020 Rod Vagg

Licensed under Apache 2.0 (LICENSE-APACHE / http://www.apache.org/licenses/LICENSE-2.0)

About

Build fast and strict JavaScript object form validators using IPLD Schemas

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •