blend-kit 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/dist/helper/ApiHelper.js +0 -0
  2. package/dist/helper/BasicHelper.js +28 -0
  3. package/dist/helper/CommonHelper.js +10 -0
  4. package/dist/helper/DataHelper.js +241 -0
  5. package/dist/helper/ExpressHelper.js +728 -0
  6. package/dist/helper/FrontEndApiHelper.js +485 -0
  7. package/dist/helper/FrontEndReactApiHelper.js +483 -0
  8. package/dist/helper/MongoHelper.js +143 -0
  9. package/dist/helper/RNHelper.js +560 -0
  10. package/dist/helper/ReactHelper.js +524 -0
  11. package/dist/helper/SectionHelper.js +152 -0
  12. package/dist/helper/fileHelper.js +127 -0
  13. package/dist/helper/grammarHelper/BlendApiGrammarHelper.js +48 -0
  14. package/dist/helper/grammarHelper/BlendBasicGrammarHelper.js +98 -0
  15. package/dist/helper/grammarHelper/BlendDataGrammarHelper.js +47 -0
  16. package/dist/helper/grammarHelper/BlendMDPGrammarHelper.js +29 -0
  17. package/dist/helper/grammarHelper/BlendMongoGrammarHelper.js +51 -0
  18. package/dist/helper/grammarHelper/BlendRNGrammarHelper.js +56 -0
  19. package/dist/helper/grammarHelper/BlendReactGrammarHelper.js +55 -0
  20. package/dist/helper/grammarHelper/GrammarErrorHelper.js +16 -0
  21. package/dist/index.js +159 -0
  22. package/dist/parser/blendApi/src/grammar/BlendApiLexer.js +201 -0
  23. package/dist/parser/blendApi/src/grammar/BlendApiListener.js +3 -0
  24. package/dist/parser/blendApi/src/grammar/BlendApiParser.js +961 -0
  25. package/dist/parser/blendData/src/grammar/BlendDataLexer.js +154 -0
  26. package/dist/parser/blendData/src/grammar/BlendDataListener.js +3 -0
  27. package/dist/parser/blendData/src/grammar/BlendDataParser.js +641 -0
  28. package/dist/parser/blendMDP/src/grammar/BlendMDPLexer.js +151 -0
  29. package/dist/parser/blendMDP/src/grammar/BlendMDPListener.js +3 -0
  30. package/dist/parser/blendMDP/src/grammar/BlendMDPParser.js +490 -0
  31. package/dist/parser/blendMongo/src/grammar/BlendMongoLexer.js +187 -0
  32. package/dist/parser/blendMongo/src/grammar/BlendMongoListener.js +3 -0
  33. package/dist/parser/blendMongo/src/grammar/BlendMongoParser.js +848 -0
  34. package/dist/parser/blendRN/src/grammar/BlendRNLexer.js +172 -0
  35. package/dist/parser/blendRN/src/grammar/BlendRNListener.js +3 -0
  36. package/dist/parser/blendRN/src/grammar/BlendRNParser.js +657 -0
  37. package/dist/parser/blendReact/src/grammar/BlendReactLexer.js +159 -0
  38. package/dist/parser/blendReact/src/grammar/BlendReactListener.js +3 -0
  39. package/dist/parser/blendReact/src/grammar/BlendReactParser.js +644 -0
  40. package/dist/parser/blendbasic/src/grammar/BlendBasicLexer.js +147 -0
  41. package/dist/parser/blendbasic/src/grammar/BlendBasicListener.js +3 -0
  42. package/dist/parser/blendbasic/src/grammar/BlendBasicParser.js +747 -0
  43. package/dist/src/app.js +76 -0
  44. package/dist/src/app.ts +54 -0
  45. package/dist/types/apiOperationTypes.js +13 -0
  46. package/dist/types/basicOperationTypes.js +2 -0
  47. package/dist/types/dataOperationTypes.js +2 -0
  48. package/dist/types/frontendOperationTypes.js +4 -0
  49. package/dist/types/generalTypes.js +0 -0
  50. package/dist/types/mongoOperationTypes.js +12 -0
  51. package/package.json +29 -0
  52. package/src/grammar/.antlr/ApiModuleLexer.interp +71 -0
  53. package/src/grammar/.antlr/ApiModuleLexer.java +194 -0
  54. package/src/grammar/.antlr/ApiModuleLexer.tokens +32 -0
  55. package/src/grammar/.antlr/BlendApi.interp +70 -0
  56. package/src/grammar/.antlr/BlendApi.tokens +44 -0
  57. package/src/grammar/.antlr/BlendApiLexer.interp +89 -0
  58. package/src/grammar/.antlr/BlendApiLexer.java +237 -0
  59. package/src/grammar/.antlr/BlendApiLexer.tokens +44 -0
  60. package/src/grammar/.antlr/BlendApiParser.java +767 -0
  61. package/src/grammar/.antlr/BlendBasic.interp +41 -0
  62. package/src/grammar/.antlr/BlendBasic.tokens +20 -0
  63. package/src/grammar/.antlr/BlendBasicLexer.interp +50 -0
  64. package/src/grammar/.antlr/BlendBasicLexer.java +179 -0
  65. package/src/grammar/.antlr/BlendBasicLexer.tokens +20 -0
  66. package/src/grammar/.antlr/BlendBasicParser.java +599 -0
  67. package/src/grammar/.antlr/BlendData.interp +50 -0
  68. package/src/grammar/.antlr/BlendData.tokens +29 -0
  69. package/src/grammar/.antlr/BlendDataLexer.interp +65 -0
  70. package/src/grammar/.antlr/BlendDataLexer.java +181 -0
  71. package/src/grammar/.antlr/BlendDataLexer.tokens +29 -0
  72. package/src/grammar/.antlr/BlendDataParser.java +520 -0
  73. package/src/grammar/.antlr/BlendMDP.interp +45 -0
  74. package/src/grammar/.antlr/BlendMDP.tokens +25 -0
  75. package/src/grammar/.antlr/BlendMDPLexer.interp +59 -0
  76. package/src/grammar/.antlr/BlendMDPLexer.java +178 -0
  77. package/src/grammar/.antlr/BlendMDPLexer.tokens +25 -0
  78. package/src/grammar/.antlr/BlendMDPParser.java +386 -0
  79. package/src/grammar/.antlr/BlendMongo.interp +65 -0
  80. package/src/grammar/.antlr/BlendMongo.tokens +41 -0
  81. package/src/grammar/.antlr/BlendMongoLexer.interp +83 -0
  82. package/src/grammar/.antlr/BlendMongoLexer.java +219 -0
  83. package/src/grammar/.antlr/BlendMongoLexer.tokens +41 -0
  84. package/src/grammar/.antlr/BlendMongoParser.java +669 -0
  85. package/src/grammar/.antlr/BlendRN.interp +53 -0
  86. package/src/grammar/.antlr/BlendRN.tokens +31 -0
  87. package/src/grammar/.antlr/BlendRNLexer.interp +71 -0
  88. package/src/grammar/.antlr/BlendRNLexer.java +202 -0
  89. package/src/grammar/.antlr/BlendRNLexer.tokens +31 -0
  90. package/src/grammar/.antlr/BlendRNParser.java +542 -0
  91. package/src/grammar/.antlr/BlendReact.interp +49 -0
  92. package/src/grammar/.antlr/BlendReact.tokens +28 -0
  93. package/src/grammar/.antlr/BlendReactLexer.interp +65 -0
  94. package/src/grammar/.antlr/BlendReactLexer.java +188 -0
  95. package/src/grammar/.antlr/BlendReactLexer.tokens +28 -0
  96. package/src/grammar/.antlr/BlendReactParser.java +530 -0
  97. package/src/grammar/BlendApi.g4 +26 -0
  98. package/src/grammar/BlendBasic.g4 +16 -0
  99. package/src/grammar/BlendData.g4 +24 -0
  100. package/src/grammar/BlendMDP.g4 +12 -0
  101. package/src/grammar/BlendMongo.g4 +24 -0
  102. package/src/grammar/BlendRN.g4 +18 -0
  103. package/src/grammar/BlendReact.g4 +16 -0
  104. package/src/helper/BasicHelper.ts +35 -0
  105. package/src/helper/CommonHelper.ts +5 -0
  106. package/src/helper/DataHelper.ts +268 -0
  107. package/src/helper/ExpressHelper.ts +807 -0
  108. package/src/helper/FrontEndApiHelper.ts +526 -0
  109. package/src/helper/FrontEndReactApiHelper.ts +532 -0
  110. package/src/helper/MongoHelper.ts +165 -0
  111. package/src/helper/RNHelper.ts +651 -0
  112. package/src/helper/ReactHelper.ts +597 -0
  113. package/src/helper/SectionHelper.ts +154 -0
  114. package/src/helper/fileHelper.ts +111 -0
  115. package/src/helper/grammarHelper/BlendApiGrammarHelper.ts +45 -0
  116. package/src/helper/grammarHelper/BlendBasicGrammarHelper.ts +101 -0
  117. package/src/helper/grammarHelper/BlendDataGrammarHelper.ts +49 -0
  118. package/src/helper/grammarHelper/BlendMDPGrammarHelper.ts +33 -0
  119. package/src/helper/grammarHelper/BlendMongoGrammarHelper.ts +50 -0
  120. package/src/helper/grammarHelper/BlendRNGrammarHelper.ts +65 -0
  121. package/src/helper/grammarHelper/BlendReactGrammarHelper.ts +65 -0
  122. package/src/helper/grammarHelper/GrammarErrorHelper.ts +13 -0
  123. package/src/index.ts +168 -0
  124. package/src/parser/blendApi/src/grammar/BlendApi.interp +70 -0
  125. package/src/parser/blendApi/src/grammar/BlendApi.tokens +44 -0
  126. package/src/parser/blendApi/src/grammar/BlendApiLexer.interp +89 -0
  127. package/src/parser/blendApi/src/grammar/BlendApiLexer.tokens +44 -0
  128. package/src/parser/blendApi/src/grammar/BlendApiLexer.ts +193 -0
  129. package/src/parser/blendApi/src/grammar/BlendApiListener.ts +145 -0
  130. package/src/parser/blendApi/src/grammar/BlendApiParser.ts +968 -0
  131. package/src/parser/blendData/src/grammar/BlendData.interp +50 -0
  132. package/src/parser/blendData/src/grammar/BlendData.tokens +29 -0
  133. package/src/parser/blendData/src/grammar/BlendDataLexer.interp +65 -0
  134. package/src/parser/blendData/src/grammar/BlendDataLexer.tokens +29 -0
  135. package/src/parser/blendData/src/grammar/BlendDataLexer.ts +146 -0
  136. package/src/parser/blendData/src/grammar/BlendDataListener.ts +97 -0
  137. package/src/parser/blendData/src/grammar/BlendDataParser.ts +641 -0
  138. package/src/parser/blendMDP/src/grammar/BlendMDP.interp +45 -0
  139. package/src/parser/blendMDP/src/grammar/BlendMDP.tokens +25 -0
  140. package/src/parser/blendMDP/src/grammar/BlendMDPLexer.interp +59 -0
  141. package/src/parser/blendMDP/src/grammar/BlendMDPLexer.tokens +25 -0
  142. package/src/parser/blendMDP/src/grammar/BlendMDPLexer.ts +143 -0
  143. package/src/parser/blendMDP/src/grammar/BlendMDPListener.ts +85 -0
  144. package/src/parser/blendMDP/src/grammar/BlendMDPParser.ts +483 -0
  145. package/src/parser/blendMongo/src/grammar/BlendMongo.interp +65 -0
  146. package/src/parser/blendMongo/src/grammar/BlendMongo.tokens +41 -0
  147. package/src/parser/blendMongo/src/grammar/BlendMongoLexer.interp +83 -0
  148. package/src/parser/blendMongo/src/grammar/BlendMongoLexer.tokens +41 -0
  149. package/src/parser/blendMongo/src/grammar/BlendMongoLexer.ts +179 -0
  150. package/src/parser/blendMongo/src/grammar/BlendMongoListener.ts +133 -0
  151. package/src/parser/blendMongo/src/grammar/BlendMongoParser.ts +849 -0
  152. package/src/parser/blendRN/src/grammar/BlendRN.interp +53 -0
  153. package/src/parser/blendRN/src/grammar/BlendRN.tokens +31 -0
  154. package/src/parser/blendRN/src/grammar/BlendRNLexer.interp +71 -0
  155. package/src/parser/blendRN/src/grammar/BlendRNLexer.tokens +31 -0
  156. package/src/parser/blendRN/src/grammar/BlendRNLexer.ts +164 -0
  157. package/src/parser/blendRN/src/grammar/BlendRNListener.ts +85 -0
  158. package/src/parser/blendRN/src/grammar/BlendRNParser.ts +659 -0
  159. package/src/parser/blendReact/src/grammar/BlendReact.interp +49 -0
  160. package/src/parser/blendReact/src/grammar/BlendReact.tokens +28 -0
  161. package/src/parser/blendReact/src/grammar/BlendReactLexer.interp +65 -0
  162. package/src/parser/blendReact/src/grammar/BlendReactLexer.tokens +28 -0
  163. package/src/parser/blendReact/src/grammar/BlendReactLexer.ts +151 -0
  164. package/src/parser/blendReact/src/grammar/BlendReactListener.ts +85 -0
  165. package/src/parser/blendReact/src/grammar/BlendReactParser.ts +646 -0
  166. package/src/parser/blendbasic/src/grammar/BlendBasic.interp +41 -0
  167. package/src/parser/blendbasic/src/grammar/BlendBasic.tokens +20 -0
  168. package/src/parser/blendbasic/src/grammar/BlendBasicLexer.interp +50 -0
  169. package/src/parser/blendbasic/src/grammar/BlendBasicLexer.tokens +20 -0
  170. package/src/parser/blendbasic/src/grammar/BlendBasicLexer.ts +139 -0
  171. package/src/parser/blendbasic/src/grammar/BlendBasicListener.ts +109 -0
  172. package/src/parser/blendbasic/src/grammar/BlendBasicParser.ts +747 -0
  173. package/src/types/apiOperationTypes.ts +43 -0
  174. package/src/types/basicOperationTypes.ts +15 -0
  175. package/src/types/dataOperationTypes.ts +20 -0
  176. package/src/types/frontendOperationTypes.ts +92 -0
  177. package/src/types/generalTypes.ts +0 -0
  178. package/src/types/mongoOperationTypes.ts +36 -0
  179. package/template/.env.dev +1 -0
  180. package/template/package.json +36 -0
  181. package/template/src/app.js +76 -0
  182. package/template/src/app.ts +54 -0
  183. package/template/src/config/app.config.js +0 -0
  184. package/template/src/config/app.config.ts +0 -0
  185. package/template/src/config/database.config.js +6 -0
  186. package/template/src/config/database.config.ts +4 -0
  187. package/template/src/data/interfaces.js +2 -0
  188. package/template/src/data/interfaces.ts +23 -0
  189. package/template/src/middlewares/auth.js +22 -0
  190. package/template/src/middlewares/auth.ts +21 -0
  191. package/template/src/models/Database.js +10 -0
  192. package/template/src/models/Database.ts +8 -0
  193. package/template/src/models/User/Permission.model.js +13 -0
  194. package/template/src/models/User/Permission.model.ts +14 -0
  195. package/template/src/models/User/Role.model.js +13 -0
  196. package/template/src/models/User/Role.model.ts +14 -0
  197. package/template/src/models/User/User.model.js +17 -0
  198. package/template/src/models/User/User.model.ts +18 -0
  199. package/template/src/routes/User.routes.js +47 -0
  200. package/template/src/routes/User.routes.ts +41 -0
  201. package/template/src/routes/common/common.routes.config.js +14 -0
  202. package/template/src/routes/common/common.routes.config.ts +15 -0
  203. package/template/src/services/User/User.service.js +75 -0
  204. package/template/src/services/User/User.service.ts +68 -0
  205. package/template/src/services/User/api.data.js +72 -0
  206. package/template/src/services/User/api.data.ts +79 -0
  207. package/template/src/services/User/api.interface.js +3 -0
  208. package/template/src/services/User/api.interface.ts +10 -0
  209. package/template/tsconfig.json +10 -0
  210. package/tsconfig.json +13 -0
