1 | "use strict";
|
2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
3 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
4 | return new (P || (P = Promise))(function (resolve, reject) {
|
5 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
6 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
7 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
8 | step((generator = generator.apply(thisArg, _arguments || [])).next());
|
9 | });
|
10 | };
|
11 | Object.defineProperty(exports, "__esModule", { value: true });
|
12 | const change_case = require("change-case");
|
13 | const fs_1 = require("fs");
|
14 | const pluralize = require("pluralize");
|
15 | const abstract_handler_builder_1 = require("./abstract-handler-builder");
|
16 | const definition_builder_1 = require("./definition-builder");
|
17 | const enum_builder_1 = require("./enums/enum-builder");
|
18 | const getter_builder_1 = require("./getter-builder");
|
19 | const graphql_builder_1 = require("./graphql-builder");
|
20 | const inserter_builder_1 = require("./inserter-builder");
|
21 | const interface_builder_1 = require("./interface-builder");
|
22 | const model_builder_1 = require("./model-builder");
|
23 | const sp_builder_1 = require("./sp-builder");
|
24 | const table_columns_builder_1 = require("./table-columns-builder");
|
25 | const update_builder_1 = require("./update-builder");
|
26 | const enum_writer_1 = require("./enums/enum-writer");
|
27 | class TsBuilder {
|
28 | constructor(folder, schema) {
|
29 | this.mysqlTypes = {
|
30 | bigint: "number",
|
31 | blob: "any",
|
32 | char: "string",
|
33 | date: "Date | string",
|
34 | datetime: "Date | string",
|
35 | enum: "string",
|
36 | decimal: "number",
|
37 | double: "number",
|
38 | float: "number",
|
39 | int: "number",
|
40 | longblob: "any",
|
41 | longtext: "string",
|
42 | mediumtext: "string",
|
43 | set: "string",
|
44 | smallint: "number",
|
45 | text: "string",
|
46 | timestamp: "Date | string",
|
47 | tinyint: "boolean",
|
48 | varchar: "string"
|
49 | };
|
50 | this.settings = {
|
51 | appendIToDeclaration: true,
|
52 | appendIToFileName: true,
|
53 | camelCaseFnNames: true,
|
54 | defaultClassModifier: "export interface",
|
55 | interfaceFolder: "./interfaces/",
|
56 | optionalParameters: true,
|
57 | singularizeClassNames: true,
|
58 | suffixGeneratedToFilenames: true
|
59 | };
|
60 | this.folder = TsBuilder.normFolder(folder);
|
61 | if (schema) {
|
62 | this.schema = schema;
|
63 | }
|
64 | }
|
65 | static run(knex, folder) {
|
66 | return __awaiter(this, void 0, void 0, function* () {
|
67 | const builder = yield new TsBuilder(folder).init(knex);
|
68 | builder.renderDefault();
|
69 | });
|
70 | }
|
71 | static normFolder(folder) {
|
72 | if (!folder) {
|
73 | return "";
|
74 | }
|
75 | if (!(folder.endsWith("/") || folder.endsWith("\\"))) {
|
76 | folder += "/";
|
77 | }
|
78 | return folder;
|
79 | }
|
80 | getTypeMap() {
|
81 | const map = new Map();
|
82 | Object.keys(this.mysqlTypes).forEach((key) => map.set(key, this.mysqlTypes[key]));
|
83 | return map;
|
84 | }
|
85 | init(knex, dbName) {
|
86 | return __awaiter(this, void 0, void 0, function* () {
|
87 | const builder = new model_builder_1.default(knex, dbName);
|
88 | this.schema = yield builder.renderDatabaseSchema();
|
89 | return this;
|
90 | });
|
91 | }
|
92 | renderDefault() {
|
93 | if (!fs_1.existsSync(this.folder)) {
|
94 | fs_1.mkdirSync(this.folder);
|
95 | }
|
96 | console.log("Generator started");
|
97 | if (!fs_1.existsSync(this.intefaceFullPath())) {
|
98 | console.log("Mdir:" + this.intefaceFullPath());
|
99 | fs_1.mkdirSync(this.intefaceFullPath());
|
100 | }
|
101 | if (!fs_1.existsSync(this.graphQlFullPath())) {
|
102 | console.log("Mdir:" + this.graphQlFullPath());
|
103 | fs_1.mkdirSync(this.graphQlFullPath());
|
104 | }
|
105 | if (!fs_1.existsSync(this.enumsFullPath())) {
|
106 | console.log("Mdir:" + this.enumsFullPath());
|
107 | fs_1.mkdirSync(this.enumsFullPath());
|
108 | }
|
109 | if (!fs_1.existsSync(this.enumsQlFullPath())) {
|
110 | console.log("Mdir:" + this.enumsQlFullPath());
|
111 | fs_1.mkdirSync(this.enumsQlFullPath());
|
112 | }
|
113 | const enums = new enum_builder_1.EnumBuilder().run(this.schema);
|
114 | new enum_writer_1.EnumWriter().run(enums, this.enumsFullPath(), this.enumsQlFullPath());
|
115 | console.log("Generating ql files");
|
116 | this.renderGraphQlFiles();
|
117 | console.log("Generating table file");
|
118 | this.renderTableFile();
|
119 | console.log("Generating view file");
|
120 | this.renderViewFile();
|
121 | console.log("Generating column file");
|
122 | this.renderColumnsFile();
|
123 | console.log("Generating sp file");
|
124 | this.renderStoredProcedure();
|
125 | console.log("Generating class files");
|
126 | this.renderClassFiles();
|
127 | console.log("Render view class files");
|
128 | this.renderViewClassFiles();
|
129 | console.log("Render inserter file");
|
130 | this.renderInserter();
|
131 | console.log("Render getter file");
|
132 | this.renderGetter();
|
133 | this.renderSchemaOperator();
|
134 | console.log("render abstract handler");
|
135 | this.renderAbstractHandler();
|
136 | }
|
137 | intefaceFullPath() {
|
138 | return this.folder + this.settings.interfaceFolder;
|
139 | }
|
140 | graphQlFullPath() {
|
141 | return this.folder + "graphql";
|
142 | }
|
143 | enumsFullPath() {
|
144 | return this.folder + "enums";
|
145 | }
|
146 | enumsQlFullPath() {
|
147 | return this.graphQlFullPath() + "/enums";
|
148 | }
|
149 | renderTableFile() {
|
150 | const start = "export enum TABLE { \n";
|
151 | const arr = this.listTables().sort().map(t => `\t${change_case.constantCase(t)} = "${t}",`);
|
152 | const content = this.getMetaText() + start + arr.join("\n") + "\n}";
|
153 | fs_1.writeFileSync(this.folder + "tables" + this.getFilenameEnding(), content);
|
154 | }
|
155 | renderViewFile() {
|
156 | const start = "export enum VIEW { \n";
|
157 | const arr = this.listViews().sort().map(t => `\t${change_case.constantCase(t)} = "${t}",`);
|
158 | const content = this.getMetaText() + start + arr.join("\n") + "\n}";
|
159 | fs_1.writeFileSync(this.folder + "views" + this.getFilenameEnding(), content);
|
160 | }
|
161 | renderColumnsFile() {
|
162 | const colBuilder = new table_columns_builder_1.TableColumnsBuilder(this.schema);
|
163 | const content = colBuilder.renderTemplate();
|
164 | fs_1.writeFileSync(this.folder + "columns" + this.getFilenameEnding(), content);
|
165 | }
|
166 | renderGraphQlFiles() {
|
167 | const qlBuilder = new graphql_builder_1.GraphQlBuilder(this.schema);
|
168 | let tableClasses = this.renderClasses(this.listTables(), this.folder + "graphql/", true);
|
169 | tableClasses.forEach((tc) => {
|
170 | const definition = qlBuilder.renderTs(this.schema.tables[tc.tableName], tc);
|
171 | fs_1.writeFileSync(tc.fullPath, definition);
|
172 | });
|
173 | tableClasses = this.renderClasses(this.listViews(), this.folder + "graphql/", false);
|
174 | tableClasses.forEach(tc => {
|
175 | const definition = qlBuilder.renderTs(this.schema.views[tc.tableName], tc);
|
176 | fs_1.writeFileSync(tc.fullPath, definition);
|
177 | });
|
178 | }
|
179 | renderClassFiles() {
|
180 | const tables = this.listTables();
|
181 | const tableClasses = this.renderClasses(tables, this.intefaceFullPath(), true);
|
182 | const interfaceBuilder = new interface_builder_1.InterfaceBuilder(this.settings, this.mysqlTypes, this.schema);
|
183 | tableClasses.forEach(tc => {
|
184 | const definition = interfaceBuilder.renderTs(tc, this.schema.tables[tc.tableName]);
|
185 | fs_1.writeFileSync(tc.fullPath, definition);
|
186 | });
|
187 | }
|
188 | renderViewClassFiles() {
|
189 | const views = this.listViews();
|
190 | const interfaceBuilder = new interface_builder_1.InterfaceBuilder(this.settings, this.mysqlTypes, this.schema);
|
191 | this.renderClasses(views, this.intefaceFullPath(), false).forEach(tc => {
|
192 | const definition = interfaceBuilder.renderTs(tc, this.schema.views[tc.tableName]);
|
193 | fs_1.writeFileSync(tc.fullPath, definition);
|
194 | });
|
195 | }
|
196 | renderInserter() {
|
197 | const tables = this.listTables();
|
198 | const tableClasses = this.renderClasses(tables, this.intefaceFullPath(), true);
|
199 | const inserterCotent = new inserter_builder_1.InserterBuilder().render(tableClasses, this.settings.interfaceFolder);
|
200 | fs_1.writeFileSync(this.folder + this.toFilename("inserter"), inserterCotent);
|
201 | }
|
202 | renderGetter() {
|
203 | const tables = this.listTables();
|
204 | const tableClasses = this.renderClasses(tables, this.intefaceFullPath(), true);
|
205 | tableClasses.push(...this.renderClasses(this.listViews(), this.intefaceFullPath(), false));
|
206 |
|
207 | const inserterCotent = new getter_builder_1.GettersBuilder(this.schema, this.getTypeMap()).render(tableClasses, this.settings.interfaceFolder);
|
208 | fs_1.writeFileSync(this.folder + this.toFilename("getter"), inserterCotent);
|
209 | }
|
210 | renderSchemaOperator() {
|
211 | const schemaClass = new definition_builder_1.DefinitionBuilder(this.schema).renderSchema();
|
212 | fs_1.writeFileSync(this.folder + this.toFilename("definition"), schemaClass);
|
213 | const tableClasses = this.renderClasses(this.listTables(), this.intefaceFullPath(), true);
|
214 | const inserterCotent = new update_builder_1.UpdateBuilder().renderUpdater(tableClasses, this.settings.interfaceFolder);
|
215 | fs_1.writeFileSync(this.folder + this.toFilename("updater"), inserterCotent);
|
216 | }
|
217 | renderStoredProcedure() {
|
218 | const spBuiler = new sp_builder_1.default(this.schema.storedProcedures, this.mysqlTypes);
|
219 | const filename = "stored-procedures" + this.getFilenameEnding();
|
220 | fs_1.writeFileSync(this.folder + filename, spBuiler.renderTemplate());
|
221 | }
|
222 | renderAbstractHandler() {
|
223 | const builder = new abstract_handler_builder_1.AbstractHandlerBuilder();
|
224 | fs_1.writeFileSync(this.folder + this.toFilename("abstract-handler"), builder.getFileContent());
|
225 | }
|
226 | getMetaText() {
|
227 | const meta = `/**\n * Autogenerated class containing all the tables, DO NOT MODIFY\n */\n`;
|
228 | return meta + "/* tslint:disable */\n";
|
229 | }
|
230 | renderClasses(tables, folder, isTable) {
|
231 | return tables.map(t => {
|
232 | let fnName;
|
233 | let fnPlural;
|
234 | const className = this.getClassName(t);
|
235 | if (this.settings.camelCaseFnNames) {
|
236 | fnName = change_case.camelCase(className);
|
237 | fnPlural = change_case.camelCase(t);
|
238 | }
|
239 | else {
|
240 | fnName = className;
|
241 | fnPlural = t;
|
242 | }
|
243 | const filename = this.toFilename(t);
|
244 | return {
|
245 | className: this.getClassName(t),
|
246 | filename: filename,
|
247 | fnName: fnName,
|
248 | fnPlural: fnPlural,
|
249 | fullPath: folder + filename,
|
250 | isTable: isTable,
|
251 | prefixedClassName: this.getPrefixedClassName(t),
|
252 | tableName: t
|
253 | };
|
254 | });
|
255 | }
|
256 | listTables() {
|
257 | return Object.keys(this.schema.tables);
|
258 | }
|
259 | listViews() {
|
260 | return Object.keys(this.schema.views);
|
261 | }
|
262 | getClassName(tableName) {
|
263 | const className = this.settings.singularizeClassNames ? pluralize.singular(tableName) : tableName;
|
264 | return className;
|
265 | }
|
266 | getPrefixedClassName(tableName) {
|
267 | const preI = this.settings.appendIToDeclaration ? "I" : "";
|
268 | return preI + this.getClassName(tableName);
|
269 | }
|
270 | getFilenameEnding() {
|
271 | if (this.settings.suffixGeneratedToFilenames) {
|
272 | return ".generated.ts";
|
273 | }
|
274 | return ".ts";
|
275 | }
|
276 | toFilename(name) {
|
277 | let filename = this.settings.singularizeClassNames ? pluralize.singular(name) : name;
|
278 | filename = change_case.paramCase(filename);
|
279 |
|
280 |
|
281 |
|
282 | return change_case.paramCase(filename) + this.getFilenameEnding();
|
283 | }
|
284 | }
|
285 | exports.TsBuilder = TsBuilder;
|
286 |
|
\ | No newline at end of file |