UNPKG

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
"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 @last}},{{/unless}}{{/each}}, fn?: (knex: Knex.QueryBuilder) => Knex.QueryBuilder | void): Promise<{{prefixedClassName}}> { return this.getSingle("{{tableName}}", { {{#each fields}}{{{this}}}{{#unless @last}},{{/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