jormaechea/open-api-mocker

View on GitHub
lib/components/schemas/structs.js

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
'use strict';

const { struct } = require('superstruct');

const ExternalDocsStruct = require('../../external-documentation/structs');
const ReferenceStruct = require('../../structs/reference');

const optionalListOf = elementsStruct => struct.optional(struct.list([elementsStruct]));
const optionalUnionOf = validStructs => struct.optional(struct.union(validStructs));

const referenceUnion = otherStruct => struct.union([otherStruct, ReferenceStruct]);

const getDefaultType = ({ allOf, oneOf, anyOf }) => (allOf || oneOf || anyOf ? undefined : 'object');

const getDefaultTypeFlags = ({ type, allOf, oneOf, anyOf }) => {

    const finalType = type || getDefaultType({ allOf, oneOf, anyOf });

    return finalType ? false : undefined;
};

const SchemaStruct = struct.intersection([
    'object',
    struct.interface({
        title: 'string?',
        multipleOf: 'number?',
        maximum: 'number?',
        exclusiveMaximum: 'boolean?',
        minimum: 'number?',
        exclusiveMinimum: 'boolean?',
        maxLength: 'number?',
        minLength: 'number?',
        pattern: 'string|regexp?',
        maxItems: 'number?',
        minItems: 'number?',
        uniqueItems: 'boolean?',
        maxProperties: 'number?',
        minProperties: 'number?',
        required: struct.union(['boolean?', struct.optional(['string'])]),
        enum: optionalListOf(struct.union(['string', 'number', 'boolean'])),
        type: 'string?',
        allOf: struct.lazy(() => optionalListOf(referenceUnion(SchemaStruct))),
        oneOf: struct.lazy(() => optionalListOf(referenceUnion(SchemaStruct))),
        anyOf: struct.lazy(() => optionalListOf(referenceUnion(SchemaStruct))),
        not: struct.lazy(() => struct.optional(referenceUnion(SchemaStruct))),
        items: struct.lazy(() => struct.optional(referenceUnion(SchemaStruct))),
        properties: struct.lazy(() => struct.optional(struct.dict(['string', referenceUnion(SchemaStruct)]))),
        additionalProperties: optionalUnionOf([
            'boolean',
            struct.lazy(() => referenceUnion(SchemaStruct))
        ]),
        description: 'string?',
        format: 'string?',
        default: optionalUnionOf([struct.literal(null), 'string', 'number', 'boolean', 'object', 'array']),
        nullable: 'boolean?',
        readOnly: 'boolean?',
        writeOnly: 'boolean?',
        externalDocs: ExternalDocsStruct,
        example: optionalUnionOf([struct.literal(null), 'string', 'number', 'boolean', 'object', 'array']),
        deprecated: 'boolean?'
    }, {
        type: getDefaultType,
        nullable: getDefaultTypeFlags,
        readOnly: getDefaultTypeFlags,
        writeOnly: getDefaultTypeFlags,
        deprecated: getDefaultTypeFlags
    })
]);

module.exports = SchemaStruct;