diff --git a/README.md b/README.md index b5120cc..d77d33b 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,21 @@ Builds a logical conjunction (AND) of multiple [JSON schemas](https://json-schem #### resolvers -A list of default resolvers that __merge-json-schema__ uses to merge JSON schemas. You can override the default resolvers by passing a list of custom resolvers in the `options` argument of `mergeSchemas`. See [keywordResolver](#keywordresolver-keyword-values-mergedschema-parentschemas-options). +A list of default resolvers that __merge-json-schema__ uses to merge JSON schemas. You can override the default resolvers by passing resolver functions against the keywords in the `options` argument of `mergeSchemas`. You may either pass in your own custom resolver functions or utilize the ones exposed via the `resolvers` object from the library. See [keywordResolver](#keywordresolver-keyword-values-mergedschema-parentschemas-options). + +__Example:__ Overriding the default resolver(intersection) with a union function for the `enum` keyword. + +```javascript +const schemaMerger = require('@fastify/merge-json-schemas'); +const mergedSchema = schemaMerger.mergeSchemas( + schemas, + { + resolvers: { + enum: schemaMerger.resolvers.arraysUnion + }, + } +); +``` #### defaultResolver diff --git a/index.js b/index.js index 5721eb4..90b4529 100644 --- a/index.js +++ b/index.js @@ -353,4 +353,4 @@ function mergeSchemas (schemas, options = {}) { return _mergeSchemas(schemas, options) } -module.exports = { mergeSchemas, keywordsResolvers, defaultResolver, ...errors } +module.exports = { mergeSchemas, keywordsResolvers, defaultResolver, resolvers, ...errors } diff --git a/test/exports.test.js b/test/exports.test.js new file mode 100644 index 0000000..1c6332e --- /dev/null +++ b/test/exports.test.js @@ -0,0 +1,22 @@ +const { resolvers } = require('../index') +const assert = require('node:assert/strict') +const { test } = require('node:test') + +test('Exported resolvers: should export all expected resolvers', () => { + assert(Object.prototype.hasOwnProperty.call(resolvers, 'arraysIntersection')) + assert(Object.prototype.hasOwnProperty.call(resolvers, 'hybridArraysIntersection')) + assert(Object.prototype.hasOwnProperty.call(resolvers, 'arraysUnion')) + assert(Object.prototype.hasOwnProperty.call(resolvers, 'minNumber')) + assert(Object.prototype.hasOwnProperty.call(resolvers, 'maxNumber')) + assert(Object.prototype.hasOwnProperty.call(resolvers, 'commonMultiple')) + assert(Object.prototype.hasOwnProperty.call(resolvers, 'allEqual')) + assert(Object.prototype.hasOwnProperty.call(resolvers, 'booleanAnd')) + assert(Object.prototype.hasOwnProperty.call(resolvers, 'booleanOr')) + assert(Object.prototype.hasOwnProperty.call(resolvers, 'skip')) +}) + +test('Exported resolvers: should ensure each resolver is a function', () => { + Object.values(resolvers).forEach((resolver) => { + assert.strictEqual(typeof resolver, 'function') + }) +}) diff --git a/types/index.d.ts b/types/index.d.ts index ab29554..8754569 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -59,3 +59,15 @@ export function mergeSchemas (schemas: any[], options?: MergeOptions): any export const keywordsResolvers: KeywordResolvers export const defaultResolver: KeywordResolver +export const resolvers: { + arraysIntersection: KeywordResolver; + hybridArraysIntersection: KeywordResolver; + arraysUnion: KeywordResolver; + minNumber: KeywordResolver; + maxNumber: KeywordResolver; + commonMultiple: KeywordResolver; + allEqual: KeywordResolver; + booleanAnd: KeywordResolver; + booleanOr: KeywordResolver; + skip: KeywordResolver; +} diff --git a/types/index.test-d.ts b/types/index.test-d.ts index 7d82a14..e6eace9 100644 --- a/types/index.test-d.ts +++ b/types/index.test-d.ts @@ -1,4 +1,4 @@ -import { mergeSchemas, MergeOptions } from '..' +import { mergeSchemas, MergeOptions, resolvers, KeywordResolver } from '..' import { expectType } from 'tsd' { @@ -50,3 +50,14 @@ import { expectType } from 'tsd' mergeSchemas([schema1, schema2], mergeOptions) } + +expectType(resolvers.arraysIntersection) +expectType(resolvers.hybridArraysIntersection) +expectType(resolvers.arraysUnion) +expectType(resolvers.minNumber) +expectType(resolvers.maxNumber) +expectType(resolvers.commonMultiple) +expectType(resolvers.allEqual) +expectType(resolvers.booleanAnd) +expectType(resolvers.booleanOr) +expectType(resolvers.skip)