0.3.24 • Published 1 year ago
@teamplay/sharedb-schema v0.3.24
ShareDB-Schema
- ShareDB plugin for schema validation
- Uses z-schema, which supports JSON-Schema v4
- Schema validation executes in sync
validatehook, so you validate the actual result of operation - Supports custom validators with async and sync logic
- Custom validators can preload data in async hook to use it later in sync
Known Issues
- Works only with JSON OT type
- Format functions should be sync
- For every op the whole doc validates each time, because it`s the only case when z-schema returns full path to wrong fields
Installation
yarn add @teamplay/sharedb-schemaSetting
Step 1. Options
var options = {
schemas: {
users: {
title: 'Example Schema',
type: 'object',
properties: {
nickname: {
type: 'string',
format: 'xstring', // custom format
minLength: 1,
maxLength: 10,
},
email: {
type: 'string',
format: 'email',
},
age: {
description: 'Age in years',
type: 'integer',
minimum: 0,
},
roleId: {
type: 'string',
collection: 'roles', // additional field for 'join' custom validator
validators: ['join'], // custom validators
},
hobbies: {
type: 'array',
maxItems: 3,
items: {
type: 'string',
},
uniqueItems: true,
},
},
required: ['email'],
}
},
// JSON-Schema formats can be added here. They should be sync
formats: {
xstring: function(str) {
return str !== 'xxx';
}
},
// Custom validators
validators: {
// join - is working example of custom validator. It ensures that value is id of doc of specific collection
join: {
async: function (context, done) {
var id = context.value // here is value for this op
if (!id) return done()
var collection = context.schema.collection // context.schema - is schema of current property
var model = this.store.createModel()
var $entity = model.at(collection + '.' + id)
model.fetch($entity, function (err) {
if (err) return done(err)
if (!$entity.get()) {
return done(Error('No ' + collection + ' with id ' + id))
}
done()
})
},
},
// this is example of custom validator, that preloads data and uses it later
preload: {
async: function (context, done) {
var model = this.store.createModel() // that`s how to get model
var $someData = model.at('some.path')
model.fetch($someData, function (err) {
if (err) return done(err)
var data = $someData.get()
done(null, data) // pass data as second parameter
})
},
sync: function (value, context) {
var data = context.data // preloaded data is here
return true || false
},
},
},
}Step 2. Plugin
Add the sharedbSchemaInit function to your server/index.js
const sharedbSchemaInit = require('@teamplay/sharedb-schema')and then call this function in the backend event
eventEmitter.on('backend', async backend => {
sharedbSchemaInit(backend, options)
})License
MIT
Copyright (c) 2016 Pavel Zhukov
0.3.20
1 year ago
0.3.24
1 year ago
0.3.23
1 year ago
0.3.22
1 year ago
0.3.21
1 year ago
0.3.19
1 year ago
0.3.17
1 year ago
0.3.18
1 year ago
0.3.16
1 year ago
0.3.15
1 year ago
0.3.14
1 year ago
0.3.13
1 year ago
0.3.12
1 year ago
0.3.11
1 year ago
0.3.10
1 year ago
0.3.9
1 year ago
0.3.8
1 year ago
0.3.7
1 year ago
0.3.6
1 year ago
0.3.5
1 year ago
0.3.4
1 year ago
0.3.3
1 year ago
0.3.1
1 year ago
0.3.0
1 year ago
0.2.6
1 year ago
0.2.5
1 year ago
0.2.4
1 year ago
0.2.3
1 year ago
0.2.2
1 year ago
0.2.1
1 year ago
0.2.0
1 year ago
0.1.16
2 years ago
0.1.15
2 years ago
0.1.14
2 years ago
0.1.13
2 years ago
0.1.12
2 years ago
0.1.11
2 years ago
0.1.10
2 years ago
0.1.9
2 years ago
0.1.8
2 years ago
0.1.7
2 years ago
0.1.6
2 years ago
0.1.5
2 years ago