BuckleScript bindings to Ajv (Another JSON Validator)
To be able to use standardized validation schemas across our JavaScript and BuckleScript based code.
Add the bs-ajv package to your project via yarn/npm
yarn add bs-ajv
Add bs-ajv to your bsconfig.json
{
"dependencies": [ "bs-ajv" ]
}
Enjoy!
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.
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)
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)
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