UNPKG

class-validator-jsonschema

Version:

Convert class-validator-decorated classes into JSON schema

103 lines 9.95 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const cv = require("class-validator"); const _ = require("lodash"); const decorators_1 = require("./decorators"); const defaultConverters_1 = require("./defaultConverters"); const options_1 = require("./options"); var decorators_2 = require("./decorators"); exports.JSONSchema = decorators_2.JSONSchema; function validationMetadatasToSchemas(userOptions) { const options = Object.assign(Object.assign({}, options_1.defaultOptions), userOptions); const metadatas = getMetadatasFromStorage(options.classValidatorMetadataStorage); const schemas = _(metadatas) .groupBy('target.name') .mapValues((ownMetas) => { const target = ownMetas[0].target; const metas = ownMetas.concat(getInheritedMetadatas(target, metadatas)); const properties = _(metas) .groupBy('propertyName') .mapValues((propMetas, propKey) => { const schema = applyConverters(propMetas, options); return applyDecorators(schema, target, options, propKey); }) .value(); const definitionSchema = { properties, type: 'object', }; const required = getRequiredPropNames(target, metas, options); if (required.length > 0) { definitionSchema.required = required; } return applyDecorators(definitionSchema, target, options, target.name); }) .value(); return schemas; } exports.validationMetadatasToSchemas = validationMetadatasToSchemas; function getMetadatasFromStorage(storage) { const metadatas = _.get(storage, 'validationMetadatas'); const constraints = _.get(storage, 'constraintMetadatas'); return metadatas.map((meta) => { if (meta.constraintCls) { const constraint = constraints.find((c) => c.target === meta.constraintCls); if (constraint) { return Object.assign(Object.assign({}, meta), { type: constraint.name }); } } return meta; }); } function getInheritedMetadatas(target, metadatas) { return metadatas.filter((d) => d.target instanceof Function && target.prototype instanceof d.target && !_.find(metadatas, { propertyName: d.propertyName, target, type: d.type, })); } function applyConverters(propertyMetadatas, options) { const converters = Object.assign(Object.assign({}, defaultConverters_1.defaultConverters), options.additionalConverters); const convert = (meta) => { var _a; const typeMeta = (_a = options.classTransformerMetadataStorage) === null || _a === void 0 ? void 0 : _a.findTypeMetadata(meta.target, meta.propertyName); const isMap = typeMeta && typeMeta.reflectedType && new typeMeta.reflectedType() instanceof Map; const converter = converters[meta.type] || converters[cv.ValidationTypes.CUSTOM_VALIDATION]; const items = _.isFunction(converter) ? converter(meta, options) : converter; if (meta.each && isMap) { return { additionalProperties: Object.assign({}, items), type: 'object', }; } return meta.each ? { items, type: 'array' } : items; }; return _.merge({}, ...propertyMetadatas.map(convert)); } function applyDecorators(schema, target, options, propertyName) { const additionalSchema = decorators_1.getMetadataSchema(target.prototype, propertyName); return _.isFunction(additionalSchema) ? additionalSchema(schema, options) : _.merge({}, schema, additionalSchema); } function getRequiredPropNames(target, metadatas, options) { function isDefined(metas) { return _.some(metas, { type: cv.ValidationTypes.IS_DEFINED }); } function isOptional(metas) { return _.some(metas, ({ type }) => _.includes([cv.ValidationTypes.CONDITIONAL_VALIDATION, cv.IS_EMPTY], type)); } return _(metadatas) .groupBy('propertyName') .pickBy((metas) => { const [own, inherited] = _.partition(metas, (d) => d.target === target); return options.skipMissingProperties ? isDefined(own) || (!isOptional(own) && isDefined(inherited)) : !(isOptional(own) || isOptional(inherited)); }) .keys() .value(); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxzQ0FBcUM7QUFHckMsNEJBQTJCO0FBRzNCLDZDQUFnRDtBQUNoRCwyREFBdUQ7QUFDdkQsdUNBQW9EO0FBRXBELDJDQUF5QztBQUFoQyxrQ0FBQSxVQUFVLENBQUE7QUFLbkIsU0FBZ0IsNEJBQTRCLENBQUMsV0FBK0I7SUFDMUUsTUFBTSxPQUFPLG1DQUNSLHdCQUFjLEdBQ2QsV0FBVyxDQUNmLENBQUE7SUFFRCxNQUFNLFNBQVMsR0FBRyx1QkFBdUIsQ0FDdkMsT0FBTyxDQUFDLDZCQUE2QixDQUN0QyxDQUFBO0lBRUQsTUFBTSxPQUFPLEdBQW9DLENBQUMsQ0FBQyxTQUFTLENBQUM7U0FDMUQsT0FBTyxDQUFDLGFBQWEsQ0FBQztTQUN0QixTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUN0QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBa0IsQ0FBQTtRQUM3QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO1FBRXZFLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7YUFDeEIsT0FBTyxDQUFDLGNBQWMsQ0FBQzthQUN2QixTQUFTLENBQUMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDaEMsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUNsRCxPQUFPLGVBQWUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMxRCxDQUFDLENBQUM7YUFDRCxLQUFLLEVBQUUsQ0FBQTtRQUVWLE1BQU0sZ0JBQWdCLEdBQWlCO1lBQ3JDLFVBQVU7WUFDVixJQUFJLEVB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