@@ -0,0 +1,728 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const path_1 = __importDefault(require("path"));
7
+ const fileHelper_1 = require("./fileHelper");
8
+ const apiOperationTypes_1 = require("../types/apiOperationTypes");
9
+ const BlendApiGrammarHelper_1 = __importDefault(require("./grammarHelper/BlendApiGrammarHelper"));
10
+ class ExpressHelper {
11
+ constructor() {
12
+ this.baseRoute = 'api';
13
+ this.folderPath = path_1.default.join(process.cwd());
14
+ this.folderName = path_1.default.basename(this.folderPath);
15
+ this.basicFilePath = path_1.default.join(this.folderPath, `${this.folderName}.basic`);
16
+ this.configPath = path_1.default.join(this.folderPath, '.basicConfig');
17
+ this.basicProjectContent = JSON.parse(fileHelper_1.FileHelper.readFile(`${this.configPath}/basicConfig.json`) || "{}");
18
+ }
19
+ doExpressOperations(basicFileContent) {
20
+ // Normalize and trim the content to handle extra spaces
21
+ this.basicFileContent = basicFileContent.replace(/\s+/g, ' ').trim();
22
+ this.createExpressSpec();
23
+ this.parseSpec();
24
+ }
25
+ doExpressGenerations(basicFileContent) {
26
+ this.basicFileContent = basicFileContent.replace(/\s+/g, ' ').trim();
27
+ this.createExpressProject();
28
+ this.parseJSONAndGenerateFiles();
29
+ }
30
+ createExpressSpec() {
31
+ this.basicProjectContent.sectionList.forEach(section => {
32
+ const sectionName = section.name;
33
+ const sectionFolderPath = path_1.default.join(this.folderPath, 'spec', sectionName);
34
+ const apiFolderPath = path_1.default.join(sectionFolderPath, 'api');
35
+ fileHelper_1.FileHelper.ensureDir(apiFolderPath);
36
+ section.expressModuleList.forEach(module => {
37
+ const apiFilePath = path_1.default.join(apiFolderPath, `${module.name}.express`);
38
+ if (!fileHelper_1.FileHelper.exists(apiFilePath)) {
39
+ fileHelper_1.FileHelper.writeFile(apiFilePath, `module ${module.name}`);
40
+ console.log(`Created data file: ${apiFilePath}`);
41
+ }
42
+ else {
43
+ // console.log(`Data file already exists: ${apiFilePath}`);
44
+ }
45
+ });
46
+ });
47
+ }
48
+ parseSpec() {
49
+ let apiMainSectionList = [];
50
+ this.basicProjectContent.sectionList.forEach(section => {
51
+ const sectionName = section.name;
52
+ const sectionFolderPath = path_1.default.join(this.folderPath, 'spec', sectionName);
53
+ const expressSectionList = [];
54
+ // Ensure the section folder and its data subfolder exist
55
+ const apiFolderPath = path_1.default.join(sectionFolderPath, 'api');
56
+ section.expressModuleList.forEach(module => {
57
+ const filePath = path_1.default.join(apiFolderPath, `${module.name}.express`);
58
+ const specCode = fileHelper_1.FileHelper.readFile(filePath);
59
+ const json = new BlendApiGrammarHelper_1.default().parseBlendApi(specCode);
60
+ if (!json.isValid) {
61
+ throw new Error("Error while parsing the syntax");
62
+ }
63
+ expressSectionList.push(json.json);
64
+ });
65
+ let sectionObj = {
66
+ name: sectionName,
67
+ expressSectionList
68
+ };
69
+ apiMainSectionList.push(sectionObj);
70
+ });
71
+ fileHelper_1.FileHelper.writeFile(`${this.configPath}/apiConfig.json`, JSON.stringify(apiMainSectionList));
72
+ }
73
+ parseJSONAndGenerateFiles() {
74
+ const apiMainSectionList = JSON.parse(fileHelper_1.FileHelper.readFile(`${this.configPath}/apiConfig.json`));
75
+ apiMainSectionList.forEach(sectionApi => {
76
+ const mainSectionPath = path_1.default.join(this.folderPath, `module/${sectionApi.name}`);
77
+ sectionApi.expressSectionList.forEach(expressSection => {
78
+ const expressPath = path_1.default.join(mainSectionPath, `express/${sectionApi.name}-api`);
79
+ expressSection.apiSectionList.forEach(apiSection => {
80
+ // const apiPath = ``
81
+ this.writeApi(apiSection, expressPath, expressSection);
82
+ this.writeInterfaceCode(apiSection, expressPath, expressSection);
83
+ this.writeApiDatacode(apiSection, expressPath, expressSection);
84
+ this.writeRouteCode(apiSection, expressPath, expressSection);
85
+ });
86
+ });
87
+ });
88
+ }
89
+ writeApi(apiSection, expressPath, expressSection) {
90
+ const apiCode = this.generateApiCode(apiSection, expressSection);
91
+ const apiPath = `${expressPath}/src/services/${expressSection.name}`;
92
+ const fileName = `${apiSection.name}/${apiSection.name}.service.ts`;
93
+ fileHelper_1.FileHelper.createFile(`${apiPath}/${fileName}`, apiCode);
94
+ }
95
+ writeInterfaceCode(apiSection, expressPath, expressSection) {
96
+ const interfacePath = `${expressPath}/src-gen/api-interfaces/${expressSection.name}`;
97
+ const fileName = `${apiSection.name}.interface.ts`;
98
+ const code = this.generateApiInterfaceCode(apiSection, expressSection);
99
+ fileHelper_1.FileHelper.writeFile(`${interfacePath}/${fileName}`, code);
100
+ }
101
+ writeApiDatacode(apiSection, expressPath, expressSection) {
102
+ const dataPath = `${expressPath}/src-gen/api-data/${expressSection.name}`;
103
+ const fileName = `${apiSection.name}.data.ts`;
104
+ const code = this.generateSampleApiDataCode(apiSection);
105
+ fileHelper_1.FileHelper.writeFile(`${dataPath}/${fileName}`, code);
106
+ }
107
+ writeRouteCode(apiSection, expressPath, expressSection) {
108
+ const dataPath = `${expressPath}/src-gen/api-routes/${expressSection.name}`;
109
+ const fileName = `${apiSection.name}.routes.ts`;
110
+ const code = this.generateRoutesCode(apiSection, expressSection);
111
+ fileHelper_1.FileHelper.writeFile(`${dataPath}/${fileName}`, code);
112
+ }
113
+ createExpressProject() {
114
+ this.basicProjectContent.sectionList.forEach(section => {
115
+ if (section.expressModuleList && section.expressModuleList.length > 0) {
116
+ this.createProject(section.name, `${section.name}-api`);
117
+ }
118
+ });
119
+ }
120
+ createProject(sectionName, projectName) {
121
+ const folderPath = process.cwd(); // Current working directory
122
+ // Path for the section folder inside `spec`
123
+ const sectionFolderPath = path_1.default.join(folderPath, `module/${sectionName}/express`, projectName);
124
+ const packageFilePath = path_1.default.join(sectionFolderPath, "package.json");
125
+ const tsConfigFilePath = path_1.default.join(sectionFolderPath, "tsconfig.json");
126
+ const appTsPath = path_1.default.join(sectionFolderPath, "src/app.ts");
127
+ const envPath = path_1.default.join(sectionFolderPath, ".env.dev");
128
+ const routesPath = path_1.default.join(sectionFolderPath, "src/routes/common/common.routes.config.ts");
129
+ const authPath = path_1.default.join(sectionFolderPath, "src/middlewares/auth.ts");
130
+ const swaggerConfigPath = path_1.default.join(sectionFolderPath, "src/routes/swaggerConfig.ts");
131
+ const packageFileCode = packageJSON;
132
+ packageFileCode.name = projectName;
133
+ fileHelper_1.FileHelper.createFile(packageFilePath, JSON.stringify(packageFileCode));
134
+ fileHelper_1.FileHelper.createFile(tsConfigFilePath, JSON.stringify(tsconfigJson));
135
+ fileHelper_1.FileHelper.createFile(appTsPath, appTsCode);
136
+ fileHelper_1.FileHelper.createFile(envPath, envFileCode);
137
+ fileHelper_1.FileHelper.createFile(routesPath, routesCode);
138
+ fileHelper_1.FileHelper.createFile(authPath, authCode);
139
+ fileHelper_1.FileHelper.createFile(swaggerConfigPath, swaggerConfigCode);
140
+ }
141
+ generateApiInterfaceCode(apiSection, expressSection) {
142
+ const interfaceName = `I${apiSection.name}Api`;
143
+ const sectionName = `${apiSection.name}Service`;
144
+ const apiCode = this.generateApiFunctionCodes(apiSection);
145
+ const totalInputs = apiSection.apiList.reduce((acc, currVal) => {
146
+ acc = acc + Object.keys(currVal.input).length;
147
+ return acc;
148
+ }, 0);
149
+ const code = `
150
+ import express from 'express';\n;
151
+ ${totalInputs > 0 ? `
152
+ import {${apiSection.apiList.reduce((acc, currVal) => {
153
+ const inputName = (`${apiSection.name}_${currVal.name}_Input`).toUpperCase();
154
+ acc = acc + `${(Object.keys(currVal.input).length > 0) ? `${inputName},` : ''}`;
155
+ return acc;
156
+ }, '')}} from '../../api-data/${expressSection.name}/${apiSection.name}.data';
157
+ ` : ``}
158
+
159
+ export interface ${interfaceName} {
160
+ ${apiSection.apiList.reduce((acc, currVal) => {
161
+ const inputName = (`${apiSection.name}_${currVal.name}_Input`).toUpperCase();
162
+ acc = acc + `${currVal.name}( ${currVal.authenticated === true ? `currentUser: any,` : ``} ${Object.keys(currVal.input).length > 0 ? `input: ${inputName},` : ''} res: express.Response):void\n\t`;
163
+ return acc;
164
+ }, '')}
165
+ }
166
+
167
+ /*
168
+ API CODE
169
+ .............
170
+
171
+ ${apiCode}
172
+ */
173
+ `;
174
+ return code;
175
+ }
176
+ generateSampleApiDataCode(apiSection, type = "api") {
177
+ const code = `
178
+ ${apiSection.apiList.reduce((acc, api) => {
179
+ const inputKeyList = Object.keys(api.input);
180
+ const outputKeyList = api.output ? Object.keys(api.output) : [];
181
+ const inputDataTypeName = (`${apiSection.name}_${api.name}_Input`).toUpperCase();
182
+ const outputDataTypeName = (`${apiSection.name}_${api.name}_Output`).toUpperCase();
183
+ const imports = new Set(); // Collect unique imports
184
+ inputKeyList.forEach(inputKey => {
185
+ const typeParts = api.input[inputKey].type.split("->");
186
+ if (typeParts.length === 2) {
187
+ const [module, typeName] = typeParts;
188
+ const baseTypeName = typeName.endsWith("[]") ? typeName.slice(0, -2) : typeName;
189
+ if (type === "api") {
190
+ imports.add(`import { ${baseTypeName} } from '../data/${module}';`);
191
+ }
192
+ else {
193
+ imports.add(`import { ${baseTypeName} } from '../../../../data/${module}';`);
194
+ }
195
+ }
196
+ });
197
+ outputKeyList.forEach(outputKey => {
198
+ const typeParts = api.output[outputKey].type.split("->");
199
+ if (typeParts.length === 2) {
200
+ const [module, typeName] = typeParts;
201
+ const baseTypeName = typeName.endsWith("[]") ? typeName.slice(0, -2) : typeName;
202
+ if (type === "api") {
203
+ imports.add(`import { ${baseTypeName} } from '../data/${module}';`);
204
+ }
205
+ else {
206
+ imports.add(`import { ${baseTypeName} } from '../../../../data/${module}';`);
207
+ }
208
+ }
209
+ });
210
+ acc = acc + `
211
+
212
+ ${inputKeyList.length > 0 ? `
213
+ ${Array.from(imports).join('\n')}
214
+ export class ${inputDataTypeName} {
215
+
216
+
217
+ constructor(
218
+ ${inputKeyList
219
+ .map((inputKey) => ` public ${inputKey}: ${this.resolveType(api.input[inputKey].type)}${!api.input[inputKey].required ? '|undefined' : ''} = ${this.getDefaultValue(api.input[inputKey])},`)
220
+ .join('\n')}
221
+ ) {}
222
+
223
+ static fromJSON(jsonObj: any):${inputDataTypeName} {
224
+ return new ${inputDataTypeName}(
225
+ ${inputKeyList
226
+ .map((inputKey) => this.generateFromJSONField(Object.assign(Object.assign({}, api.input[inputKey]), { name: inputKey })))
227
+ .join(',\n')}
228
+ );
229
+ }
230
+
231
+ toJSON():object {
232
+ return {
233
+ ${inputKeyList
234
+ .map((inputKey) => this.generateToJSONField(Object.assign(Object.assign({}, api.input[inputKey]), { name: inputKey })))
235
+ .join('\n')}
236
+ };
237
+ }
238
+
239
+ checkDefaultPreCondition() {
240
+ const error: any = {};
241
+ ${inputKeyList.reduce((acc, inputKey) => {
242
+ acc = acc + `${api.input[inputKey].required == true ?
243
+ `if(!this.${inputKey}) {
244
+ error['${inputKey}']="${inputKey} is required"
245
+ }`
246
+ : ``}`;
247
+ return acc;
248
+ }, "")}
249
+ return {
250
+ isValid: Object.keys(error).length==0,
251
+ errorBody: error
252
+ }
253
+ }
254
+ }` : ''}
255
+
256
+ ${outputKeyList.length > 0 ? `export class ${outputDataTypeName} {
257
+
258
+ constructor(
259
+ ${outputKeyList
260
+ .map((outputKey) => ` public ${outputKey}: ${this.resolveType(api.output[outputKey].type)}${!api.output[outputKey].required ? '|undefined' : ''} = ${this.getDefaultValue(api.output[outputKey])},`)
261
+ .join('\n')}
262
+ ) {}
263
+
264
+ static fromJSON(jsonObj: any):${outputDataTypeName} {
265
+ return new ${outputDataTypeName}(
266
+ ${outputKeyList
267
+ .map((outputKey) => this.generateFromJSONField(Object.assign(Object.assign({}, api.output[outputKey]), { name: outputKey })))
268
+ .join(',\n')}
269
+ );
270
+ }
271
+
272
+
273
+ toJSON():object {
274
+ return {
275
+ ${outputKeyList
276
+ .map((outputKey) => this.generateToJSONField(Object.assign(Object.assign({}, api.output[outputKey]), { name: outputKey })))
277
+ .join('\n')}
278
+ };
279
+ }
280
+ }
281
+ ` : ''}
282
+
283
+ `;
284
+ return acc;
285
+ }, "")}
286
+ `;
287
+ return code;
288
+ }
289
+ generateApiCode(apiSection, expressSection) {
290
+ const serviceName = `${apiSection.name}Service`;
291
+ const interfaceName = `I${apiSection.name}Api`;
292
+ const code = `
293
+ import express from 'express';\n
294
+ import { ${interfaceName} } from '../../../../src-gen/api-interfaces/${expressSection.name}/${apiSection.name}.interface';\n
295
+ ${apiSection.apiList.length > 0 ? `import {${apiSection.apiList.reduce((acc, currVal) => {
296
+ const inputName = (`${apiSection.name}_${currVal.name}_Input`).toUpperCase();
297
+ acc = acc + inputName + ',';
298
+ return acc;
299
+ }, '')}} from '../../../../src-gen/api-data/${expressSection.name}/${apiSection.name}.data';` : ''}
300
+
301
+ export default class ${serviceName} implements ${interfaceName} {
302
+ ${this.generateApiFunctionCodes(apiSection)}
303
+ }`;
304
+ return code;
305
+ }
306
+ generateApiFunctionCodes(apiSection) {
307
+ return apiSection.apiList.reduce((acc, api) => {
308
+ const inputName = (`${apiSection.name}_${api.name}_Input`).toUpperCase();
309
+ acc = acc + `public async ${api.name}(${api.authenticated === true ? 'currentUser: any,' : ''}${Object.keys(api.input).length > 0 ? `input: ${inputName},` : ''} res: express.Response) {
310
+ try {
311
+ ${api.output && Object.keys(api.output).length > 0 ?
312
+ `const projectionString = '${Object.keys(api.output).reduce((acc, cur) => {
313
+ acc = acc + cur + ' ';
314
+ return acc;
315
+ }, '')}'` : ''}
316
+
317
+ }catch (e) {
318
+ res.status(500).send("Error" + e);
319
+ }
320
+ }\n`;
321
+ return acc;
322
+ }, "");
323
+ }
324
+ generateRoutesCode(apiSection, expressSection) {
325
+ const className = `${apiSection.name}Routes`;
326
+ const serviceName = `${apiSection.name}Service`;
327
+ const totalInputs = apiSection.apiList.reduce((acc, currVal) => {
328
+ acc = acc + Object.keys(currVal.input).length;
329
+ return acc;
330
+ }, 0);
331
+ const code = `
332
+ import { CommonRoutesConfig } from '../../../src/routes/common/common.routes.config';
333
+ import ${serviceName} from '../../../src/services/${expressSection.name}/${apiSection.name}/${apiSection.name}.service';
334
+ import express from 'express';
335
+ import verifyToken from '../../../src/middlewares/auth';
336
+ ${totalInputs > 0 ? `
337
+ ${apiSection.apiList.length > 0 ? `import {${apiSection.apiList.reduce((acc, currVal) => {
338
+ const inputName = (`${apiSection.name}_${currVal.name}_Input`).toUpperCase();
339
+ acc = acc + `${Object.keys(currVal.input).length > 0 ? `${inputName + ','}` : ``}`;
340
+ return acc;
341
+ }, '')}} from '../../api-data/${expressSection.name}/${apiSection.name}.data';` : ''}
342
+ ` : ``}
343
+
344
+
345
+ export default class ${className} extends CommonRoutesConfig {
346
+ constructor(app: express.Application) {
347
+ super(app, '${className}');
348
+ }
349
+ ${apiSection.name}Service = new ${apiSection.name}Service();
350
+
351
+ configureRoutes(): express.Application {
352
+
353
+ /**
354
+ * @swagger
355
+ * tags:
356
+ * - name: ${apiSection.name}
357
+ * description: APIs inside ${apiSection.name}
358
+ */
359
+
360
+ ${apiSection.apiList.reduce((acc, currVal) => {
361
+ const inputName = (`${apiSection.name}_${currVal.name}_Input`).toUpperCase();
362
+ acc = acc + `
363
+
364
+ ${this.generateSwaggerSpecCode(expressSection, apiSection, currVal)}
365
+
366
+ this.app.route('/${this.getApiName(expressSection.name)}/${this.getApiName(apiSection.name)}/${this.getApiName(currVal.name)}').${currVal.type.toLowerCase()}(${currVal.authenticated === true ? 'verifyToken,' : ''}async (req: express.Request, res: express.Response) => {
367
+ ${Object.keys(currVal.input).length > 0 ?
368
+ ` const input: ${inputName} = ${inputName}.fromJSON(${currVal.type == apiOperationTypes_1.ApiType.Get ? 'req.query' : 'req.body'});
369
+ const defaultPreCondition = input.checkDefaultPreCondition();
370
+ if(defaultPreCondition.isValid) {
371
+ this.${serviceName}.${currVal.name}(${currVal.authenticated === true ? `(req as any),` : ''}input, res);
372
+ } else {
373
+ res.status(412).send(defaultPreCondition.errorBody)
374
+ }`
375
+ : `
376
+
377
+ this.${serviceName}.${currVal.name}(${currVal.authenticated === true ? `(req as any),` : ''}res);
378
+
379
+ `}
380
+
381
+
382
+ });`;
383
+ return acc;
384
+ }, '')}
385
+
386
+ return this.app;
387
+ }
388
+ }
389
+ `;
390
+ return code;
391
+ }
392
+ generateSwaggerSpecCode(expressSection, apiSection, api) {
393
+ const inputKeyList = Object.keys(api.input);
394
+ if (api.type === apiOperationTypes_1.ApiType.Get) {
395
+ return `
396
+ /**
397
+ * @swagger
398
+ * /${this.getApiName(expressSection.name)}/${this.getApiName(apiSection.name)}/${this.getApiName(api.name)}:
399
+ * get:
400
+ * security:
401
+ * - BearerAuth: []
402
+ * tags:
403
+ * - ${apiSection.name}
404
+ * parameters:
405
+ ${inputKeyList
406
+ .map((item) => {
407
+ const apiObj = api.input[item];
408
+ return ` * - in: query
409
+ * name: ${item}
410
+ * required: ${apiObj.required}
411
+ * schema:
412
+ * type: ${this.getType(apiObj.type)}`;
413
+ })
414
+ .join("\n")}
415
+ * responses:
416
+ * 200:
417
+ * description: Successful response
418
+ * content:
419
+ * application/json:
420
+ * schema:
421
+ * type: object
422
+ */
423
+ `;
424
+ }
425
+ else {
426
+ return `
427
+ /**
428
+ * @swagger
429
+ * /${this.getApiName(expressSection.name)}/${this.getApiName(apiSection.name)}/${this.getApiName(api.name)}:
430
+ * post:
431
+ * security:
432
+ * - BearerAuth: []
433
+ * tags:
434
+ * - ${apiSection.name}
435
+ * requestBody:
436
+ * required: true
437
+ * content:
438
+ * application/json:
439
+ * schema:
440
+ * type: object
441
+ * required: [${inputKeyList
442
+ .filter(inputKey => api.input[inputKey].required)
443
+ .map(item => `"${item}"`)
444
+ .join(", ")}]
445
+ * properties:
446
+ ${inputKeyList
447
+ .map((item) => {
448
+ const apiObj = api.input[item];
449
+ return ` * ${item}:
450
+ * type: ${this.getType(apiObj.type)}`;
451
+ })
452
+ .join("\n")}
453
+ * responses:
454
+ * 201:
455
+ * description: Created successfully
456
+ * content:
457
+ * application/json:
458
+ * schema:
459
+ * type: object
460
+ */
461
+ `;
462
+ }
463
+ }
464
+ getType(type) {
465
+ const premitiveTypes = ["string", "number", "boolean", "object"];
466
+ if (premitiveTypes.includes(type)) {
467
+ return type;
468
+ }
469
+ else if (type.includes("[]")) {
470
+ return "array";
471
+ }
472
+ else {
473
+ return "object";
474
+ }
475
+ }
476
+ getApiName(apiName) {
477
+ return apiName.replace(/[A-Z]/g, m => "-" + m.toLowerCase()).replace(/^-/, '');
478
+ }
479
+ resolveType(type) {
480
+ const typeParts = type.split("->");
481
+ const baseType = typeParts.length === 2 ? typeParts[1] : type;
482
+ return baseType.endsWith("[]") ? `${baseType.slice(0, -2)}[]` : baseType; // Handle array types
483
+ }
484
+ getDefaultValue(field) {
485
+ const typeParts = field.type.split("->");
486
+ const baseType = typeParts.length === 2 ? typeParts[1] : field.type;
487
+ if (baseType.endsWith("[]")) {
488
+ return "[]"; // Default value for arrays
489
+ }
490
+ if (typeParts.length === 2) {
491
+ const [, typeName] = typeParts;
492
+ const baseTypeName = typeName.endsWith("[]") ? typeName.slice(0, -2) : typeName;
493
+ return `new ${baseTypeName}()`; // Instantiate the imported class
494
+ }
495
+ switch (field.type) {
496
+ case "string":
497
+ return field.required ? "''" : "undefined";
498
+ case "object":
499
+ return field.required ? "{}" : "undefined";
500
+ case "boolean":
501
+ return field.required ? "false" : "undefined";
502
+ case "number":
503
+ return field.required ? "0" : "undefined";
504
+ default:
505
+ return "null";
506
+ }
507
+ }
508
+ generateFromJSONField(field) {
509
+ console.log(field, "field");
510
+ const typeParts = field.type.split("->");
511
+ const baseType = typeParts.length === 2 ? typeParts[1] : field.type;
512
+ if (baseType.endsWith("[]")) {
513
+ const elementType = baseType.slice(0, -2);
514
+ if (["string", "number", "boolean"].includes(elementType)) {
515
+ return ` jsonObj.${field.name} ?? []`;
516
+ }
517
+ return ` (jsonObj.${field.name} != null) ? jsonObj.${field.name}.map((item: any) => ${elementType}.fromJSON(item)) : []`;
518
+ }
519
+ if (typeParts.length === 2) {
520
+ const [, typeName] = typeParts;
521
+ const baseTypeName = typeName.endsWith("[]") ? typeName.slice(0, -2) : typeName;
522
+ return ` (jsonObj.${field.name} != null) ? ${baseTypeName}.fromJSON(jsonObj.${field.name}) : new ${baseTypeName}()`;
523
+ }
524
+ return ` (jsonObj.${field.name} !== null) ? jsonObj?.${field.name} : undefined`;
525
+ }
526
+ generateToJSONField(field) {
527
+ const typeParts = field.type.split("->");
528
+ const baseType = typeParts.length === 2 ? typeParts[1] : field.type;
529
+ if (baseType.endsWith("[]")) {
530
+ const elementType = baseType.slice(0, -2);
531
+ if (["string", "number", "boolean"].includes(elementType)) {
532
+ return ` ${field.name}: this.${field.name} ?? [],`;
533
+ }
534
+ return ` ${field.name}: (this.${field.name} != null) ? this.${field.name}.map((x) => x.toJson()) : [],`;
535
+ }
536
+ return ` ${field.name}: this.${field.name} != null ? this.${field.name} : undefined,`;
537
+ }
538
+ }
539
+ exports.default = ExpressHelper;
540
+ const tsconfigJson = {
541
+ "compilerOptions": {
542
+ "target": "es2016",
543
+ "module": "commonjs",
544
+ "outDir": "./dist",
545
+ "strict": true,
546
+ "esModuleInterop": true,
547
+ "inlineSourceMap": true
548
+ }
549
+ };
550
+ const packageJSON = {
551
+ "name": "",
552
+ "version": "1.0.0",
553
+ "description": "",
554
+ "main": "index.js",
555
+ "scripts": {
556
+ "start": "tsc && NODE_ENV=dev node ./dist/app.js",
557
+ "debug": "export DEBUG=* && npm run start",
558
+ "test": "echo \"Error: no test specified\" && exit 1"
559
+ },
560
+ "author": "Govind",
561
+ "license": "ISC",
562
+ "dependencies": {
563
+ "bcrypt": "^5.1.0",
564
+ "body-parser": "^1.20.1",
565
+ "cors": "^2.8.5",
566
+ "crypto": "^1.0.1",
567
+ "debug": "^4.3.4",
568
+ "dotenv": "^16.3.1",
569
+ "express": "^4.18.2",
570
+ "express-jwt": "^8.4.1",
571
+ "express-winston": "^4.2.0",
572
+ "jsonwebtoken": "^9.0.0",
573
+ "mongoose": "^6.8.1",
574
+ "winston": "^3.8.2"
575
+ },
576
+ "devDependencies": {
577
+ "@types/bcrypt": "^5.0.0",
578
+ "@types/cors": "^2.8.13",
579
+ "@types/debug": "^4.1.7",
580
+ "@types/express": "^4.17.15",
581
+ "@types/swagger-jsdoc": "^6.0.4",
582
+ "@types/swagger-ui-express": "^4.1.8",
583
+ "source-map-support": "^0.5.21",
584
+ "swagger-jsdoc": "^6.2.8",
585
+ "swagger-ui-express": "^5.0.1",
586
+ "tslint": "^6.1.3",
587
+ "typescript": "^4.9.4"
588
+ }
589
+ };
590
+ const envFileCode = `
591
+
592
+ `;
593
+ const envPath = "./.env.${process.env.NODE_ENV || 'dev'}";
594
+ const appTsCode = `
595
+
596
+ import express from 'express';
597
+ import * as http from 'http';
598
+
599
+ import cors from 'cors';
600
+ import debug from 'debug';
601
+
602
+ import {json, urlencoded} from 'body-parser';
603
+ import mongoose from 'mongoose';
604
+ import { CommonRoutesConfig } from './routes/common/common.routes.config';
605
+ import dotenv from "dotenv";
606
+ import UserRoutes from '../src-gen/api-routes/BaskyApi/User.routes';
607
+ dotenv.config({ path: \`${envPath}\` });
608
+ import { setupSwagger } from '../src/routes/swaggerConfig';
609
+ const app: express.Application = express();
610
+
611
+ app.use(cors({
612
+ origin: '*', // ⚠️ Allow all origins (not recommended for production)
613
+ methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
614
+ allowedHeaders: ['Content-Type', 'Authorization'],
615
+ credentials: true
616
+ }));
617
+ app.options('*', cors());
618
+ const port = 8000;
619
+ const routes: Array<CommonRoutesConfig> = [];
620
+ routes.push(new UserRoutes(app))
621
+ const debugLog: debug.IDebugger = debug('app');
622
+ app.use((err: any, req:express.Request, res:express.Response, next:any) => {
623
+ console.error(err.stack)
624
+ res.status(500).send('Something broke!')
625
+ });
626
+ app.use(express.json());
627
+
628
+ app.use(urlencoded());
629
+ app.use(json());
630
+ mongoose.set('strictQuery', false);
631
+ const runningMessage = "Server running ats http://localhost:"+port;
632
+ app.get('/', (req: express.Request, res: express.Response) => {
633
+
634
+ res.send("Hello World")
635
+ });
636
+
637
+
638
+ const server: http.Server = http.createServer(app);
639
+ setupSwagger(app);
640
+
641
+ server.listen(port, () => {
642
+ console.log(process.env.NODE_ENV,process.env.API_URL,"process.env.API_URL")
643
+ if(process.env.MONGO_DB_URL) {
644
+ mongoose.connect(process.env.MONGO_DB_URL).then(mongoConnection => {
645
+ console.log("Succesfully connected to the data base",routes)
646
+ })
647
+ }
648
+ console.log(runningMessage);
649
+ routes.forEach((route: CommonRoutesConfig) => {
650
+
651
+ });
652
+
653
+ });
654
+
655
+ `;
656
+ const routesCode = `
657
+ import express from 'express';
658
+ export abstract class CommonRoutesConfig {
659
+ app: express.Application;
660
+ name: string;
661
+
662
+ constructor(app: express.Application, name: string) {
663
+ this.app = app;
664
+ this.name = name;
665
+ this.configureRoutes();
666
+ }
667
+ getName() {
668
+ return this.name;
669
+ }
670
+ abstract configureRoutes(): express.Application;
671
+ }
672
+ `;
673
+ const authCode = `
674
+
675
+ import jwt from 'jsonwebtoken';
676
+
677
+ const verifyToken = (req: any, res: any, next: any) => {
678
+ const token =
679
+ req.body.token || req.query.token || req.headers["authorization"];
680
+
681
+ if (!token) {
682
+ return res.status(403).send("A token is required for authentication");
683
+ }
684
+ try {
685
+ const secretKey = process.env.JWT_SECRET_KEY || "";
686
+ const decoded = jwt.verify(token, secretKey);
687
+ req.user = decoded;
688
+ } catch (err) {
689
+ return res.status(401).send("Invalid Token");
690
+ }
691
+ return next();
692
+ };
693
+
694
+ export default verifyToken;
695
+
696
+ `;
697
+ const swaggerConfigCode = `
698
+ import swaggerJSDoc from "swagger-jsdoc";
699
+ import swaggerUi from "swagger-ui-express";
700
+ import { Express } from "express";
701
+
702
+ const options: swaggerJSDoc.Options = {
703
+ definition: {
704
+ openapi: "3.0.0",
705
+ info: {
706
+ title: "My API",
707
+ version: "1.0.0",
708
+ description: "API documentation",
709
+ },
710
+ servers: [
711
+ {
712
+ url: "http://localhost:8000", // Change this to match your environment
713
+ },
714
+ ],
715
+ },
716
+ // Specify the **patterns** for Swagger to scan all your route files
717
+ apis: ["src-gen/api-routes/**/*.ts"], // Adjust based on your folder structure
718
+ };
719
+
720
+ const swaggerSpec = swaggerJSDoc(options);
721
+
722
+ export function setupSwagger(app: any) {
723
+ app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerSpec));
724
+ }
725
+
726
+
727
+
728
+ `;