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,532 @@
1
+ import { IApiMainSection, IApiSection, IExpressSection } from "../types/apiOperationTypes";
2
+ import { IBasicProject, IBasicSection } from "../types/basicOperationTypes";
3
+ import { IDataSection } from "../types/dataOperationTypes";
4
+ import { IReactSection, IRNSection } from "../types/frontendOperationTypes";
5
+ import ExpressHelper from "./ExpressHelper";
6
+ import { FileHelper } from "./fileHelper";
7
+ import path from 'path';
8
+
9
+ export default class FrontEndReactApiHelper {
10
+ basicFilePath: string;
11
+ folderName: string;
12
+ folderPath: string;
13
+ basicFileContent: string;
14
+ configPath: string;
15
+ basicProjectContent: IBasicProject;
16
+
17
+ constructor() {
18
+ this.folderPath = path.join(process.cwd());
19
+ this.folderName = path.basename(this.folderPath);
20
+ this.basicFilePath = path.join(this.folderPath, `${this.folderName}.basic`);
21
+ this.configPath = path.join(this.folderPath, '.basicConfig');
22
+ this.basicProjectContent = JSON.parse(FileHelper.readFile(`${this.configPath}/basicConfig.json`) || "{}");
23
+ }
24
+ doFrontEndApiGenerations() {
25
+ this.writeStoreFiles();
26
+ this.createRequiredFiles();
27
+ }
28
+
29
+ createRequiredFiles() {
30
+ const apiMainSectionList: IApiMainSection[] = JSON.parse(FileHelper.readFile(`${this.configPath}/apiConfig.json`));
31
+ const rnSectionList: IReactSection[] = JSON.parse(FileHelper.readFile(`${this.configPath}/reactConfig.json`));
32
+ rnSectionList.forEach(rnSection => {
33
+ const rnFolderPath = path.join(this.folderPath, `module/${rnSection.name}/react`);
34
+ rnSection.reactModuleList.forEach(rnModule => {
35
+ let currentApiSection: IApiMainSection = apiMainSectionList.find(item => item.name === rnSection.name)
36
+ const rnProjectPath = path.join(rnFolderPath, rnModule.name);
37
+ const rapcode = this.generateRmoteApiPointsCode(currentApiSection);
38
+ FileHelper.createFile(`${rnProjectPath}/src/remote-api-point.ts`, rapcode);
39
+ FileHelper.createFile(`${rnProjectPath}/src/src-gen/data/common.ts`, commonApiDataCode);
40
+ FileHelper.createFile(`${rnProjectPath}/src/redux/store/store.ts`, mainStoreCode);
41
+ FileHelper.createFile(`${rnProjectPath}/src/redux/store/saga.ts`, mainSagaCode);
42
+ FileHelper.createFile(`${rnProjectPath}/src/redux/store/snackbar/snackbarSlice.ts`, snackbarSliceCode);
43
+ FileHelper.createFile(`${rnProjectPath}/src/redux/hooks.ts`, hooksCode);
44
+
45
+
46
+ })
47
+ })
48
+ }
49
+
50
+ generateRmoteApiPointsCode(currentApiSection: IApiMainSection) {
51
+ let code = `
52
+ import axios from 'axios';
53
+ const apiUrl = import.meta.env.VITE_API_URL;
54
+ ${currentApiSection.expressSectionList.reduce((acc, curVal) => {
55
+ acc = acc + `export const ${curVal.name}Api = axios.create({
56
+ baseURL: apiUrl||'http://localhost:8000', // Replace with your API base URL
57
+ headers: {
58
+ Authorization: localStorage.getItem("authToken")||""
59
+ }
60
+ });
61
+ \n
62
+ `
63
+ return acc;
64
+ }, "")}
65
+ `;
66
+ return code;
67
+ }
68
+
69
+ writeStoreFiles() {
70
+ const apiMainSectionList: IApiMainSection[] = JSON.parse(FileHelper.readFile(`${this.configPath}/apiConfig.json`));
71
+ const reactSectionList: IReactSection[] = JSON.parse(FileHelper.readFile(`${this.configPath}/reactConfig.json`));
72
+
73
+ reactSectionList.forEach(reactSection => {
74
+ const rnFolderPath = path.join(this.folderPath, `module/${reactSection.name}/react`);
75
+ let currentApiSection: IApiMainSection = apiMainSectionList.find(item => item.name === reactSection.name)
76
+ reactSection.reactModuleList.forEach(rnModule => {
77
+ const rnProjectPath = path.join(rnFolderPath, rnModule.name);
78
+ currentApiSection.expressSectionList.forEach(expressSection => {
79
+ const rnApiPath = path.join(rnProjectPath, `src/src-gen/redux/${expressSection.name}`);
80
+ const rnReducerPath = path.join(rnProjectPath, `src/src-gen/redux/gen-reducers.ts`);
81
+ const reducerCode = this.generateReducersCode(expressSection.apiSectionList, expressSection.name);
82
+ const rnSagaPath = path.join(rnProjectPath, `src/src-gen/redux/gen-root-saga.ts`);
83
+ const rootSagaCode = this.generateRootSagaCode(expressSection.apiSectionList, expressSection.name);
84
+ FileHelper.writeFile(rnReducerPath, reducerCode);
85
+ FileHelper.writeFile(rnSagaPath, rootSagaCode);
86
+
87
+
88
+ expressSection.apiSectionList.forEach(apiSection => {
89
+ const apiSectionSlicePath = path.join(rnApiPath, apiSection.name, `${apiSection.name}Slice.ts`);
90
+ const apiSectionDataPath = path.join(rnApiPath, apiSection.name, `data.ts`);
91
+ const apiSectionActionPath = path.join(rnApiPath, apiSection.name, `action.ts`);
92
+ const apiSectionSagaPath = path.join(rnApiPath, apiSection.name, `${apiSection.name}Saga.ts`);
93
+ const sliceCode = this.generateSliceCode(apiSection);
94
+ const dataCode = this.generateApiDatacode(apiSection);
95
+ const actionCode = this.generateApiActioncode(apiSection, expressSection);
96
+ const sagaCode = this.generateSagaCode(apiSection);
97
+ FileHelper.writeFile(apiSectionSlicePath, sliceCode);
98
+ if(!this.isEmptyOrWhitespace(dataCode)) {
99
+ FileHelper.writeFile(apiSectionDataPath, dataCode);
100
+ }
101
+
102
+ FileHelper.writeFile(apiSectionActionPath, actionCode);
103
+ FileHelper.writeFile(apiSectionSagaPath, sagaCode);
104
+
105
+ })
106
+ })
107
+
108
+ })
109
+ })
110
+
111
+
112
+ }
113
+
114
+ isEmptyOrWhitespace(str: string): boolean {
115
+ return str.trim().length === 0;
116
+ }
117
+
118
+
119
+ generateSliceCode(apiSection: IApiSection) {
120
+ const filteredApiListForData = apiSection.apiList.filter(api => {
121
+ const inputKeyList = Object.keys(api.input);
122
+ const outputKeyList = Object.keys(api.output);
123
+ return inputKeyList.length>0||outputKeyList.length>0
124
+ })
125
+ const code = `
126
+ import { createSlice, PayloadAction } from "@reduxjs/toolkit";
127
+
128
+
129
+ ${filteredApiListForData.length>0?`import { ${filteredApiListForData.reduce((acc, curVal) => {
130
+ const inputKeyList = Object.keys(curVal.input);
131
+ const outputKeyList = Object.keys(curVal.output);
132
+ const inputDataTypeName: string = (`${apiSection.name}_${curVal.name}_Input`).toUpperCase();
133
+ const outputDataTypeName: string = (`${apiSection.name}_${curVal.name}_Output`).toUpperCase();
134
+ acc = acc + `${inputKeyList.length > 0 ? inputDataTypeName + ',' : ''}`;
135
+ acc = acc + `${outputKeyList.length > 0 ? outputDataTypeName + ',' : ''}`;
136
+ return acc
137
+ }, '')} } from "./data";`:''}
138
+
139
+ ${
140
+ apiSection.apiList.reduce((acc, curVal) => {
141
+ if (curVal?.directOutput?.name) {
142
+ const [moduleName, dataName] = curVal?.directOutput?.name?.split("->");
143
+ console.log(dataName,moduleName,"DataName...........")
144
+ if(dataName) {
145
+ acc = acc + `import {${dataName?.replace("[]","")}} from "../../../data/${moduleName}";`;
146
+ }
147
+
148
+ }
149
+
150
+ return acc
151
+ }, '')}
152
+
153
+
154
+ import { ApiStatus } from "../../../data/common";
155
+ interface ${apiSection.name}State {
156
+ ${apiSection.apiList.reduce((acc, curVal) => {
157
+ const [moduleName, dataName] = curVal?.directOutput?.name?.split("->")||[];
158
+ acc = acc + `${curVal.name}: {
159
+ data: ${Object.keys(curVal.output).length > 0 ? `${apiSection.name.toUpperCase()}_${curVal.name.toUpperCase()}_OUTPUT` :dataName?dataName: "any"},\n
160
+ status: ApiStatus,
161
+ error:string|null
162
+ }
163
+ `
164
+ return acc
165
+ }, "")}
166
+ }
167
+
168
+ const initialState: ${apiSection.name}State = {
169
+ ${apiSection.apiList.reduce((acc, curVal) => {
170
+ const [moduleName, dataName] = curVal?.directOutput?.name?.split("->")||[];
171
+
172
+ const isOutputDataArray = (dataName || "").includes("[]")
173
+
174
+ acc = acc + `${curVal.name}:{
175
+ data: ${Object.keys(curVal.output).length > 0 ? `new ${apiSection.name.toUpperCase()}_${curVal.name.toUpperCase()}_OUTPUT()` :(dataName&&!isOutputDataArray)?`new ${dataName}()`:(dataName&&isOutputDataArray)?'[]': "null"},
176
+ status: ApiStatus.Idle,
177
+ error: null
178
+ },\n`
179
+ return acc
180
+ }, "")}
181
+ }
182
+
183
+ export const ${apiSection.name}Slice = createSlice({
184
+ name: "${apiSection.name}",
185
+ initialState,
186
+ reducers: {
187
+ reset${apiSection.name}Reducer: () => initialState,
188
+ ${apiSection.apiList.reduce((acc, curVal, currentIndex) => {
189
+ const inputKeyList = Object.keys(curVal.input);
190
+ const inputDataTypeName: string = (`${apiSection.name}_${curVal.name}_Input`).toUpperCase();
191
+ acc = acc + `
192
+ ${curVal.name}Action:(state:any, ${inputKeyList.length > 0 ? `payload:PayloadAction<${inputDataTypeName}>` : ``}) => {
193
+ state.${curVal.name}.status = ApiStatus.Loading;
194
+ state.${curVal.name}.error = '';
195
+ },
196
+ ${curVal.name}SuccessAction:(state:any, payload:any) => {
197
+ state.${curVal.name}.status = ApiStatus.Success;
198
+ state.${curVal.name}.data = payload.payload;
199
+ },
200
+ ${curVal.name}ErrorAction:(state:any, payload:any) => {
201
+ state.${curVal.name}.status = ApiStatus.Failed;
202
+ state.${curVal.name}.error = payload.error;
203
+ },
204
+ `
205
+ return acc;
206
+ }, '')
207
+ }
208
+ }
209
+
210
+ });
211
+
212
+ export const {reset${apiSection.name}Reducer,${apiSection.apiList.reduce((acc, curVal, currentIndex) => {
213
+ acc = acc + `
214
+ ${curVal.name}Action,${curVal.name}SuccessAction,${curVal.name}ErrorAction,
215
+ `; return acc
216
+ }, '')}} = ${apiSection.name}Slice.actions;
217
+ export default ${apiSection.name}Slice.reducer;
218
+ `
219
+ return code;
220
+ }
221
+
222
+
223
+ generateSagaCode(apiSection: IApiSection) {
224
+ const code = `
225
+ import { put, takeLatest } from "redux-saga/effects";
226
+ import { PayloadAction } from "@reduxjs/toolkit";
227
+
228
+
229
+ import { ${apiSection.apiList.reduce((acc, curVal) => {
230
+ acc = acc + `${curVal.name}Api,`;
231
+ return acc
232
+ }, '')} }from './action';
233
+
234
+ import { ${apiSection.apiList.reduce((acc, curVal) => {
235
+
236
+ acc = acc + `${curVal.name}SuccessAction,${curVal.name}ErrorAction,`;
237
+ return acc
238
+ }, '')} } from "./${apiSection.name}Slice";
239
+
240
+ ${apiSection.apiList.reduce((acc, curVal) => {
241
+ const inputKeyList = Object.keys(curVal.input);
242
+ acc = acc + `
243
+ function* ${curVal.name}Saga(action: PayloadAction<any>): any {
244
+ try {
245
+ const response: any = yield ${curVal.name}Api(${inputKeyList.length > 0 ? `action.payload` : ``})
246
+ yield put(${curVal.name}SuccessAction(response.data))
247
+ } catch(e: any) {
248
+ yield put(${curVal.name}ErrorAction(e));
249
+ }
250
+ }
251
+
252
+ export function* watch${apiSection.name}${curVal.name}() {
253
+ yield takeLatest("${apiSection.name}/${curVal.name}Action", ${curVal.name}Saga);
254
+ }
255
+ `
256
+ return acc
257
+
258
+ }, '')}
259
+
260
+ `
261
+
262
+ return code;
263
+ }
264
+
265
+ generateReducersCode(apiSectionList: IApiSection[], sectionName: string) {
266
+ const code = `
267
+ ${apiSectionList.reduce((acc, curVal) => {
268
+ acc = acc + `
269
+ import ${curVal.name}Reducer from './${sectionName}/${curVal.name}/${curVal.name}Slice';\n`
270
+ return acc;
271
+ }, '')}
272
+
273
+ export const GeneratedReducers = {
274
+ ${apiSectionList.reduce((acc, curVal) => {
275
+ acc = acc + `${curVal.name.toLowerCase()}: ${curVal.name}Reducer,`
276
+ return acc;
277
+ }, '')}
278
+ }
279
+ `;
280
+ return code;
281
+ }
282
+
283
+ generateApiActioncode(apiSection: IApiSection, expressSection: IExpressSection) {
284
+ const filteredApiListForData = apiSection.apiList.filter(api => {
285
+ const inputKeyList = Object.keys(api.input);
286
+ const outputKeyList = Object.keys(api.output);
287
+ return inputKeyList.length>0||outputKeyList.length>0
288
+ })
289
+ const code = `
290
+ import { createAsyncThunk } from "@reduxjs/toolkit";
291
+ import axios, { AxiosError } from 'axios';
292
+ import {${expressSection.name}Api} from "../../../../remote-api-point";
293
+ ${filteredApiListForData.length>0?`import { ${filteredApiListForData.reduce((acc, curVal) => {
294
+ const inputKeyList = Object.keys(curVal.input);
295
+ const outputKeyList = Object.keys(curVal.output);
296
+ const inputDataTypeName: string = (`${apiSection.name}_${curVal.name}_Input`).toUpperCase();
297
+ const outputDataTypeName: string = (`${apiSection.name}_${curVal.name}_Output`).toUpperCase();
298
+ acc = acc + `${inputKeyList.length > 0 ? inputDataTypeName + ',' : ''}`;
299
+ acc = acc + `${outputKeyList.length > 0 ? outputDataTypeName + ',' : ''}`;
300
+ return acc
301
+ }, '')} } from "./data";`:''}
302
+
303
+ ${
304
+ apiSection.apiList.reduce((acc, curVal) => {
305
+ if (curVal?.directOutput?.name) {
306
+ const [moduleName, dataName] = curVal?.directOutput?.name?.split("->");
307
+ console.log(dataName,moduleName,"DataName...........")
308
+ if(dataName) {
309
+ acc = acc + `import {${dataName?.replace("[]","")}} from "../../../data/${moduleName}";`;
310
+ }
311
+
312
+ }
313
+
314
+ return acc
315
+ }, '')}
316
+
317
+
318
+
319
+
320
+
321
+ const showError = (err: AxiosError) => {
322
+ const errorResponse: any = err.response?.data || {};
323
+ if (err.response?.data) {
324
+ if (typeof (err.response?.data) == "string") {
325
+ return err.response?.data
326
+ } else {
327
+ return Object.keys(err.response?.data).reduce((acc, currVal) => {
328
+ acc = acc + errorResponse[currVal];
329
+ return acc;
330
+ }, "")
331
+ }
332
+ }
333
+ else {
334
+ return err.message
335
+ }
336
+ }
337
+
338
+
339
+ ${apiSection.apiList.reduce((acc, curVal) => {
340
+ const inputKeyList = Object.keys(curVal.input);
341
+ const outputKeyList = Object.keys(curVal.output);
342
+ const inputDataTypeName: string = (`${apiSection.name}_${curVal.name}_Input`).toUpperCase();
343
+ const outputDataTypeName: string = (`${apiSection.name}_${curVal.name}_Output`).toUpperCase();
344
+ const [moduleName, dataName] = curVal?.directOutput?.name?.split("->")||[];
345
+ acc = acc + `
346
+
347
+
348
+ export const ${curVal.name}Api = async (${inputKeyList.length > 0 ? `input: ${inputDataTypeName},` : ``} ) => {
349
+ return ${expressSection.name}Api.${curVal.type.toLowerCase()}('${this.getApiName(expressSection.name)}/${this.getApiName(apiSection.name)}/${this.getApiName(curVal.name)}',${inputKeyList.length > 0 ? `${curVal.type == 'post' ? 'input' : '{params: input.toJSON()}'}` : ''});
350
+ }
351
+
352
+ export const call${this.capitalizeFirstLetter(curVal.name)}Api = async (${inputKeyList.length > 0 ? `input: ${inputDataTypeName},` : ``} output: (output: ${outputKeyList.length > 0 ? outputDataTypeName :dataName?dataName: 'any'}) => any,error: (errMsg: any) => void) => {
353
+ try {
354
+ //const { data } = await ${expressSection.name}Api.${curVal.type.toLowerCase()}('${this.getApiName(apiSection.name)}/${this.getApiName(curVal.name)}',${inputKeyList.length > 0 ? `${curVal.type == 'post' ? 'input' : '{params: input.toJSON()}'}` : ''});
355
+ const { data } = await ${curVal.name}Api(${inputKeyList.length > 0 ? `${curVal.type == 'post' ? 'input' : 'input'}` : ''});
356
+ return output(data);
357
+ } catch (err: any) {
358
+ return error(showError(err));
359
+ }
360
+ }
361
+ `
362
+ return acc
363
+ }, '')}
364
+
365
+ `
366
+
367
+ return code;
368
+ }
369
+
370
+
371
+ generateRootSagaCode(apiSectionList: IApiSection[], expressSectionName: string) {
372
+ const code = `
373
+ import { all, fork } from "redux-saga/effects";
374
+ ${apiSectionList.reduce((acc, curVal) => {
375
+ acc = acc + `
376
+ import{
377
+ ${curVal.apiList.reduce((apiAcc, apiCurVal) => {
378
+ apiAcc = apiAcc + `
379
+ watch${curVal.name}${apiCurVal.name},
380
+ `;
381
+ return apiAcc
382
+ }, '')
383
+ }
384
+ } from './${expressSectionName}/${curVal.name}/${curVal.name}Saga';\n
385
+ `
386
+ return acc;
387
+ }, '')}
388
+
389
+
390
+
391
+
392
+ const genRootSaga = [
393
+
394
+ ${apiSectionList.reduce((acc, curVal) => {
395
+ acc = acc + `
396
+
397
+ ${curVal.apiList.reduce((apiAcc, apiCurVal) => {
398
+ apiAcc = apiAcc + `
399
+ watch${curVal.name}${apiCurVal.name}()
400
+ ,
401
+ `;
402
+ return apiAcc
403
+ }, '')
404
+ }
405
+
406
+ `
407
+ return acc;
408
+ }, '')}
409
+
410
+ ];
411
+
412
+ export default genRootSaga;
413
+ `;
414
+ return code;
415
+ }
416
+
417
+ getApiName(apiName: string) {
418
+ return apiName.replace(/[A-Z]/g, m => "-" + m.toLowerCase()).replace(/^-/, '');
419
+ }
420
+
421
+ capitalizeFirstLetter(val: string) {
422
+ return val.charAt(0).toUpperCase() + val.slice(1);
423
+ }
424
+
425
+ generateApiDatacode(apiSection: IApiSection) {
426
+ const expressHelper = new ExpressHelper();
427
+ return expressHelper.generateSampleApiDataCode(apiSection, "react-native");
428
+ }
429
+
430
+
431
+ }
432
+
433
+ const commonApiDataCode = `
434
+ export enum ApiStatus {
435
+ Success="Success",
436
+ Loading="Loading",
437
+ Failed="Failed",
438
+ Idle="Idle"
439
+ }
440
+ `;
441
+
442
+
443
+ const snackbarSliceCode = `
444
+ import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
445
+
446
+
447
+ export interface SnackbarRequest {
448
+ type: SnackbarType,
449
+ message: string,
450
+ timing: number
451
+ }
452
+
453
+ export enum SnackbarType {
454
+ Success="success",
455
+ Error="error",
456
+ }
457
+
458
+
459
+ interface SnackbarState {
460
+ snackbarRequestList: SnackbarRequest[]
461
+ }
462
+
463
+ const initialState:SnackbarState = {
464
+ snackbarRequestList: []
465
+ }
466
+
467
+
468
+ export const snackbarSlice= createSlice({
469
+ name: "Snackbar",
470
+ initialState: initialState,
471
+ reducers: {
472
+ addSnackbar: (state, action: {type:String,payload: SnackbarRequest}) => {
473
+ state.snackbarRequestList.push(action.payload);
474
+ },
475
+ removeLastSnackbar: (state) => {
476
+ state.snackbarRequestList.pop();
477
+ },
478
+ }
479
+ });
480
+
481
+
482
+ export const {addSnackbar,removeLastSnackbar} = snackbarSlice.actions;
483
+
484
+ export default snackbarSlice.reducer;
485
+ `
486
+
487
+
488
+ const mainStoreCode = `
489
+
490
+ import { configureStore } from '@reduxjs/toolkit'
491
+ import { GeneratedReducers } from '../../src-gen/redux/gen-reducers'
492
+ import SnackbarReducer from './snackbar/snackbarSlice'
493
+ import createSagaMiddleware from 'redux-saga';
494
+ import rootSaga from '../../src-gen/redux/gen-root-saga';
495
+ import { mySaga } from './saga';
496
+ const reduxSagaMiddleWareOptions = {};
497
+ const sagaMiddleWare = createSagaMiddleware(reduxSagaMiddleWareOptions);
498
+ export const store = configureStore({
499
+ reducer: {
500
+ ...GeneratedReducers,
501
+ snackbar: SnackbarReducer,
502
+ },
503
+ middleware: (getDefaultMiddleware) =>
504
+ getDefaultMiddleware().concat([sagaMiddleWare]),
505
+
506
+ })
507
+ sagaMiddleWare.run(mySaga)
508
+
509
+ export type RootState = ReturnType<typeof store.getState>
510
+
511
+ export type AppDispatch = typeof store.dispatch;
512
+
513
+ `;
514
+
515
+ const mainSagaCode = `
516
+ import { all, takeEvery } from "redux-saga/effects";
517
+ import genRootSaga from "../../src-gen/redux/gen-root-saga";
518
+
519
+ export function* mySaga() {
520
+ yield all([...genRootSaga])
521
+ }
522
+ `
523
+
524
+ const hooksCode = `
525
+ import { useDispatch, useSelector } from 'react-redux'
526
+ import type { TypedUseSelectorHook } from 'react-redux'
527
+ import type { RootState, AppDispatch } from './store/store'
528
+
529
+ // Use throughout your app instead of plain useDispatch and useSelector
530
+ export const useAppDispatch: () => AppDispatch = useDispatch
531
+ export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector
532
+ `;
@@ -0,0 +1,165 @@
1
+ import path from 'path';
2
+ import { IBasicProject } from "../types/basicOperationTypes";
3
+ import { FileHelper } from './fileHelper';
4
+ import { ICollection, IDataBase, IMongoSection } from '../types/mongoOperationTypes';
5
+ import { CommonHelper } from './CommonHelper';
6
+ import BlendMongoGrammarHelper from './grammarHelper/BlendMongoGrammarHelper';
7
+
8
+ export default class MongoHelper {
9
+ basicFilePath: string;
10
+ folderName: string;
11
+ folderPath: string;
12
+ basicFileContent: string;
13
+ configPath: string;
14
+ baseRoute: string = 'api';
15
+ basicProjectContent: IBasicProject;
16
+
17
+ constructor() {
18
+ this.folderPath = path.join(process.cwd());
19
+ this.folderName = path.basename(this.folderPath);
20
+ this.basicFilePath = path.join(this.folderPath, `${this.folderName}.basic`);
21
+ this.configPath = path.join(this.folderPath, '.basicConfig');
22
+ this.basicProjectContent = JSON.parse(FileHelper.readFile(`${this.configPath}/basicConfig.json`) || "{}");
23
+ }
24
+
25
+ doMongoOperations(basicFileContent: string) {
26
+ // Normalize and trim the content to handle extra spaces
27
+ this.basicFileContent = basicFileContent.replace(/\s+/g, ' ').trim();
28
+ this.createMongoSpec();
29
+ this.parseSpec();
30
+ }
31
+
32
+ createMongoSpec() {
33
+ this.basicProjectContent.sectionList.forEach(section => {
34
+ const sectionName = section.name;
35
+ const sectionFolderPath = path.join(this.folderPath, 'spec', sectionName);
36
+ const mongoFolderPath = path.join(sectionFolderPath, 'mongo');
37
+ FileHelper.ensureDir(mongoFolderPath);
38
+ section.mongoModuleList.forEach(module => {
39
+ const mongoFilePath = path.join(mongoFolderPath, `${module.name}.mongo`);
40
+ if (!FileHelper.exists(mongoFilePath)) {
41
+ FileHelper.writeFile(mongoFilePath, `module ${module.name}`);
42
+ console.log(`Created mongo file: ${mongoFilePath}`);
43
+ } else {
44
+ }
45
+ })
46
+ })
47
+ }
48
+
49
+ parseSpec() {
50
+ let sectionMongoObjList = [];
51
+ this.basicProjectContent.sectionList.forEach(section => {
52
+ const sectionName = section.name;
53
+ const sectionFolderPath = path.join(this.folderPath, 'spec', sectionName);
54
+ let mainMongoObjList: IDataBase[] = [];
55
+ const mongoFolderPath = path.join(sectionFolderPath, 'mongo');
56
+ console.log(mongoFolderPath, "mongo")
57
+
58
+ section.mongoModuleList.forEach(module => {
59
+ const filePath = path.join(mongoFolderPath, `${module.name}.mongo`);
60
+ const specCode = FileHelper.readFile(filePath);
61
+ const mongoHelper = new BlendMongoGrammarHelper();
62
+ const json = mongoHelper.parseBlendMongo(specCode);
63
+ mainMongoObjList.push(json.json);
64
+
65
+ })
66
+ let sectionObj = {
67
+ name: sectionName,
68
+ sectionDbList: mainMongoObjList
69
+ }
70
+
71
+ sectionMongoObjList.push(sectionObj);
72
+ }
73
+ )
74
+ FileHelper.writeFile(`${this.configPath}/mongoConfig.json`, JSON.stringify(sectionMongoObjList));
75
+ }
76
+
77
+
78
+ parseJSONAndGenerateFiles() {
79
+ try {
80
+ const sectionMongoList: IMongoSection[] = JSON.parse(FileHelper.readFile(`${this.configPath}/mongoConfig.json`));
81
+ sectionMongoList.map(sectionMongo => {
82
+ const sectionPath = path.join(this.folderPath, `module/${sectionMongo.name}`);
83
+ sectionMongo.sectionDbList.forEach(moduleDb => {
84
+ this.basicProjectContent.sectionList.forEach(section => {
85
+ section.expressModuleList.forEach(expressModule => {
86
+ if (section.name == sectionMongo.name) {
87
+ const expressDbPath = `${this.folderPath}/module/${section.name}/express/${section.name}-api/src-gen/models/${expressModule.name}/${moduleDb.dbName}`
88
+ moduleDb.collectionList.forEach(collection => {
89
+ const expressCollectionPath = `${expressDbPath}/${collection.name}.ts`;
90
+ const finalCode = this.generateCollectionCode(collection, moduleDb.dbName);
91
+ FileHelper.writeFile(expressCollectionPath, finalCode);
92
+ })
93
+ const dbFilePath = `${this.folderPath}/module/${section.name}/express/${section.name}-api/src-gen/models/${expressModule.name}/Database.ts`;
94
+ const dbCode = this.generateDatabaseCodeFile(sectionMongo.sectionDbList);
95
+ FileHelper.writeFile(dbFilePath, dbCode);
96
+ const dbInterfaceFilePath = `${this.folderPath}/module/${section.name}/express/${section.name}-api/src-gen/models/${expressModule.name}/${moduleDb.dbName}/interfaces.ts`;
97
+ const interfaceCode = this.generateCollectionInterfaceCode(moduleDb.collectionList, moduleDb.dbName);
98
+ FileHelper.writeFile(dbInterfaceFilePath, interfaceCode);
99
+
100
+ }
101
+ });
102
+ })
103
+ })
104
+ })
105
+ } catch (e) {
106
+
107
+ }
108
+ }
109
+
110
+
111
+ generateCollectionCode(collection: ICollection, dbName: string) {
112
+ const interfaceName: string = `I${collection.name}_${dbName}`;
113
+ const code = `
114
+ import Database from '../Database';
115
+ import { Schema, model, connect, Types } from 'mongoose';\n
116
+ import {${interfaceName}} from './interfaces';
117
+ const ${collection.name}Schema = new Schema<${interfaceName}>({
118
+ ${collection.fields.reduce((acc: any, currVal) => {
119
+ acc = acc + `${currVal.name}: {type: ${currVal.type} ${currVal.required ? ',required:true' : ''} ${currVal.index ? ",index:true" : ""}${currVal.unique ? ',unique:true' : ''}${currVal.ref ? `,ref:"${currVal.ref}"` : ''}},\n\t`;
120
+ return acc;
121
+ }, "")
122
+ }
123
+ });
124
+
125
+ const ${collection.name} = Database.${dbName}Db.model<${interfaceName}>('${collection.name}', ${collection.name}Schema);
126
+
127
+ export default ${collection.name};
128
+ `
129
+ return code;
130
+ }
131
+
132
+
133
+ generateCollectionInterfaceCode(collectionList: ICollection[], dbName: string) {
134
+ const code = 'import { ObjectId } from "mongoose";\n'+ collectionList.reduce((acc, collection) => {
135
+ acc = acc +
136
+ `
137
+ export interface I${collection.name}_${dbName} {
138
+ ${collection.fields.reduce((acc: any, currVal) => {
139
+ acc = acc + `${currVal.name}: ${currVal.type.replace("Types.","")},\n\t\t\t`;
140
+ return acc;
141
+ }, "")
142
+ }
143
+ };\n
144
+ `
145
+ return acc;
146
+ }, "")
147
+ return code;
148
+ }
149
+
150
+
151
+ generateDatabaseCodeFile(dbList: IDataBase[]) {
152
+ const code = `
153
+ import mongoose from "mongoose";
154
+
155
+ export default class Database {
156
+ ${dbList.reduce((acc, db) => {
157
+ acc = acc + `static ${db.dbName}Db = mongoose.connection.useDb('${CommonHelper.hyphenSepratedString(db.dbName)}'); \n`
158
+ return acc;
159
+ }, '')}
160
+ }
161
+ `
162
+
163
+ return code;
164
+ }
165
+ }