Home

Awesome

CI codecov npm

ReScript JSON Schema 📄

Typesafe JSON Schema for ReScript

Install

npm install rescript-json-schema rescript-schema

Then add rescript-json-schema and rescript-schema to bs-dependencies in your rescript.json:

{
  ...
+ "bs-dependencies": ["rescript-json-schema", "rescript-schema"]
+ "bsc-flags": ["-open RescriptSchema"],
}

Create JSON schemas with type safety

One of the library's main features is the rescript-schema, which provides a way to describe the schema of a value. This schema contains meta information used for parsing, serializing, and generating JSON Schema. When working with the library, you will mostly interact with rescript-schema to define the schema of the values you are working with.

For example, if you have the following schema:

type rating =
  | @as("G") GeneralAudiences
  | @as("PG") ParentalGuidanceSuggested
  | @as("PG13") ParentalStronglyCautioned
  | @as("R") Restricted
type film = {
  id: float,
  title: string,
  tags: array<string>,
  rating: rating,
  deprecatedAgeRestriction: option<int>,
}

let filmSchema = S.object(s => {
  id: s.field("Id", S.float),
  title: s.field("Title", S.string),
  tags: s.fieldOr("Tags", S.array(S.string), []),
  rating: s.field(
    "Rating",
    S.union([
      S.literal(GeneralAudiences),
      S.literal(ParentalGuidanceSuggested),
      S.literal(ParentalStronglyCautioned),
      S.literal(Restricted),
    ]),
  ),
  deprecatedAgeRestriction: s.field("Age", S.option(S.int)->S.deprecate("Use rating instead")),
})

You can use it to generate JSON Schema for the value it describes:

JSONSchema.make(filmSchema)
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "Id": { "type": "number" },
    "Title": { "type": "string" },
    "Tags": { "items": { "type": "string" }, "type": "array", "default": [] },
    "Rating": {
      "anyOf": [
        { "type": "string", "const": "G" },
        { "type": "string", "const": "PG" },
        { "type": "string", "const": "PG13" },
        { "type": "string", "const": "R" }
      ]
    },
    "Age": {
      "type": "integer",
      "deprecated": true,
      "description": "Use rating instead"
    }
  },
  "additionalProperties": true,
  "required": ["Id", "Title", "Rating"]
}

Create rescript-schema from JSON schema

Online

ReScript JSON Schema Online

Just paste your JSON schemas here!