class-validator-jsonschema
Version:
Convert class-validator-decorated classes into JSON schema
103 lines • 9.95 kB
JavaScript
;
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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