Skip to content

charlypoly/functional-json-schema

Folders and files

NameName
Last commit message
Last commit date

Latest commit

a8d8c0d · Jan 13, 2021

History

47 Commits
May 21, 2018
Jan 12, 2021
Jan 13, 2021
Jan 13, 2021
May 22, 2018
May 22, 2018
Jan 13, 2021
May 18, 2018
Jan 13, 2021
May 23, 2018
Jan 13, 2021
Jan 13, 2021
Jan 12, 2021
Jan 12, 2021

Repository files navigation

functional-json-schema

Build a JSON Schema with functions

Schema DSL

Simple schema

import * as schema from 'functional-json-schema';

const JsonSchema = schema.schema({
  person: {
    friends: schema.types.arrayOf(schema.types.definition('user')),
        id: 'string*',
        friend_ids: schema.types.arrayOf(schema.types.definition('User'), { required: true }),
    }
}, null, { schema: 'http://json-schema.org/draft-06/schema#' })

/*
=> {
  $schema: 'http://json-schema.org/draft-06/schema#',
  type: 'object',
  properties: {
    person: {
      type: 'object',
      properties: {
        friends: {
          "type": "array",
          "items": {
            "$ref": "#/definitions/User"
          }
        },
        (...)
      },
      required: ['friends', 'id']
    }
  }
}
*/

Schema with definitions

import * as schema from 'functional-json-schema';

const schemaWithDefinitions = schema(
  {
    community_list: {
      portfolio_ids: types.arrayOf("string", { required: true }),
      project_id: types.type("string", { required: true }),
      status: types.enumOf("active", "inactive"),
      user: types.anyOf(types.definition("User"), types.definition("Admin")),
    },
  }, {
    User: {
      firstName: types.type("string"),
      lastName: types.type("string"),
      jobTitle: types.type("string"),
      companyId: types.type("string"),
    },
  },
  { schema: 'http://json-schema.org/draft-06/schema#' }
);

/*
=> {
  $schema: 'http://json-schema.org/draft-06/schema#',
  type: "object",
  properties: {
    community_list: {
      type: "object",
      properties: {
        portfolio_ids: {
          type: "array",
          items: {
            type: "string",
          },
        },
        project_id: {
          type: "string",
        },
        user: {
          anyOf: [
            { $ref: "#/definitions/User" },
            { $ref: "#/definitions/Admin" },
          ],
        },
        status: {
          enum: ["active", "inactive"],
        },
      },
      required: ["portfolio_ids", "project_id"],
    },
  },
  definitions: {
    User: {
      type: "object",
      properties: {
        firstName: {
          type: "string",
        },
        lastName: {
          type: "string",
        },
        jobTitle: {
          type: "string",
        },
        companyId: {
          type: "string",
        },
      },
      required: [],
    },
  }
}
*/

standalone definition DSL

import * as schema from 'functional-json-schema';

const JsonSchemaDefinition = schema.definition(
  'User',
  {
    firstName: schema.types.type('string'),
    lastName: schema.types.type('string'),
    jobTitle: schema.types.type('string'),
    companyId: schema.types.type('string'),
  },
  { title: "User", description: "Fake User Object" }
)

/*
=> {
  "$ref": "#/definitions/User",
  "definitions": {
      "User": {
          "type": "object",
          "title": "User",
          "description": "Fake User Object",
          "properties": {
              "firstName": {
                  "type": "string"
              },
              "lastName": {
                  "type": "string"
              },
              "jobTitle": {
                  "type": "string"
              },
              "companyId": {
                  "type": "string"
              }
          },
          required: [],
      }
  }
}
*/