2
63%
MIT
bs-ajv
1.0.1
BucklesScript bindings to Ajv (Another JSON Validator)

Build Status Coverage Status

bs-ajv

BuckleScript bindings to Ajv (Another JSON Validator)

Why?

To be able to use standardized validation schemas across our JavaScript and BuckleScript based code.

How do I install?

  1. Add the bs-ajv package to your project via yarn/npm

    yarn add bs-ajv
  2. Add bs-ajv to your bsconfig.json

    {
      "dependencies": [ "bs-ajv" ]
    }
  3. Enjoy!

Usage

The interface here is a bit rough, but it is usable and is used within production. Here are a few examples pulled from the Ajv docs.

Basic first example

  • RE
  • ML
let schema = Json.Encode.(object_([
  ("properties", object_([
    ("smaller", object_([
      ("type", string("number")),
      ("maximum", object_([
        ("$data", string("1/larger")),
      ])),
    ])),
    ("larger", object_([
      ("type", string("number")),
    ])),
  ])),
]));

let validData = Json.Encode.(object_([
  ("smaller", int(5)),
  ("larger", int(7)),
]));

AjvOptions.make()
|> AjvOptions.setData(_, Js.true_)
|> Ajv.ajv
|> Ajv.validate(`Schema(schema), validData)
/* This will return `Js.true_` */
let schema =
  let open Json.Encode in
    object_
      [("properties",
         (object_
            [("smaller",
               (object_
                  [("type", (string "number"));
                  ("maximum", (object_ [("$data", (string "1/larger"))]))]));
            ("larger", (object_ [("type", (string "number"))]))]))]
let validData =
  let open Json.Encode in object_ [("smaller", (int 5)); ("larger", (int 7))]
let _ =
  (((AjvOptions.make ()) |> (fun __x  -> AjvOptions.setData __x Js.true_)) |>
     Ajv.ajv)
    |> (Ajv.validate (`Schema schema) validData)

Example with a self reference

  • RE
  • ML
let schema = Json.Encode.(object_([
  ("additionalProperties", object_([
    ("type", string("string")),
    ("format", object_([ ("$data", string("0#")) ]))
  ])),
]));

let validData = Json.Encode.(object_([
  ("date-time", string("1963-06-19T08:30:06.283185Z")),
  ("email", string("joe.bloggs@example.com")),
]));

AjvOptions.make()
|> AjvOptions.setData(_, Js.true_)
|> Ajv.ajv
|> Ajv.validate(`Schema(schema), validData)
/* This will return `Js.true_` */
let schema =
  let open Json.Encode in
    object_
      [("additionalProperties",
         (object_
            [("type", (string "string"));
            ("format", (object_ [("$data", (string "0#"))]))]))]
let validData =
  let open Json.Encode in
    object_
      [("date-time", (string "1963-06-19T08:30:06.283185Z"));
      ("email", (string "joe.bloggs@example.com"))]
let _ =
  (((AjvOptions.make ()) |> (fun __x  -> AjvOptions.setData __x Js.true_)) |>
     Ajv.ajv)
    |> (Ajv.validate (`Schema schema) validData)

Example using schema compilation and additional property filtering

  • RE
  • ML
let schema = Json.Encode.(object_([
  ("additionalProperties", bool(false)),
  ("properties", object_([
    ("foo", object_([
      ("type", string("number")),
    ])),
    ("bar", object_([
      ("baz", object_([
        ("type", string("string")),
      ])),
    ])),
  ])),
]));

let validData = Json.Encode.(object_([
  ("foo", int(0)),
  ("additional1", int(1)),
  ("bar", object_([
    ("baz", string("abc")),
    ("additional2", int(2)),
  ])),
]));

AjvOptions.make()
|> AjvOptions.removeAdditional(_, Js.true_)
|> Ajv.ajv
|> Ajv.compile(schema)
|> (fun
  | `Sync(fn) => fn
  | `Async(_) => failwith("unexpected_async_mode")
  )
|> (v) => validate(validData)
|> (fun
  | `Valid(_) => Js.true_
  | `Invalid(_) => Js.false_
  )
/* This will return `Js.true_`
unknown refmt error