one-schema
Version:
one-schema object validator
62 lines (61 loc) • 2.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateTypescriptInterface = void 0;
var FV_TYPE_TO_TS_TYPE = {
float64: 'number',
int32: 'number',
string: 'string',
bool: 'boolean',
};
function generateSubObjectInterfaceName(parentName, type, fieldName) {
return parentName + "_" + type + "_" + fieldName;
}
function primitiveSchemaFieldToType(fv) {
if (!FV_TYPE_TO_TS_TYPE.hasOwnProperty(fv.settings.type)) {
throw new Error("Invalid primative type " + fv.settings.type + "!");
}
return "" + FV_TYPE_TO_TS_TYPE[fv.settings.type];
}
function getTypeForField(fv, keyName, interfaceName, interfaceArray, subNameGenerator) {
if (fv.settings.type === 'object') {
var internalType = subNameGenerator(interfaceName, 'sub', keyName);
generateTypescriptInterfaceFull(fv, internalType, interfaceArray, subNameGenerator);
return internalType;
}
if (fv.settings.type === 'array') {
if (!fv.settings.arrayOf) {
return 'any[]';
}
return getTypeForField(fv.settings.arrayOf, keyName, interfaceName, interfaceArray, subNameGenerator) + "[]";
}
if (Array.isArray(fv.settings.oneOf) && fv.settings.oneOf.length) {
return "(" + fv.settings.oneOf.map(function (x) { return JSON.stringify(x); }).join(' | ') + ")";
}
return primitiveSchemaFieldToType(fv);
}
function generateTypescriptInterfaceFull(fv, interfaceName, interfaceArray, subNameGenerator) {
var subGen = typeof subNameGenerator === 'function' ? subNameGenerator : generateSubObjectInterfaceName;
if (!fv || !fv.settings || fv.settings.type !== 'object' || !fv.settings.schema) {
throw new Error('You can only convert one-schema schemas of type object to typescript!');
}
var schemaObj = fv.settings.schema;
var keys = Object.keys(schemaObj);
var keysLen = keys.length;
var typeFieldArray = [];
for (var i = 0; i < keysLen; i++) {
var field = schemaObj[keys[i]];
var fieldNamePrefix = JSON.stringify(keys[i]) + (field.settings.required ? '' : '?');
var fieldTSType = getTypeForField(field, keys[i], interfaceName, interfaceArray, subGen);
var fullField = fieldNamePrefix + ": " + fieldTSType + ";";
typeFieldArray.push(fullField);
}
var interfaceInner = keysLen === 0 ? '' : (" " + typeFieldArray.join('\n '));
var fullStr = "interface " + interfaceName + " {\n" + interfaceInner + "\n}";
interfaceArray.push(fullStr);
}
function generateTypescriptInterface(fv, interfaceName, subNameGenerator) {
var interfaceArray = [];
generateTypescriptInterfaceFull(fv, interfaceName, interfaceArray, subNameGenerator);
return interfaceArray.join('\n\n');
}
exports.generateTypescriptInterface = generateTypescriptInterface;