From f36272bfb654cc4fe712808354fbeec7dced04b9 Mon Sep 17 00:00:00 2001 From: Tom Collins Date: Thu, 18 Nov 2021 11:18:17 +0000 Subject: [PATCH] Allow AJV options to be passed in. --- README.md | 10 ++++++---- lib/json-schema-static-docs.js | 3 ++- lib/merger.js | 4 ++++ lib/validator.js | 7 +++++-- tests/validator.test.js | 14 +++++++++----- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index a6e62ac..146276e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ [![npm version](https://badge.fury.io/js/json-schema-static-docs.svg)](https://badge.fury.io/js/json-schema-static-docs) [![CircleCI](https://circleci.com/gh/tomcollins/json-schema-static-docs/tree/master.svg?style=svg)](https://circleci.com/gh/tomcollins/json-schema-static-docs/tree/master) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) - ## Installation ``` @@ -17,7 +16,10 @@ const JsonSchemaStaticDocs = require('json-schema-static-docs'); ( async () => { let jsonSchemaStaticDocs = new JsonSchemaStaticDocs({ inputPath: './schema', - outputPath: './docs' + outputPath: './docs', + ajvOptions: { + allowUnionTypes: true + } }); await jsonSchemaStaticDocs.generate(); console.log('Documents generated.'); @@ -26,9 +28,9 @@ const JsonSchemaStaticDocs = require('json-schema-static-docs'); ## Custom Templates -Templates are authored in [handlebars.js](https://handlebarsjs.com). +Templates are authored in [handlebars.js](https://handlebarsjs.com). -The default template is [templates/markdown/schema.hbs](https://github.com/tomcollins/json-schema-static-docs/blob/master/templates/markdown/schema.hbs). +The default template is [templates/markdown/schema.hbs](https://github.com/tomcollins/json-schema-static-docs/blob/master/templates/markdown/schema.hbs). You can provide your own custom templates using the `templatePath` option. diff --git a/lib/json-schema-static-docs.js b/lib/json-schema-static-docs.js index 5779f91..3ebcf4b 100644 --- a/lib/json-schema-static-docs.js +++ b/lib/json-schema-static-docs.js @@ -17,6 +17,7 @@ const defaultOptions = { additionalDataSources: {}, linkBasePath: "./", skipTemplates: false, + ajvOptions: {}, }; var JsonSchemaStaticDocs = function (options) { @@ -43,7 +44,7 @@ JsonSchemaStaticDocs.prototype.generate = async function () { unresolvedSchemas.forEach((schema) => { schemas.push(schema.data); }); - const validator = new Validator(schemas); + const validator = new Validator(schemas, this._options.ajvOptions); unresolvedSchemas.forEach((schema) => { try { diff --git a/lib/merger.js b/lib/merger.js index 8b4c889..a44a683 100644 --- a/lib/merger.js +++ b/lib/merger.js @@ -63,6 +63,10 @@ const resolveRef = ( }; const mergeProperty = (unresolvedSchema, mergedSchema, key) => { + if (!unresolvedSchema.data.properties || !mergedSchema.data.properties) { + return; + } + let unresolvedProperty = unresolvedSchema.data.properties[key]; let mergedProperty = mergedSchema.data.properties[key]; diff --git a/lib/validator.js b/lib/validator.js index 5c5ac48..97de5d7 100644 --- a/lib/validator.js +++ b/lib/validator.js @@ -1,8 +1,11 @@ const Ajv = require("ajv"); const addFormats = require("ajv-formats"); -let Validator = function (schemas) { - this._ajv = new Ajv({ schemas }); +let Validator = function (schemas, ajvOptions) { + let options = {}; + Object.assign(options, ajvOptions); + options.schemas = schemas; + this._ajv = new Ajv(options); addFormats(this._ajv); }; diff --git a/tests/validator.test.js b/tests/validator.test.js index 0a03367..f54c454 100644 --- a/tests/validator.test.js +++ b/tests/validator.test.js @@ -4,10 +4,12 @@ const Validator = require("../lib/validator.js"); let schema = { $id: "1", title: "1 unresolved", + type: "object", properties: { property1: { - type: "string", + type: ["string", "number"], }, + additionalProperties: false, }, additionalProperties: false, }; @@ -24,15 +26,17 @@ let dataInvalidType = { property1: null, }; +const defaultOptions = { allowUnionTypes: true }; + test("validates schemas and data", () => { - const validator = new Validator({ schemas: [schema] }); + const validator = new Validator([schema], defaultOptions); const result = validator.validateSchemaAndData(schema, dataValid); expect(result).toBe(true); }); test("fails with additional properties", () => { expect.assertions(2); - const validator = new Validator({ schemas: [schema] }); + const validator = new Validator([schema], defaultOptions); let result; try { result = validator.validateSchemaAndData(schema, dataInvalidAdditional); @@ -42,9 +46,9 @@ test("fails with additional properties", () => { } }); -test("XXX fails with invalid type", () => { +test("fails with invalid type", () => { expect.assertions(3); - const validator = new Validator({ schemas: [schema] }); + const validator = new Validator([schema], defaultOptions); let result; try { result = validator.validateSchemaAndData(schema, dataInvalidType);