1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const change_case = require("change-case");
|
4 | const handlebars = require("handlebars");
|
5 | const LINE = "let query = `CALL ${name}(${questionMarks});`; ";
|
6 | const template = `/**
|
7 | * Auto generated, do not modify!
|
8 | */
|
9 | /* eslint-disable */
|
10 | import * as Knex from "knex";
|
11 | export 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 | `;
|
25 | const fnTemplate = `
|
26 | async {{{fnName}}}({{{typeNameList}}}):Promise<any>{
|
27 | return await this.callSp("{{{name}}}"{{{commaSepParamNames}}});
|
28 | }
|
29 | `;
|
30 | class 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 | }
|
78 | exports.default = SpBuilder;
|
79 |
|
\ | No newline at end of file |