UNPKG

12.5 kBJavaScriptView Raw
1"use strict";
2var __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};
11Object.defineProperty(exports, "__esModule", { value: true });
12const change_case = require("change-case");
13const fs_1 = require("fs");
14const pluralize = require("pluralize");
15const abstract_handler_builder_1 = require("./abstract-handler-builder");
16const definition_builder_1 = require("./definition-builder");
17const enum_builder_1 = require("./enums/enum-builder");
18const getter_builder_1 = require("./getter-builder");
19const graphql_builder_1 = require("./graphql-builder");
20const inserter_builder_1 = require("./inserter-builder");
21const interface_builder_1 = require("./interface-builder");
22const model_builder_1 = require("./model-builder");
23const sp_builder_1 = require("./sp-builder");
24const table_columns_builder_1 = require("./table-columns-builder");
25const update_builder_1 = require("./update-builder");
26const enum_writer_1 = require("./enums/enum-writer");
27class 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 // tslint:disable-next-line: max-line-length
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 // if (filename.startsWith("i-") && this.settings.appendIToDeclaration) {
280 // filename = filename.replace("i-", "i");
281 // }
282 return change_case.paramCase(filename) + this.getFilenameEnding();
283 }
284}
285exports.TsBuilder = TsBuilder;
286//# sourceMappingURL=ts-builder.js.map
\No newline at end of file