UNPKG

2.57 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const change_case = require("change-case");
4const handlebars = require("handlebars");
5const TEMPLATE = `/**
6 * Auto generated, do not modify!
7 */
8/* eslint-disable */
9import Knex = require("knex");
10import { IDatabaseSchema } from "typescript-mysql-model/lib/mysql-database-definition";
11import { SchemaOperator } from "typescript-mysql-model";
12{{#each imports}}{{{this}}}
13{{/each}}
14
15export default class Updater extends SchemaOperator {
16
17 public constructor(private knex: Knex, definition: IDatabaseSchema) {
18 super();
19 this.definition = definition;
20 }
21
22 protected async runQuery(q: Knex.QueryBuilder) {
23 await q;
24 }
25
26 protected async update<T extends { [key: string]: any }>(tableName: string,
27 data: T, fn?: (knex: Knex.QueryBuilder) => Knex.QueryBuilder): Promise<T> {
28 const criterions: { [key: string]: any } = this.retainPrimaryKeys(tableName, data);
29 data = this.removePrimaryKeys(tableName, data);
30 if (Object.keys(data).length > 0) {
31 let query = this.knex(tableName).where(criterions).update(data);
32 if (fn) {
33 query = fn(query);
34 }
35 await this.runQuery(query);
36 }
37 return data;
38 }
39{{#each updaters}}{{{this}}}{{/each}}
40}`;
41const UPDATE_TEMPLATE = `
42 public update{{fnName}}(item: {{prefixedClassName}}, fn?: (knex: Knex.QueryBuilder) => Knex.QueryBuilder): Promise<{{prefixedClassName}}> {
43 return this.update("{{tableName}}", item, fn);
44 }
45`;
46class UpdateBuilder {
47 constructor() {
48 this.compiledTemplate = handlebars.compile(TEMPLATE);
49 this.compiledUpdateTemplate = handlebars.compile(UPDATE_TEMPLATE);
50 }
51 renderUpdater(tables, relativePath = "./") {
52 tables = JSON.parse(JSON.stringify(tables));
53 tables.forEach(t => {
54 t.fnName = change_case.upperCaseFirst(t.fnName);
55 t.fnPlural = change_case.upperCaseFirst(t.fnPlural);
56 });
57 const input = {
58 updaters: tables.map(t => this.compiledUpdateTemplate(t)),
59 imports: tables.map(t => this.renderImportRow(t, relativePath))
60 };
61 return this.compiledTemplate(input);
62 }
63 renderImportRow(table, relativePath) {
64 table = JSON.parse(JSON.stringify(table));
65 table.filename = table.filename.replace(".ts", "");
66 return `import {${table.prefixedClassName}} from "${relativePath}${table.filename}"`;
67 }
68}
69exports.UpdateBuilder = UpdateBuilder;
70//# sourceMappingURL=update-builder.js.map
\No newline at end of file