Socket
Book a DemoInstallSign in
Socket

@jsonhero/schema-generator

Package Overview
Dependencies
Maintainers
2
Versions
4
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@jsonhero/schema-generator

Generate a draft-07 JSON schema definitions from an example JSON document

latest
Source
npmnpm
Version
0.2.2
Version published
Maintainers
2
Created
Source

Schema Generator

Generate a draft-07 JSON schema definitions from an example JSON document

Coverage lines

Features

  • Generate a draft-07 JSON schema definitions from an example JSON document
  • Easy to use
  • Supports string formats (with more to come)
  • Can generate either a strict or liberal schema

Usage

Install Schema Generator

$ npm install --save @jsonhero/schema-generator

generateSchema takes either a JSON object/array or JSON stringified and returns a valid draft-07 JSON Schema

const { generateSchema } = require("@jsonhero/schema-generator");

const exampleJSON = {
  id: 1234,
  name: "Eric",
  image: {
    url: "https://foo.com/image.png",
  },
  email: "eallam@icloud.com",
  homepage: "http://github.com/ericallam",
  createdAt: "2021-12-17T12:55:58.141Z",
  tags: ["foo", "bar"],
  isAdmin: true,
};

const schema = generateSchema(exampleJSON);

// Now validate the provided JSON using the generated schema using ajv
const Ajv = require("ajv");
const ajv = new Ajv();
const addFormats = require("ajv-formats");
addFormats(ajv);

const validate = ajv.compile(schema);
const valid = validate(exampleJSON); // valid == true

The Schema generated in the above example

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://jsonhero.io/schemas/root.json",
  "type": "object",
  "properties": {
    "id": {
      "type": "number"
    },
    "name": {
      "type": "string"
    },
    "image": {
      "type": "object",
      "properties": {
        "url": {
          "type": "string",
          "format": "uri"
        }
      },
      "required": [],
      "additionalProperties": true
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "homepage": {
      "type": "string",
      "format": "uri"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "friends": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "number"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [],
        "additionalProperties": true
      }
    },
    "isAdmin": {
      "type": "boolean"
    }
  },
  "required": [],
  "additionalProperties": true
}

By default all properties are optional and additionalProperties are allowed. You can set the strict option to true if you'd like a more restrictive schema

const { generateSchema } = require("@jsonhero/schema-generator");

const exampleJSON = {
  id: 1234,
  name: "Eric",
  image: {
    url: "https://foo.com/image.png",
  },
  email: "eallam@icloud.com",
  homepage: "http://github.com/ericallam",
  createdAt: "2021-12-17T12:55:58.141Z",
  tags: ["foo", "bar"],
  isAdmin: true,
};

const schema = generateSchema(exampleJSON, { strict: true });

// Now validate the provided JSON using the generated schema using ajv
const Ajv = require("ajv");
const ajv = new Ajv();
const addFormats = require("ajv-formats");
addFormats(ajv);

const validate = ajv.compile(schema);
const valid = validate(exampleJSON); // valid == true

The Schema generated in the above example

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://jsonhero.io/schemas/root.json",
  "type": "object",
  "properties": {
    "id": {
      "type": "number"
    },
    "name": {
      "type": "string"
    },
    "image": {
      "type": "object",
      "properties": {
        "url": {
          "type": "string",
          "format": "image"
        }
      },
      "required": ["url"],
      "additionalProperties": false
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "homepage": {
      "type": "string",
      "format": "uri"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "friends": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "number"
          },
          "name": {
            "type": "string"
          }
        },
        "required": ["id", "name"],
        "additionalProperties": false
      }
    },
    "isAdmin": {
      "type": "boolean"
    }
  },
  "required": [
    "id",
    "name",
    "image",
    "email",
    "homepage",
    "createdAt",
    "tags",
    "friends",
    "isAdmin"
  ],
  "additionalProperties": false
}

Generate Schema currently supports a few string formats

  • Strings that are URLs will have the uri format
  • Strings that are Date/Times will have the date-time format
  • Strings that are emails will have the email format

If you are using ajv to use the generated schema, make sure to use the ajv-formats package

const addFormats = require("ajv-formats");
addFormats(ajv);

You can also set the baseURI of the schema (i.e. the top level $id property)

const { generateSchema } = require("@jsonhero/schema-generator");

const exampleJSON = {
  foo: "bar",
};

const schema = generateSchema(exampleJSON, {
  baseURI: "https://example.com/schemas/root.json",
});
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://example.com/schemas/root.json",
  "type": "object",
  "properties": {
    "foo": {
      "type": "string"
    }
  },
  "required": [],
  "additionalProperties": true
}

Roadmap

  • Support more draft versions of JSON Schema
  • Support JSON Type Definitions
  • Support enums and constants
  • Support more string formats (regex, ipv4, ipv6, hostname, JSONPointer, time, date, uuid)
  • Add examples

Keywords

json

FAQs

Package last updated on 17 Dec 2021

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts