UNPKG

2.62 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const change_case = require("change-case");
4const handlebars = require("handlebars");
5const LINE = "let query = `CALL ${name}(${questionMarks});`; ";
6const template = `/**
7 * Auto generated, do not modify!
8 */
9/* eslint-disable */
10import * as Knex from "knex";
11export default class StoredProcedures {
12 constructor(private knex:Knex){
13
14 }
15
16 async callSp(name: string, ...args:any[]):Promise<any>{
17 let questionMarks = args.map(() => "?").join(", ");
18 ${LINE}
19 let resp = await this.knex.raw(query,args);
20 return resp[0][0];
21 }
22 {{#each strFunctions}}{{{this}}}{{/each}}
23}
24`;
25const fnTemplate = `
26 async {{{fnName}}}({{{typeNameList}}}):Promise<any>{
27 return await this.callSp("{{{name}}}"{{{commaSepParamNames}}});
28 }
29`;
30class SpBuilder {
31 constructor(procedures, types) {
32 this.procedures = procedures;
33 this.types = types;
34 this.compiledTemplate = handlebars.compile(template);
35 this.compiledFunctionTemplate = handlebars.compile(fnTemplate);
36 }
37 renderTemplate() {
38 const strFunctions = [];
39 for (const key in this.procedures) {
40 strFunctions.push(this.renderFunction(this.procedures[key]));
41 }
42 const input = { strFunctions: strFunctions };
43 const output = this.compiledTemplate(input);
44 return output;
45 }
46 getMySqlType(param) {
47 return this.types[param.dataType];
48 }
49 toTsParamNotation(param) {
50 return param.parameterName + ": " + this.getMySqlType(param);
51 }
52 renderFunction(procedure) {
53 let params = [];
54 for (const key in procedure.parameters) {
55 params.push(procedure.parameters[key]);
56 }
57 params = params.filter(p => p.parameterMode === "IN");
58 params.sort((a, b) => {
59 return a.ordinalPosition - b.ordinalPosition;
60 });
61 let commaSepParamNames = params.map(p => p.parameterName).join(", ");
62 if (params.length === 0) {
63 commaSepParamNames = "";
64 }
65 else {
66 commaSepParamNames = ", " + commaSepParamNames;
67 }
68 const typeNameList = params.map(p => this.toTsParamNotation(p)).join(", ");
69 const input = {
70 commaSepParamNames: commaSepParamNames,
71 fnName: change_case.camelCase(procedure.name),
72 name: procedure.name,
73 typeNameList: typeNameList
74 };
75 return this.compiledFunctionTemplate(input);
76 }
77}
78exports.default = SpBuilder;
79//# sourceMappingURL=sp-builder.js.map
\No newline at end of file