'use strict'; // ////////////////////////////////////////////////////////////////////////////// // / DISCLAIMER // / // / Copyright 2015 ArangoDB GmbH, Cologne, Germany // / // / Licensed under the Apache License, Version 2.0 (the "License") // / you may not use this file except in compliance with the License. // / You may obtain a copy of the License at // / // / http://www.apache.org/licenses/LICENSE-2.0 // / // / Unless required by applicable law or agreed to in writing, software // / distributed under the License is distributed on an "AS IS" BASIS, // / WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // / See the License for the specific language governing permissions and // / limitations under the License. // / // / Copyright holder is ArangoDB GmbH, Cologne, Germany // / // / @author Alan Plum // ////////////////////////////////////////////////////////////////////////////// var _ = require('lodash'), joi = require('joi'); function toJSONSchema (id, schema) { var jsonSchema = { id: id, required: [], properties: {} }; if (!schema) { return jsonSchema; } if ( typeof schema.toJSONSchema === 'function' && schema.toJSONSchema !== toJSONSchema && schema.toJSONSchema !== require('@arangodb/foxx/legacy/model').Model.toJSONSchema ) { // allow overriding toJSONSchema. return schema.toJSONSchema(id); } if (typeof schema === 'function') { // assume schema is a Model schema = schema.prototype.schema || {}; } if (!schema.isJoi) { schema = joi.object().keys(schema); } var description = schema.describe(); if (description.type !== 'object') { return jsonSchema; } _.each(description.children, function (attributeDescription, attributeName) { var attributeSchema = {type: attributeDescription.type}, rules = attributeDescription.rules, flags = attributeDescription.flags; if (flags && flags.presence === 'required') { jsonSchema.required.push(attributeName); } if ( attributeSchema.type === 'number' && _.isArray(rules) && _.some(rules, function (rule) { return rule.name === 'integer'; }) ) { attributeSchema.type = 'integer'; } jsonSchema.properties[attributeName] = attributeSchema; }); if (!jsonSchema.required.length) { delete jsonSchema.required; } return jsonSchema; } exports.toJSONSchema = toJSONSchema;