typescript-mysql-model
Version:
{ "version": "1.3.0", "name": "typescript-mysql-model", "description": "", "main": "index.js", "types": "index.d.ts", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { "type": "git", "url": "
84 lines • 3.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const changeCase = require("change-case");
const enum_matcher_1 = require("./enums/enum-matcher");
class InterfaceBuilder {
constructor(settings, mysqlTypes, schema) {
this.settings = settings;
this.mysqlTypes = mysqlTypes;
this.schema = schema;
this.matcher = new enum_matcher_1.EnumMatcher();
}
renderTs(tableClass, table) {
const extraImports = [];
let stringBuilder = this.settings.defaultClassModifier + " " + tableClass.prefixedClassName + " { \n";
for (const colName in table) {
const col = table[colName];
stringBuilder += this.buildTypeRow(col, tableClass, colName);
if (this.isEnum(col)) {
extraImports.push(col);
}
}
stringBuilder += "}\n";
const importStatements = new Set();
if (extraImports.length) {
if (tableClass.isTable) {
let relativePath = "../enums/" + changeCase.paramCase(tableClass.tableName) + ".generated";
const tableImportArr = [changeCase.constant(tableClass.tableName)];
importStatements.add(this.importStatement(tableImportArr, relativePath));
}
else {
const bestMatches = extraImports.map(c => this.matcher.run(this.schema, c, tableClass.tableName));
bestMatches.forEach(b => {
let relativePath = "../enums/" + changeCase.paramCase(b.table) + ".generated";
importStatements.add(this.importStatement([changeCase.constant(b.table)], relativePath));
});
}
}
const importStr = [...importStatements].join("");
return this.getMetaText() + "\n" + importStr + "\n" + stringBuilder;
}
importStatement(fieldNames, relativePath) {
return `import { ${fieldNames.join(", ")} } from "${relativePath}"\n`;
}
getMetaText() {
let meta = `/**\n * Autogenerated interface, DO NOT MODIFY\n */\n`;
meta += "/* tslint:disable */\n";
return meta;
}
buildTypeRow(col, tableClass, colName) {
const tabs = "\t";
const optional = this.settings.optionalParameters ? "?" : "";
const tsType = this.getTsType(col, tableClass, colName);
const field = col.field;
return `${tabs}"${field}"${optional}: ${tsType};\n`;
}
;
isEnum(col) {
var _a;
return !!((_a = col.enumValues) === null || _a === void 0 ? void 0 : _a.length);
}
getTsType(col, tableClass, colName) {
if (this.isEnum(col)) {
if (tableClass.isTable) {
return changeCase.constantCase(tableClass.tableName) + "." + changeCase.constantCase(col.field);
}
else {
const matches = this.matcher.run(this.schema, col, colName);
if (!matches) {
throw new Error("No matching column");
}
return changeCase.constantCase(matches.table) + "." + changeCase.constantCase(matches.field);
}
}
let ts = this.mysqlTypes[col.type];
if (!ts) {
// tslint:disable-next-line:no-console
console.error("Unknown type " + col.type);
return "unknown";
}
return ts;
}
}
exports.InterfaceBuilder = InterfaceBuilder;
//# sourceMappingURL=interface-builder.js.map