UNPKG

@juneil/tschema

Version:
111 lines 3.35 kB
"use strict"; 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