Small library without dependencies to create JSON Schemas in a concise way.
Example:
const ms = require('microschema') ms.strictObj({ identityId: 'string:required', clientId: 'number', redirectUri: 'string:uri', scope: 'string', ipAddress: ms.string({pattern: ''}), children: ms.arrayOf(ms.strictObj({ scope: 'string' })) })
Strings
Using the ms.string() method:
ms.string() output = {type: 'string'})
ms.string({pattern: '[a-z]+'}) // Passing a javascript RegExp is equivalent to the above ms.string({pattern: /[a-z]+/}) output = { type: 'string', pattern: '[a-z]+' }
Specifying a format:
ms.string({format: 'email'}) output = { type: 'string', format: 'email' }
Note: Check which formats are available with your JSON Schema implementation before using this.
Specifying min and max length:
ms.string({minLength: 3, maxLength: 50}) output = { type: 'string', minLength: 3, maxLength: 50 }
Setting the required flag (only possible within an object):
ms.obj({ foo: ms.required.string() }) output = { type: 'object', required: ['foo'], properties: { foo: { type: 'string' } } }
Simplified usage within objects:
ms.obj({ foo: 'string' }) output = { type: 'object', properties: { foo: { type: 'string' } } }
ms.obj({ foo: 'string:required' }) output = { type: 'object', required: ['foo'], properties: { foo: { type: 'string' } } }
Numbers and Integers
Simplified usage within objects:
ms.obj({ foo: 'string' })
Using the ms.number() method:
ms.number() output = {type: 'number'}
ms.number({min: 0, max: 10}) output = { type: 'number', minimum: 0, maximum: 10 }
Using the ms.integer() method:
ms.integer() output = {type: 'integer'}
The integer() methods also accepts min and max params the same as number() does.
Booleans
ms.boolean() output = {type: 'boolean'})
Simplified usage within objects:
ms.obj({ foo: 'boolean:required' }) output = { type: 'object', required: ['foo'], properties: { foo: { type: 'boolean' } } }
Null
ms.null() output = {type: 'null'})
Objects
ms.obj() output = {type: 'object'}
Don't allow additional properties with strictObj():
ms.strictObj({ count: ms.integer() }) output = { type: 'object', additionalProperties: false, properties: { count: {type: 'integer'} } }
Add title and description annotations to the schema:
ms.obj({ displayName: 'string', }, {title: 'Title', description: 'Desc.'}) output = { type: 'object', title: 'Title', description: 'Desc.', properties: { displayName: {type: 'string'} } }
Add dependencies:
ms.obj({ creditCard: 'string', address: 'string' }, {dependencies: {creditCard: 'address'}}) output = { type: 'object', properties: { creditCard: {type: 'string'}, address: {type: 'string'} }, dependencies: { creditCard: ['address'] } }
Set a default value in case the property is absent:
ms.obj({ creditCard: 'string', address: 'string' }, {default: {}}) output = { type: 'object', default: {}, properties: { count: {type: 'integer'} } }
Arrays
ms.arrayOf(ms.string()) output = { type: 'array', items: {type: 'string'} }
You can use these additional modifiers:
ms.arrayOf(ms.string(), {minItems: 1, maxItems: 3, uniqueItems: true}) output = { type: 'array', items: {type: 'string'}, minItems: 1, maxItems: 3, uniqueItems: true }
Enumerations
// All values in an enumeration must be of the same type. ms.enum('foo', 'bar') output = { type: 'string', enum: ['foo', 'bar'] }
Constant Value
ms.const('foo') // The output is the same as ms.enum('foo') as there is no equivalent // to value in JSON schema. output = { type: 'string', const: 'foo' }
Combining Types
ms.types('string', 'number') output = { type: ['string', 'number'] } ms.types(ms.string({format: 'uri'}), ms.number({min: 0})) output = { type: ['string', 'number'], format: 'uri', minimum: 0 }
anyOf / oneOf / allOf
ms.anyOf('number', ms.obj({foo: 'string'})) output = { anyOf: [ {type: 'number'}, { type: 'object', properties: { foo: {type: 'string'} } } ] }
Note: you can also pass an array as the first argument
$id / $ref
ms.$id('#user').obj({ name: 'string', friend: ms.$ref('#user') }) output = { $id: '#user', type: 'object', properties: { name: {type: 'string'} friend: {$ref: '#user'} } }
definitions
ms.definitions({ user: ms.obj({name: 'string'}) }).obj({ name: 'string', friend: ms.$ref('#/definitions/user') }) output = { definitions: { user: { type: 'object', properties: { name: {type: 'string'} } } } type: 'object', properties: { name: {type: 'string'} friend: {$ref: '#/definitions/user'} } }