jsonschema2ts
Version:
A project to get typescript files from mongo json schema derived from Mongo Compass
95 lines (86 loc) • 3.45 kB
text/typescript
import { BsonTypeElement, Welcome, WelcomeField } from './SchemaMapper'
import { Schema } from './schema';
import {plainToClass, plainToInstance} from 'class-transformer'
class JsonSchemaToTsConverter{
jsonSchema:Welcome;
json:any;
schema = new Schema();
typeCount = 1;
interfaceTypeMapping = {
"String":"String",
"Document": "Object",
"Undefined" : "undefined",
"Int32":"Number",
"ObjectID": "ObjectId",
"Double":"Number",
"Date":"Date",
"Null":"null"
};
schemaTypeMapping = {
"String":"String",
"Document": "Schema.Types.ObjectId",
"Undefined" : "undefined",
"Int32":"Number",
"ObjectID": "Schema.Types.ObjectId",
"Double":"Number",
"Date":"Date",
"Null":"null"
}
JsonSchemaToTsConverter(){
}
generateInterface(){
this.json = this.schema.jsonSchema;
this.jsonSchema = plainToInstance(Welcome,this.json);
let interfaceString: string = "interface Type" + this.typeCount++ + " extends Document{"
this.jsonSchema.fields.forEach((field:WelcomeField) => {
if(field.name.indexOf("_") != 0){
interfaceString+=this.getFields(field);
}
});
interfaceString+="}\n\n";
console.log(interfaceString);
return interfaceString;
}
generateSchema(){
this.json = this.schema.jsonSchema;
this.jsonSchema = plainToInstance(Welcome,this.json);
let schemaString: string = "const type" + this.typeCount++ + " = new Schema({"
this.jsonSchema.fields.forEach((field:WelcomeField) => {
if(field.name.indexOf("_") != 0){
schemaString+=this.getSchemaFields(field);
}
});
schemaString+="});\n\n";
console.log(schemaString);
return schemaString;
}
getSchemaFields(field: WelcomeField):string{
let types:BsonTypeElement[] = (Array.isArray(field.type)) ? field.type : [field.type];
let fieldString:string = field.name + " : { type : " + this.getSchemaTypes(types) + "}, \n";
return fieldString;
}
getSchemaTypes(types:BsonTypeElement[]):string{
let typeString: string = "";
types.forEach((type) => {
if(typeString.indexOf(this.schemaTypeMapping[type]) == -1 && type.toLocaleLowerCase() != "undefined")
typeString += this.schemaTypeMapping[type] + "|";
});
return typeString.substring(0, typeString.lastIndexOf("|"));
}
getFields(field: WelcomeField):string{
let types:BsonTypeElement[] = (Array.isArray(field.type)) ? field.type : [field.type];
let fieldString:string = field.name + " :" + this.getTypes(types) + "; \n";
return fieldString;
}
getTypes(types:BsonTypeElement[]):string{
let typeString: string = "";
types.forEach((type) => {
if(typeString.indexOf(this.interfaceTypeMapping[type]) == -1)
typeString += this.interfaceTypeMapping[type] + "|";
});
return typeString.substring(0, typeString.lastIndexOf("|"));
}
}
let jsonConverter = new JsonSchemaToTsConverter();
jsonConverter.generateInterface();
jsonConverter.generateSchema();