typescript-mysql-model
Version:
{ "version": "1.2.46", "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":
115 lines (109 loc) • 4.51 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const change_case = require("change-case");
const handlebars = require("handlebars");
const schema_operator_1 = require("./schema-operator");
const TEMPLATE = `/**
* Autogenerated, do not modify
*/
/* tslint:disable */
import * as Knex from "knex";
{{#each imports}}{{{this}}}
{{/each}}
export default class Getter {
constructor(private knex: Knex) {
}
private async getSingle(tableName: string, keyObject: { [key: string]: any }, fn?: (knex: Knex.QueryBuilder) => Knex.QueryBuilder | void): Promise<any> {
let query = this.knex(tableName).select().limit(1).where(keyObject);
if (fn) {
const subQuery = fn(query);
if(subQuery){
query = subQuery;
}
}
const reply: any[] = await query;
return reply.shift();
}
private async getFromTable(tableName: string, fn?: (knex: Knex.QueryBuilder) => Knex.QueryBuilder | void, limit?: number): Promise<any[]> {
let query = this.knex(tableName).select();
if (fn) {
const subQuery = fn(query);
if(subQuery){
query = subQuery;
}
}
if(limit){
query.limit(limit);
}
return await query;
}
private async countTable(tableName: string, fn?: (knex: Knex.QueryBuilder) => Knex.QueryBuilder | void): Promise<number> {
let query = this.knex(tableName).select(this.knex.raw("count(*) as c"));
if (fn) {
const subQuery = fn(query);
if(subQuery){
query = subQuery;
}
}
const reply: Array<{ c: number }> = await query;
return reply[0].c;
}
{{#each getters}}{{{this}}}{{/each}}
{{#each counters}}{{{this}}}{{/each}}
{{#each singulars}}{{{this}}}{{/each}}
}`;
const GET_TEMPLATE = `
public list{{fnName}}(fn?: (knex: Knex.QueryBuilder) => Knex.QueryBuilder | void, limit?: number): Promise<{{prefixedClassName}}[]> {
return this.getFromTable("{{tableName}}", fn, limit);
}
`;
const GET_SINGULAR = `
public getSingle{{fnName}}({{#each params}}{{{this}}}{{#unless }},{{/unless}}{{/each}}, fn?: (knex: Knex.QueryBuilder) => Knex.QueryBuilder | void): Promise<{{prefixedClassName}}> {
return this.getSingle("{{tableName}}", { {{#each fields}}{{{this}}}{{#unless }},{{/unless}}{{/each}} } ,fn);
}
`;
const COUNT_TEMPLATE = `
public count{{fnName}}(fn?: (knex: Knex.QueryBuilder) => Knex.QueryBuilder | void): Promise<number> {
return this.countTable("{{tableName}}", fn);
}
`;
class GettersBuilder extends schema_operator_1.SchemaOperator {
constructor(model, typeMap) {
super();
this.typeMap = typeMap;
this.definition = model;
this.compiledTemplate = handlebars.compile(TEMPLATE);
this.compiledGetTemplate = handlebars.compile(GET_TEMPLATE);
this.compiledCountInsertTemplate = handlebars.compile(COUNT_TEMPLATE);
this.compailedGetSingularTemplate = handlebars.compile(GET_SINGULAR);
}
render(tables, relativePath = "./") {
tables = [...tables];
tables.forEach(t => {
t.fnName = change_case.upperCaseFirst(t.fnName);
t.fnPlural = change_case.upperCaseFirst(t.fnPlural);
});
const input = {
getters: tables.map(t => this.compiledGetTemplate(t)),
imports: tables.map(t => this.renderImportRow(t, relativePath)),
counters: tables.map(t => this.compiledCountInsertTemplate(t)),
singulars: tables.filter(t => t.isTable).map(t => this.compailedGetSingularTemplate(this.renderGetSingularTemplateInput(t)))
};
return this.compiledTemplate(input);
}
renderGetSingularTemplateInput(t) {
let d = t;
d["fields"] = this.getPrimaryKeyNames(t.tableName);
d["params"] = this.getPkCols(t.tableName).map(col => {
return col.field + ": " + this.typeMap.get(col.type);
});
return d;
}
renderImportRow(table, relativePath) {
table = Object.assign({}, table);
table.filename = table.filename.replace(".ts", "");
return `import {${table.prefixedClassName}} from "${relativePath}${table.filename}"`;
}
}
exports.GettersBuilder = GettersBuilder;
//# sourceMappingURL=getter-builder.js.map