@juneil/tschema
Version:
111 lines • 3.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
require("reflect-metadata");
const draft_07_1 = require("./drafts/draft-07");
const common_1 = require("./common");
/**
* Integer decorator
*/
function integerDecorator() {
return (target, key) => {
addRule(target, key, common_1.INTEGER, null);
};
}
function itemDecorator(type) {
return (target, key) => {
addRule(target, key, common_1.ITEM, type);
};
}
function enumDecorator(...values) {
return (target, key) => {
addRule(target, key, common_1.ENUM, values);
};
}
/**
* Required decorator
*/
function requiredDecorator() {
return (target, key) => {
propertyDecorator()(target, key);
addRule(target, key, common_1.REQUIRED, null);
};
}
/**
* Called by the @Property decorator
* Add the property type in the class metadata
*/
function propertyDecorator() {
return (target, key) => {
let type = Reflect.getMetadata('design:type', target, key);
if (type === Object) {
const instance = Reflect.construct(target.constructor, []);
if (instance[key] instanceof Array) {
type = Array;
}
else {
type = serializeType(typeof instance[key]);
}
}
addRule(target, key, common_1.TYPE, type);
};
}
function addRule(target, key, rule, value) {
const props = Reflect.getOwnMetadata(common_1.PROPERTIES, target.constructor) || [];
const prop = props.find(p => p.key === key);
if (prop && !prop.rules.find(r => r.rule === rule)) {
prop.rules.push({ rule, value });
}
else {
props.push({ key, rules: [{ rule, value }] });
}
Reflect.defineMetadata(common_1.PROPERTIES, props, target.constructor);
}
function serializeType(type) {
switch (type) {
case 'number':
return Number;
case 'string':
return String;
case 'boolean':
return Boolean;
case 'undefined':
return undefined;
case 'function':
return Function;
default:
return Object;
}
}
function getProperties(target) {
const parent = Reflect.getPrototypeOf(target);
let props = Reflect.getOwnMetadata(common_1.PROPERTIES, target);
if (parent['name']) {
props = [].concat(props, getProperties(parent));
}
return props;
}
exports.getProperties = getProperties;
function serialize(target) {
const jsc = new draft_07_1.JSONSchemaDraft07(target.name, getProperties(target));
return jsc.toJSONSchema();
}
function containsProperties(token) {
return token && !!Reflect.getOwnMetadataKeys(token).find(t => t === common_1.PROPERTIES);
}
function propertiesList(token) {
return getProperties(token)
.map(prop => (Object.assign({}, (prop.rules || []).find(rule => rule.rule === common_1.TYPE), { key: prop.key })))
.reduce((a, c) => {
a[c.key] = c.value;
return a;
}, {});
}
exports.Optional = propertyDecorator;
exports.Required = requiredDecorator;
exports.Integer = integerDecorator;
exports.Item = itemDecorator;
exports.Enum = enumDecorator;
exports.isTSchema = containsProperties;
exports.serializer = serialize;
exports.properties = propertiesList;
//# sourceMappingURL=tschema.js.map