@simitgroup/simpleapp-generator 1.0.32 → 1.0.35

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 (281) hide show
  1. package/.vscode/settings.json +3 -0
  2. package/README.md +185 -16
  3. package/buildinschemas copy/autoincreament.autoinc.jsonschema.json +39 -0
  4. package/buildinschemas copy/branch.branch.jsonschema.json +41 -0
  5. package/buildinschemas copy/docnoformat.docno.jsonschema.json +41 -0
  6. package/buildinschemas copy/organization.org.jsonschema.json +50 -0
  7. package/buildinschemas copy/permission.perm.jsonschema.json +23 -0
  8. package/buildinschemas copy/permission.perm.jsonschema.try.json +25 -0
  9. package/buildinschemas copy/tenant.tenant.jsonschema.json +21 -0
  10. package/buildinschemas copy/tenant.tenant.jsonschema.try.json +27 -0
  11. package/buildinschemas copy/user.user.jsonschema.json +31 -0
  12. package/dist/buildinschemas/autoincreament.d.ts +3 -0
  13. package/dist/buildinschemas/autoincreament.d.ts.map +1 -0
  14. package/dist/buildinschemas/autoincreament.js +36 -0
  15. package/dist/buildinschemas/autoincreament.js.map +1 -0
  16. package/dist/buildinschemas/branch.d.ts +3 -0
  17. package/dist/buildinschemas/branch.d.ts.map +1 -0
  18. package/dist/buildinschemas/branch.js +41 -0
  19. package/dist/buildinschemas/branch.js.map +1 -0
  20. package/dist/buildinschemas/docnoformat.d.ts +3 -0
  21. package/dist/buildinschemas/docnoformat.d.ts.map +1 -0
  22. package/dist/buildinschemas/docnoformat.js +60 -0
  23. package/dist/buildinschemas/docnoformat.js.map +1 -0
  24. package/dist/buildinschemas/index.d.ts +8 -0
  25. package/dist/buildinschemas/index.d.ts.map +1 -0
  26. package/dist/buildinschemas/index.js +18 -0
  27. package/dist/buildinschemas/index.js.map +1 -0
  28. package/dist/buildinschemas/organization.d.ts +3 -0
  29. package/dist/buildinschemas/organization.d.ts.map +1 -0
  30. package/dist/buildinschemas/organization.js +34 -0
  31. package/dist/buildinschemas/organization.js.map +1 -0
  32. package/dist/buildinschemas/permission.d.ts +3 -0
  33. package/dist/buildinschemas/permission.d.ts.map +1 -0
  34. package/dist/buildinschemas/permission.js +34 -0
  35. package/dist/buildinschemas/permission.js.map +1 -0
  36. package/dist/buildinschemas/tenant.d.ts +3 -0
  37. package/dist/buildinschemas/tenant.d.ts.map +1 -0
  38. package/dist/buildinschemas/tenant.js +41 -0
  39. package/dist/buildinschemas/tenant.js.map +1 -0
  40. package/dist/buildinschemas/user.d.ts +3 -0
  41. package/dist/buildinschemas/user.d.ts.map +1 -0
  42. package/dist/buildinschemas/user.js +31 -0
  43. package/dist/buildinschemas/user.js.map +1 -0
  44. package/dist/constant.d.ts +4 -0
  45. package/dist/constant.d.ts.map +1 -0
  46. package/dist/constant.js +2 -1
  47. package/dist/constant.js.map +1 -1
  48. package/dist/framework.d.ts +10 -0
  49. package/dist/framework.d.ts.map +1 -0
  50. package/dist/framework.js +120 -68
  51. package/dist/framework.js.map +1 -1
  52. package/dist/generate-allow-changebackend.js +305 -0
  53. package/dist/generate-allow-changebackend.js.map +1 -0
  54. package/dist/generate.d.ts +2 -0
  55. package/dist/generate.d.ts.map +1 -0
  56. package/dist/generate.js +310 -230
  57. package/dist/generate.js.map +1 -1
  58. package/dist/index.d.ts +3 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +84 -20
  61. package/dist/index.js.map +1 -1
  62. package/dist/libs.d.ts +2 -0
  63. package/dist/libs.d.ts.map +1 -0
  64. package/dist/processors/groupsbuilder.js +2 -0
  65. package/dist/processors/groupsbuilder.js.map +1 -0
  66. package/dist/processors/jsonschemabuilder.d.ts +4 -0
  67. package/dist/processors/jsonschemabuilder.d.ts.map +1 -0
  68. package/dist/processors/jsonschemabuilder.js +146 -172
  69. package/dist/processors/jsonschemabuilder.js.map +1 -1
  70. package/dist/schematype/baseschema.js +25 -0
  71. package/dist/schematype/baseschema.js.map +1 -0
  72. package/dist/schematype/default.js +2 -0
  73. package/dist/schematype/default.js.map +1 -0
  74. package/dist/schematype/index.js +12 -0
  75. package/dist/schematype/index.js.map +1 -0
  76. package/dist/schematype/primarymasterdata.js +38 -0
  77. package/dist/schematype/primarymasterdata.js.map +1 -0
  78. package/dist/schematype/simple.js +24 -0
  79. package/dist/schematype/simple.js.map +1 -0
  80. package/dist/schematype/simplemasterdata.js +31 -0
  81. package/dist/schematype/simplemasterdata.js.map +1 -0
  82. package/dist/schematype/transaction.js +74 -0
  83. package/dist/schematype/transaction.js.map +1 -0
  84. package/dist/storage.d.ts +3 -0
  85. package/dist/storage.d.ts.map +1 -0
  86. package/dist/storage.js +2 -2
  87. package/dist/storage.js.map +1 -1
  88. package/dist/type.d.ts +164 -0
  89. package/dist/type.d.ts.map +1 -0
  90. package/dist/type.js +16 -1
  91. package/dist/type.js.map +1 -1
  92. package/dist/validation.d.ts +1 -0
  93. package/dist/validation.d.ts.map +1 -0
  94. package/documentation/designconcept.bpmn +349 -0
  95. package/documentation/documentation.png +0 -0
  96. package/documentation/infra.drawio +141 -0
  97. package/documentation/infra.png +0 -0
  98. package/documentation/management.drawio +57 -0
  99. package/documentation/stack.drawio +106 -0
  100. package/package.json +3 -1
  101. package/src/buildinschemas/autoincreament.ts +34 -0
  102. package/src/buildinschemas/branch.ts +39 -0
  103. package/src/buildinschemas/docnoformat.ts +58 -0
  104. package/src/buildinschemas/index.ts +7 -0
  105. package/src/buildinschemas/organization.ts +31 -0
  106. package/src/buildinschemas/permission.ts +31 -0
  107. package/src/buildinschemas/tenant.ts +38 -0
  108. package/src/buildinschemas/user.ts +28 -0
  109. package/src/constant.ts +2 -1
  110. package/src/framework.ts +126 -67
  111. package/src/generate.ts +327 -266
  112. package/src/generate.ts.backup +339 -0
  113. package/src/index.ts +93 -18
  114. package/src/processors/jsonschemabuilder.ts +199 -226
  115. package/src/processors/jsonschemabuilder.ts-old +383 -0
  116. package/src/storage.ts +1 -1
  117. package/src/type.ts +94 -27
  118. package/templates/basic/nest/controller.ts.eta +255 -0
  119. package/templates/basic/nest/default.ts.eta +42 -0
  120. package/templates/basic/{model.eta → nest/model.ts.eta} +18 -5
  121. package/templates/basic/nest/processor.ts.eta +129 -0
  122. package/templates/basic/nest/service.ts.eta +64 -0
  123. package/templates/basic/{type.eta → nest/type.ts.eta} +3 -3
  124. package/templates/basic/nuxt/default.ts.eta +42 -0
  125. package/templates/basic/{pageindex.vue.eta → nuxt/pages.crud.vue.eta} +85 -22
  126. package/templates/basic/nuxt/simpleapp.doc.ts.eta +11 -0
  127. package/templates/basic/nuxt/simpleapp.generate.client.ts.eta +212 -0
  128. package/templates/nest/.env.eta +31 -0
  129. package/templates/nest/.gitignore.eta +40 -0
  130. package/templates/nest/src/app.controller.ts.eta +19 -0
  131. package/templates/nest/src/app.module.ts.eta +77 -0
  132. package/templates/nest/src/app.service.ts.eta +9 -0
  133. package/templates/nest/src/main.ts.eta +58 -0
  134. package/templates/nest/src/simpleapp/generate/apischemas/index.ts.eta +16 -0
  135. package/templates/nest/src/simpleapp/generate/commons/decorators/appuser.decorator.ts.eta +8 -0
  136. package/templates/nest/src/simpleapp/generate/commons/dicts/foreignkeys.ts.eta +1 -0
  137. package/templates/nest/src/simpleapp/generate/commons/docnogenerator.service.ts.eta +101 -0
  138. package/templates/nest/src/simpleapp/generate/commons/exceptions/SimpleAppExceptionFilter.ts.eta +39 -0
  139. package/templates/nest/src/simpleapp/generate/commons/interceptors/response.interceptor.ts.eta +38 -0
  140. package/templates/nest/src/simpleapp/generate/commons/middlewares/tenant.middleware.ts.eta +88 -0
  141. package/templates/nest/{Workflow.eta → src/simpleapp/generate/commons/providers/workflow.provider.ts.etax} +20 -14
  142. package/templates/nest/src/simpleapp/generate/commons/roles/roles.decorator.ts.eta +6 -0
  143. package/templates/nest/src/simpleapp/generate/commons/roles/roles.enum.ts.eta +28 -0
  144. package/templates/nest/src/simpleapp/generate/commons/roles/roles.group.ts.eta +10 -0
  145. package/templates/nest/src/simpleapp/generate/commons/roles/roles.guard.ts.eta +34 -0
  146. package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +391 -0
  147. package/templates/nest/src/simpleapp/generate/controllers/simpleapp.controller.ts.eta +71 -0
  148. package/templates/nest/src/simpleapp/generate/models/perm.model.ts.eta +53 -0
  149. package/templates/nest/src/simpleapp/generate/models/tenant.model.ts.eta +45 -0
  150. package/templates/nest/src/simpleapp/generate/models/user.model.ts.eta +57 -0
  151. package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +624 -0
  152. package/templates/nest/src/simpleapp/generate/types/index.ts.eta +19 -0
  153. package/templates/nest/src/simpleapp/profile/profile.apischema.ts.eta +74 -0
  154. package/templates/nest/src/simpleapp/profile/profile.controller.ts.eta +110 -0
  155. package/templates/nest/src/simpleapp/profile/profile.service.ts.eta +195 -0
  156. package/templates/nest/src/simpleapp/profile/profile.types.ts.eta +18 -0
  157. package/templates/nest/src/simpleapp/services/autoinc.service.ts.eta +89 -0
  158. package/templates/nest/src/simpleapp/services/branch.service.ts.eta +66 -0
  159. package/templates/nest/src/simpleapp/services/docno.service.ts.eta +93 -0
  160. package/templates/nest/src/simpleapp/services/org.service.ts.eta +67 -0
  161. package/templates/nest/src/simpleapp/services/perm.service.ts.eta +102 -0
  162. package/templates/nest/src/simpleapp/services/tenant.service.ts.eta +69 -0
  163. package/templates/nest/src/simpleapp/services/user.service.ts.eta +66 -0
  164. package/templates/nest/src/simpleapp/simpleapp.module.ts.eta +43 -0
  165. package/templates/nuxt/.env.eta +21 -0
  166. package/templates/nuxt/.gitignore.eta +28 -0
  167. package/templates/nuxt/app.vue.eta +5 -2
  168. package/templates/nuxt/assets/css/tailwind.css.eta +35 -0
  169. package/templates/nuxt/components/CrudNestedDoc.vue.eta +164 -0
  170. package/templates/nuxt/components/CrudSimple.vue.eta +179 -0
  171. package/templates/nuxt/{components.debugdocdata.vue.eta → components/DebugDocumentData.vue.eta} +4 -1
  172. package/templates/nuxt/{components.eventmonitor.vue.eta → components/EventMonitor.vue.eta} +27 -27
  173. package/templates/nuxt/components/Invitation.vue.eta +50 -0
  174. package/templates/nuxt/components/Menus.vue.eta +58 -0
  175. package/templates/nuxt/components/PermissionInfo.vue.eta +92 -0
  176. package/templates/nuxt/components/SimpleAppAutocomplete.vue.eta +131 -0
  177. package/templates/nuxt/components/SimpleAppAutocompletemulti.vue.eta +73 -0
  178. package/templates/nuxt/components/SimpleAppCalendar.vue.eta +55 -0
  179. package/templates/nuxt/components/SimpleAppCheckbox.vue.eta +29 -0
  180. package/templates/nuxt/components/SimpleAppChip.vue.eta +28 -0
  181. package/templates/nuxt/components/SimpleAppColor.vue.eta +41 -0
  182. package/templates/nuxt/components/SimpleAppDatatable.vue.eta +20 -0
  183. package/templates/nuxt/components/SimpleAppDocumentNo.vue.eta +90 -0
  184. package/templates/nuxt/components/SimpleAppDynamicInput.vue.eta +29 -0
  185. package/templates/nuxt/components/SimpleAppEditor.vue.eta +31 -0
  186. package/templates/nuxt/components/SimpleAppForm.vue.eta +131 -0
  187. package/templates/nuxt/components/SimpleAppInputTable.vue.eta +104 -0
  188. package/templates/nuxt/components/SimpleAppList.vue.eta +38 -0
  189. package/templates/nuxt/components/SimpleAppListmulti.vue.eta +41 -0
  190. package/templates/nuxt/components/SimpleAppNumber.vue.eta +32 -0
  191. package/templates/nuxt/components/SimpleAppPassword.vue.eta +41 -0
  192. package/templates/nuxt/components/SimpleAppRadio.vue.eta +42 -0
  193. package/templates/nuxt/components/SimpleAppRating.vue.eta +41 -0
  194. package/templates/nuxt/components/SimpleAppSelect.vue.eta +38 -0
  195. package/templates/nuxt/components/SimpleAppSelectmulti.vue.eta +39 -0
  196. package/templates/nuxt/components/SimpleAppSlider.vue.eta +42 -0
  197. package/templates/nuxt/components/SimpleAppSwitch.vue.eta +30 -0
  198. package/templates/nuxt/components/SimpleAppText.vue.eta +50 -0
  199. package/templates/nuxt/components/SimpleAppTextarea.vue.eta +30 -0
  200. package/templates/nuxt/components/SimpleAppValue.vue.eta +86 -0
  201. package/templates/nuxt/components/SimpleFieldContainer.vue.eta +102 -0
  202. package/templates/nuxt/components/XorgPicker.vue.eta +66 -0
  203. package/templates/nuxt/components/helper.ts.eta +90 -0
  204. package/templates/nuxt/components/type.ts.eta +32 -0
  205. package/templates/nuxt/composables/docformat.generate.ts.eta +5 -0
  206. package/templates/nuxt/{composables.getautocomplete.ts.eta → composables/getAutocomplete.generate.ts.eta} +4 -5
  207. package/templates/nuxt/{composables.getmenus.ts.eta → composables/getMenus.generate.ts.eta} +22 -7
  208. package/templates/nuxt/composables/getOpenApi.generate.ts.eta +6 -0
  209. package/templates/nuxt/composables/getTenant.generate.ts.eta +4 -0
  210. package/templates/nuxt/composables/getUserStore.generate.ts.eta +22 -0
  211. package/templates/nuxt/composables/logout.generate.ts.eta +22 -0
  212. package/templates/nuxt/composables/roles.generate.ts.eta +48 -0
  213. package/templates/nuxt/composables/stringHelper.generate.ts.eta +5 -0
  214. package/templates/nuxt/{layouts.default.vue.eta → layouts/default.vue.eta} +2 -0
  215. package/templates/nuxt/middleware/10.acl.global.ts.eta +38 -0
  216. package/templates/nuxt/nuxt.config.ts.eta +12 -2
  217. package/templates/nuxt/pages/[xorg]/branch/index.vue.eta +102 -0
  218. package/templates/nuxt/pages/[xorg]/docnoformat/[id].vue.eta +17 -0
  219. package/templates/nuxt/pages/[xorg]/docnoformat/index.vue.eta +269 -0
  220. package/templates/nuxt/pages/[xorg]/index.vue.eta +36 -0
  221. package/templates/nuxt/pages/[xorg]/organization/index.vue.eta +148 -0
  222. package/templates/nuxt/pages/[xorg]/permission/index.vue.eta +280 -0
  223. package/templates/nuxt/pages/[xorg]/tenant/index.vue.eta +93 -0
  224. package/templates/nuxt/pages/[xorg]/user/index.vue.eta +468 -0
  225. package/templates/nuxt/pages/index.vue.eta +191 -0
  226. package/templates/nuxt/pages/login.vue.eta +21 -0
  227. package/templates/nuxt/plugins/10.simpleapp-event.ts.eta +53 -0
  228. package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +155 -0
  229. package/templates/nuxt/plugins/50.simpleapp-client.ts.eta +23 -0
  230. package/templates/nuxt/{server.api.ts.eta → server/api/[xorg]/[...].ts.eta} +5 -2
  231. package/templates/nuxt/server/api/auth/[...].ts.eta +68 -0
  232. package/templates/nuxt/{server.api.auth.logout.ts.eta → server/api/auth/logout.ts.eta} +1 -3
  233. package/templates/nuxt/server/api/profile/[...].ts.eta +150 -0
  234. package/templates/nuxt/server/api/profile/index.ts.eta +103 -0
  235. package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +187 -0
  236. package/templates/nuxt/simpleapp/generate/commons/documents.ts.eta +6 -0
  237. package/templates/nuxt/simpleapp/generate/commons/events.ts.eta +5 -0
  238. package/templates/nuxt/simpleapp/generate/commons/groups.ts.eta +11 -0
  239. package/templates/nuxt/simpleapp/generate/commons/roles.ts.eta +21 -0
  240. package/templates/nuxt/types/index.ts.eta +65 -0
  241. package/templates/project/README.md +11 -0
  242. package/templates/project/build.sh.eta +17 -0
  243. package/templates/project/config.json.eta +2 -0
  244. package/templates/project/generate.ts.eta +10 -0
  245. package/templates/project/schemas/category.ts.eta +26 -0
  246. package/templates/project/schemas/index.ts.eta +5 -0
  247. package/templates/project/schemas/product.ts.eta +59 -0
  248. package/templates/project/shares/hello.ts.eta +1 -0
  249. package/templates/project/shares/index.ts.eta +2 -0
  250. package/tsconfig.json +9 -2
  251. package/tsconfig.tsbuildinfo +1 -0
  252. package/definations/category.cat.jsonschema.json +0 -55
  253. package/definations/level.lvl.jsonschema.json +0 -48
  254. package/definations/product.prd.jsonschema.json +0 -46
  255. package/templates/basic/controller.eta +0 -152
  256. package/templates/basic/module.eta +0 -22
  257. package/templates/basic/service.eta +0 -62
  258. package/templates/basic/simpleappclient.eta +0 -120
  259. package/templates/nest/SimpleAppController.eta +0 -69
  260. package/templates/nest/SimpleAppService.eta +0 -366
  261. package/templates/nest/TenantMiddleware.eta +0 -34
  262. package/templates/nest/UserProvider.eta +0 -127
  263. package/templates/nest/app.controller.eta +0 -12
  264. package/templates/nest/app.module.eta +0 -64
  265. package/templates/nest/app.service.eta +0 -8
  266. package/templates/nest/inputvalidation-exception.eta +0 -6
  267. package/templates/nest/nest.env.eta +0 -28
  268. package/templates/nest/nest.main.eta +0 -31
  269. package/templates/nuxt/components.crudsimple.vue.eta +0 -124
  270. package/templates/nuxt/components.menus.vue.eta +0 -35
  271. package/templates/nuxt/env.eta +0 -17
  272. package/templates/nuxt/pages.[xorg].index.vue.eta +0 -20
  273. package/templates/nuxt/pages.index.vue.eta +0 -72
  274. package/templates/nuxt/pages.login.vue.eta +0 -20
  275. package/templates/nuxt/plugins.simpleapp.ts.eta +0 -88
  276. package/templates/nuxt/server.api.auth[...].ts.eta +0 -233
  277. package/templates/nuxt/tailwind.css.eta +0 -49
  278. /package/templates/basic/{apischema.eta → nest/apischema.ts.eta} +0 -0
  279. /package/templates/basic/{jsonschema.eta → nest/jsonschema.ts.eta} +0 -0
  280. /package/templates/basic/{pageindexwithid.vue.eta → nuxt/pages.[id].vue.eta} +0 -0
  281. /package/templates/nest/{oauth2-redirect.eta → public_html/oauth2-redirect.html.eta} +0 -0
package/src/generate.ts CHANGED
@@ -1,104 +1,168 @@
1
- // import { readFormBuilder } from './processors/formbuilder.tsa';
2
- // import { readJsonSchemaBuilder } from './processors/jsonschemabuilder';
3
1
  import * as constants from './constant'
4
2
  import {readJsonSchemaBuilder} from './processors/jsonschemabuilder'
5
- import {foreignkeys} from './storage'
6
- // import { compile } from 'json-schema-to-typescript';
7
- // import { Fieldtypes, SchemaModel, ChildModels } from './type';
8
- import { TypeForeignKeyCatalogue, TypeGenerateDocumentVariable,ChildModels,ModuleObject } from './type'
3
+ import {allforeignkeys} from './storage'
4
+ import {TypeGenerateDocumentVariable,ChildModels,ModuleObject, SchemaType, SchemaConfig } from './type'
9
5
  import { Logger, ILogObj } from "tslog";
10
6
  const log: Logger<ILogObj> = new Logger();
11
7
  const clc = require("cli-color");
12
-
13
-
14
8
  const path = require('path');
15
9
  import {mkdirSync, readdir,readFileSync,writeFileSync,existsSync,copyFileSync, readdirSync} from 'fs'
10
+ import _ from 'lodash'
11
+ import * as buildinschemas from './buildinschemas'
12
+ import { JSONSchema7 } from 'json-schema';
16
13
  const { Eta } = require('eta');
17
14
  const { capitalizeFirstLetter }= require('./libs');
15
+ const X_DOCUMENT_TYPE='x-document-type'
16
+ const X_DOCUMENT_NAME='x-document-name'
17
+ const X_COLLECTION_NAME='x-collection-name'
18
+ const X_PAGE_TYPE='x-page-type'
18
19
  const extFb = '.xfb.json';
19
20
  const extHfb = '.xhfb.json';
20
21
  const extjsonschema = '.jsonschema.json';
22
+ const extgroups = '.group.json';
21
23
  let jsonschemas = {};
24
+ let configs:any = {}
22
25
  const docs = [];
23
-
24
- export const initialize = async (defFolder:string,backendfolder:string,frontendfolder:string,callback:Function) => {
25
- prepareEnvironments(backendfolder,frontendfolder)
26
- let activatemodules:ModuleObject[]=[]
26
+ let frontendFolder=''
27
+ let backendFolder=''
28
+ let frontendpagefolder=''
29
+ const allroles:any={}
30
+ let activatemodules:ModuleObject[]=[]
31
+ let generateTypes:any = {}
32
+
33
+
34
+ export const run = async (paraconfigs:any,genFor:string[],callback:Function) => {
35
+ configs = paraconfigs
36
+ frontendFolder=configs.frontendFolder
37
+ backendFolder=configs.backendFolder
38
+
39
+ const groupFolder = configs.groupFolder
40
+ if(genFor.includes('nest')){
41
+ generateTypes['nest']=backendFolder
42
+ }
43
+ if(genFor.includes('nuxt')){
44
+ generateTypes['nuxt']=frontendFolder
45
+ }
46
+ // console.log("genForgenForgenForgenFor",genFor,generateTypes)
27
47
  //
28
- const files = readdirSync(defFolder)
29
- // log.warn("all schemas:",files)
30
- // readdir(defFolder, (err, files) => {
31
- // files.forEach((file) => {
32
- for(let j = 0; j< files.length;j++){
33
- const file = files[j]
34
- log.info(`Load `+clc.green(file))
35
- const filearr = file.split('.');
36
- let rendertype = 'basic';
37
- const docname = filearr[0].toLowerCase();
38
- const doctype = filearr[1].toLowerCase();
39
- const jsonstring = readFileSync(defFolder +path.sep+ file, 'utf-8');
40
- let allmodels: ChildModels = {} as ChildModels;
41
-
42
- if (file.endsWith(extjsonschema)) {
43
- const jsondata = JSON.parse(jsonstring);
44
- rendertype = 'basic';
45
- jsonschemas[docname] = jsondata;
46
- // foreignkeys:
47
- // tmpforeignkeys:TypeForeignKey
48
- allmodels = await readJsonSchemaBuilder(doctype, docname, jsondata,foreignkeys);
49
-
50
- //foreignkeycatalogues
51
- // foreignkeys
52
- generate(docname, doctype, rendertype, allmodels,backendfolder,frontendfolder);
53
- activatemodules.push({doctype:doctype,docname:capitalizeFirstLetter(docname)})
54
- } else {
55
- log.warn(`Load `+clc.yellow(file) + ` but it is not supported`)
56
- }
57
- }
58
- // log.warn("foreignkeys---",foreignkeys)
59
- log.info("Activated backend modules: ",JSON.stringify(activatemodules))
60
- // log.info(activatemodules)
61
- finalize(activatemodules,backendfolder,frontendfolder)
62
- callback()
48
+ frontendpagefolder = `${frontendFolder}/pages/[xorg]`
49
+ const buildinschemanames = Object.keys(buildinschemas)
50
+ for(let i=0; i<buildinschemanames.length;i++){
51
+ const schemaname = buildinschemanames[i]
52
+ // .forEach(async(schemaname)=>{
53
+ const cloneschema:JSONSchema7 = {...buildinschemas[schemaname]}
54
+ // console.log("=====>>>>>",schemaname,cloneschema)
55
+ await processSchema(schemaname,cloneschema)
63
56
  }
64
-
65
-
57
+ // console.log('jsonschemasjsonschemasjsonschemasjsonschemas',jsonschemas)
58
+ // const buildinschemas = readdirSync(constants.buildinschemafolder)
59
+ // for(let i = 0; i< buildinschemas.length;i++){
60
+ // const file = buildinschemas[i]
61
+ // await processSchema(file,constants.buildinschemafolder)
62
+ // }
63
+ // load available bpmn into array
64
+ // const files = readdirSync(configs.jsonschemaFolder)
65
+ // for(let i = 0; i< files.length;i++){
66
+ // const file = files[i]
67
+ // await processSchema(file,constants.buildinschemafolder)
68
+ // }
69
+ // const schemapath = process.cwd()+'/'+ configs.jsonschemaFolder
70
+ // console.log("dynamic import" ,schemapath)
71
+ // const {category} = require(schemapath)
72
+ // const schemas = await import('/Users/kstan/dev/products/simtrain-next/project-design/jsonschemas');
73
+
74
+ // console.log(schemas)
75
+ // const schemanames = Object.keys(schemas)
76
+ // for(let i=0; i<schemanames.length;i++){
77
+ // const schemaname = schemanames[i]
78
+ // .forEach(async(schemaname)=>{
79
+ // const cloneschema:JSONSchema7 = {...buildinschemas[schemaname]}
80
+ // console.log("=====>>>>>",schemaname,cloneschema)
81
+ // await processSchema(schemaname,cloneschema)
82
+ // }
83
+ //
84
+ const files = readdirSync(configs.jsonschemaFolder)
85
+ for(let j = 0; j< files.length;j++){
86
+ const file = files[j]
87
+ const jsoncontent = readFileSync(`${configs.jsonschemaFolder}/${file}`, 'utf-8');
88
+ const jsonschema = JSON.parse(jsoncontent)
89
+ await processSchema(file,jsonschema)
90
+ }
91
+ // //generate groups
92
+ // const systemgroups = readdirSync(`${groupFolder}`)
93
+ // for(let g = 0; g< systemgroups.length;g++){
94
+ // const groupfile = systemgroups[g]
95
+ // const groupjsonstr = readFileSync(`${groupFolder}/${groupfile}`, 'utf-8');
96
+ // const groupdata = JSON.parse(groupjsonstr);
97
+ // const documentname = groupfile.split('.')[0]
98
+ // const roles = prepareRoles(groupdata)
99
+ // allroles[documentname]=roles
100
+ // }
101
+ finalize(activatemodules)
102
+ callback()
103
+ }
66
104
 
67
- const generate = (
68
- docname: string,
105
+ // const processSchema=async (file:string,defFolder:string)=>{
106
+ const processSchema= async (schemaname:string,jsondata:JSONSchema7)=>{
107
+
108
+ // console.log(file,defFolder)
109
+ // const filearr = file.split('.');
110
+ // let rendertype = 'basic';
111
+ // let docname = filearr[0].toLowerCase();
112
+ // let doctype = filearr[1].toLowerCase();
113
+ const config:SchemaConfig = jsondata['x-simpleapp-config']
114
+ let doctype = config.documentType
115
+ let docname = config.documentName
116
+ // const jsonstring = readFileSync(defFolder +path.sep+ file, 'utf-8');
117
+
118
+
119
+ // if (file.endsWith('.ts')) {
120
+ // log.info(`Load `+clc.green(file))
121
+ // const filepath = `${defFolder}/${file.replace('.ts','')}`
122
+ // console.log(filepath)
123
+ // const jsondata = require(filepath)
124
+ // console.log(jsondata)
125
+ // const jsondata = JSON.parse(jsonstring);
126
+ const rendertype = 'basic';
127
+ jsonschemas[docname] = jsondata;
128
+ const allmodels:ChildModels = await readJsonSchemaBuilder(docname, jsondata);
129
+ console.log("allmodels",docname,allmodels)
130
+ generateSchema(docname, doctype, rendertype, allmodels);
131
+ activatemodules.push({
132
+ doctype:doctype,
133
+ docname:capitalizeFirstLetter(docname),
134
+ pagetype: config.pageType??'',
135
+ api:config.additionalApis
136
+ })
137
+ // } else {
138
+ // log.warn(`Load `+clc.yellow(file) + ` but it is not supported`)
139
+ // }
140
+ }
141
+
142
+ /**
143
+ * generate frontend nuxt and backend nest codes.
144
+ *
145
+ */
146
+ const generateSchema = ( docname: string,
69
147
  doctype: string,
70
148
  rendertype: string,
71
- allmodels: ChildModels,
72
- backendfolder:string,
73
- frontendfolder:string
74
- ) => {
75
- const targetfolder = `${backendfolder}/src/docs/${doctype}`;
76
- const frontendpagefolder=`${frontendfolder}/pages/[xorg]`
77
- try {
78
-
79
- mkdirSync(targetfolder,{ recursive: true });
80
- mkdirSync(`${frontendfolder}/simpleapp/simpleappdocs/`,{ recursive: true });
81
- mkdirSync(frontendpagefolder,{recursive:true})
82
- } catch (err) {
83
- //do nothing if folder exists
84
- } finally {
85
- const templatefolder = `${constants.templatedir}/${rendertype}`
86
- log.info(`- Generate ${docname}, ${doctype}, ${templatefolder}`)
87
- const eta = new Eta({
88
- views: templatefolder,
89
- functionHeader:
90
- 'const capitalizeFirstLetter = (str) => str.slice(0, 1).toUpperCase() + str.slice(1);' +
91
- 'const initType=(str)=>{return ["string","number","boolean","array","object"].includes(str) ? capitalizeFirstLetter(str) : str;}',
92
- });
149
+ allmodels: ChildModels)=>{
150
+
93
151
 
152
+ const simpleapptemplates = `${constants.templatedir}/basic`
153
+ const finalizefolder = `${constants.templatedir}/nest`
154
+ const modelname = _.upperFirst(docname)
155
+ const currentmodel = allmodels[modelname]
156
+
157
+ //console.log("---^^^^^------",modelname,docname, doctype, rendertype,currentmodel,allmodels)
94
158
  const variables:TypeGenerateDocumentVariable = {
95
159
  name: docname,
96
160
  doctype: doctype,
97
161
  models: allmodels,
98
- autocompletecode:allmodels[capitalizeFirstLetter(docname)].codeField,
99
- autocompletename:allmodels[capitalizeFirstLetter(docname)].nameField,
100
- moreAutoComplete:allmodels[capitalizeFirstLetter(docname)].moreAutoComplete,
101
- schema: allmodels[capitalizeFirstLetter(docname)].model,
162
+ autocompletecode:currentmodel.codeField??'',
163
+ autocompletename:currentmodel.nameField??'',
164
+ moreAutoComplete:currentmodel.moreAutoComplete ??[],
165
+ schema: currentmodel.model,
102
166
  apiSchemaName: capitalizeFirstLetter(docname), //capitalizeFirstLetter(doctype) + 'ApiSchema',
103
167
  typename: capitalizeFirstLetter(docname),
104
168
  fullApiSchemaName:
@@ -110,207 +174,204 @@ const generate = (
110
174
  backEndCode: '',
111
175
  controllerCode:'',
112
176
  apiSchemaCode:'',
113
- docStatusSettings:allmodels[capitalizeFirstLetter(docname)].docStatusSettings,
114
- apiSettings:allmodels[capitalizeFirstLetter(docname)].apiSettings,
115
- requireautocomplete:allmodels[capitalizeFirstLetter(docname)].requireautocomplete,
116
- isolationtype:allmodels[capitalizeFirstLetter(docname)].isolationtype
177
+ docStatusSettings: currentmodel.docStatusSettings??[],
178
+ apiSettings: currentmodel.apiSettings??[],
179
+ isolationtype: currentmodel.isolationtype,
180
+ hasdocformat: currentmodel.hasdocformat,
181
+ foreignkeys: currentmodel.foreignkeys ?? {}
117
182
  };
118
183
 
119
- // console.log('generate 2', JSON.stringify(variables));
120
-
121
- // // const txtUISchema = eta.render('./uischema', variables);
122
-
123
- // console.log('generate 4');
124
- // console.log('generate 2', variables);
125
- const txtType = eta.render('./type', variables);
126
- writeFileSync(`${targetfolder}/${doctype}.type.ts`, txtType);
127
- // compile(jsonschemas[docname], docname).then((txtType: string) => {
128
- // writeFileSync(`${targetfolder}/${doctype}.type.ts`, txtType);
129
- // });
130
-
131
- // generate jsonschema object, use for data validation
132
- const txtJsonSchema = eta.render('./jsonschema', variables);
133
- writeFileSync(`${targetfolder}/${doctype}.jsonschema.ts`, txtJsonSchema);
134
-
135
- // generate before save source code, wont override after regenerate
136
- // const customizefilename = `${targetfolder}/${doctype}.beforesave.ts`;
137
- // if (!existsSync(customizefilename)) {
138
- // const txtBeforeSave = eta.render('./beforesave', variables);
139
- // writeFileSync(
140
- // `${targetfolder}/${doctype}.beforesave.ts`,
141
- // txtBeforeSave,
142
- // );
143
- // }
144
- // write mongoose model file
145
- const txtModel = eta.render('./model', variables);
146
- writeFileSync(`${targetfolder}/${doctype}.model.ts`, txtModel);
147
-
148
- // prepare openapi schema
149
- const apischemafile=`${targetfolder}/${doctype}.apischema.ts`
150
- if (existsSync(apischemafile)) {
151
- const apischemaCode = readFileSync(apischemafile).toString();
152
- const regexapischema =
153
- /\/\/<begin-apischema-code>([\s\S]*?)\/\/<end-apischema-code>/g;
154
- const apischemaresult = apischemaCode.match(regexapischema);
155
- if (apischemaresult) {
156
- variables.apiSchemaCode = apischemaresult[0];
157
- }else{
158
- variables.apiSchemaCode="//<begin-apischema-code>\n//<end-apischema-code>";
159
- }
160
- }
161
- const txtApiSchema = eta.render('./apischema', variables);
162
- writeFileSync(apischemafile, txtApiSchema);
163
-
164
- // prepare backend classes
165
- // prepare frontend api client
166
-
167
- const servicefile = `${targetfolder}/${doctype}.service.ts`;
168
- let bothEndCode = '';
169
- let backEndCode = '';
170
- if (existsSync(servicefile)) {
171
- const servicecodes = readFileSync(servicefile).toString();
172
-
173
- /* extract string bothend and backend, put in back */
174
- const regex1 =
175
- /\/\/<begin-bothend-code>([\s\S]*?)\/\/<end-bothend-code>/g;
176
- const regex2 =
177
- /\/\/<begin-backend-code>([\s\S]*?)\/\/<end-backend-code>/g;
178
- const bothendresult = servicecodes.match(regex1);
179
- const backendresult = servicecodes.match(regex2);
180
- console.log("bothendresult",bothendresult)
181
- console.log("backendresult",backendresult)
182
- if (bothendresult) {
183
- variables.bothEndCode = bothendresult[0];
184
- }else{
185
- variables.bothEndCode="//<begin-bothend-code>\n//<end-bothend-code>";
186
- }
187
-
188
- if (backendresult) {
189
- variables.backEndCode = backendresult[0];
190
- }else{
191
- variables.backEndCode="//<begin-backend-code>\n//<end-backend-code>";
192
- }
193
- }
194
-
195
-
196
- const txtService = eta.render('./service', variables);
197
- writeFileSync(`${targetfolder}/${doctype}.service.ts`, txtService);
198
-
199
- // prepare api router, allow add more api and wont override after regenerate
200
- const controllerfile = `${targetfolder}/${doctype}.controller.ts`;
201
- let controllerCode = ''
202
- if (existsSync(controllerfile)) {
203
- /* extract customized controller, put in back */
204
- const controllersourcecodes = readFileSync(controllerfile).toString();
205
- const controllerregex = /\/\/<begin-controller-code>([\s\S]*?)\/\/<end-controller-code>/g;
206
- const controllerresult = controllersourcecodes.match(controllerregex);
207
- if (controllerresult) {
208
- controllerCode = controllerresult[0];
209
- }
210
- }
211
- variables.controllerCode = controllerCode!='' ? controllerCode : "\n//<begin-controller-code>\n//<end-controller-code>";
212
- const txtController = eta.render('./controller', variables);
213
- writeFileSync(controllerfile, txtController);
214
-
215
- // prepare module
216
- const txtModule = eta.render('./module', variables);
217
- writeFileSync(`${targetfolder}/${doctype}.module.ts`, txtModule);
218
-
219
- // prepare readme
220
- // const txtReadme = eta.render('./readme', variables);
221
- // writeFileSync(`${targetfolder}/README.md`, txtReadme);
222
-
223
- const frontendfile = `${frontendfolder}/simpleapp/simpleappdocs/${variables.typename}Doc.ts`;
224
- let frontEndCode = '';
225
- if (existsSync(frontendfile)) {
226
- const clientcodes = readFileSync(frontendfile).toString();
227
-
228
- /* extract string frontend code, put in back */
229
- const regex3 =
230
- /\/\/<begin-frontend-code>([\s\S]*?)\/\/<end-frontend-code>/g;
231
-
232
- const frontendresult = clientcodes.match(regex3);
233
-
234
- if (frontendresult) {
235
- frontEndCode = frontendresult[0];
236
- }
237
- }
238
- variables.frontEndCode = frontEndCode ?? '';
239
- const txtDocClient = eta.render('./simpleappclient.eta', variables);
240
- writeFileSync(frontendfile, txtDocClient);
241
-
242
- generateClientPage(variables,eta,frontendpagefolder)
243
-
184
+ const templatefolder = `${constants.templatedir}/${rendertype}`
185
+ log.info(`- Generate ${docname}, ${doctype}, ${templatefolder}`)
186
+ const eta = new Eta({
187
+ views: '/',
188
+ functionHeader:
189
+ 'const capitalizeFirstLetter = (str) => str.slice(0, 1).toUpperCase() + str.slice(1);' +
190
+ 'const initType=(str)=>{return ["string","number","boolean","array","object"].includes(str) ? capitalizeFirstLetter(str) : str;}',
191
+ });
244
192
 
245
- log.info(`- write completed: ${doctype}`)
193
+ const backendTargetFolder = `${backendFolder}/src/simpleapp/generate`
194
+ const backendServiceFolder = `${backendFolder}/src/simpleapp/services`
246
195
 
247
196
 
248
- }
249
- };
250
-
251
- const generateClientPage=(variables:TypeGenerateDocumentVariable,eta,frontendpagefolder:string)=>{
252
- const docname = variables.name
253
- const targetfolder = `${frontendpagefolder}/${docname}`
254
- const overridefilename = `${targetfolder}/delete-me-for-avoid-override`
255
- if(!existsSync(targetfolder)){
256
- mkdirSync(targetfolder)
257
- writeFileSync(overridefilename,'delete this file to prevent override by generator')
258
- }
259
- if(existsSync(overridefilename)){
260
- const txtIndex= eta.render('./pageindex.vue.eta', variables);
261
- const txtIndexwithid= eta.render('./pageindexwithid.vue.eta', variables);
262
- writeFileSync(`${targetfolder}/index.vue`,txtIndex)
263
- writeFileSync(`${targetfolder}/[id].vue`,txtIndexwithid)
264
- }
265
- }
266
- const prepareEnvironments = (backendfolder:string,frontendfolder:string)=>{
267
- const targetfolder = `${backendfolder}/src/class`
268
- const targetfrontendfolder = `${frontendfolder}/server/api`
269
- try{
270
- mkdirSync(targetfolder,{recursive:true});
271
- mkdirSync(targetfrontendfolder,{recursive:true});
272
- }catch(error){
273
- //do nothing
274
- }
275
-
276
- copyFileSync(`${constants.templatedir}/nest/SimpleAppService.eta`,`${targetfolder}/SimpleAppService.ts`)
277
- copyFileSync(`${constants.templatedir}/nest/SimpleAppController.eta`,`${targetfolder}/SimpleAppController.ts`)
278
- copyFileSync(`${constants.templatedir}/nest/Workflow.eta`,`${targetfolder}/Workflow.ts`)
279
- copyFileSync(`${constants.templatedir}/nest/TenantMiddleware.eta`,`${targetfolder}/TenantMiddleware.ts`)
280
- copyFileSync(`${constants.templatedir}/nest/UserProvider.eta`,`${targetfolder}/UserProvider.ts`)
197
+ Object.keys(generateTypes).forEach((foldertype)=>{
198
+
281
199
 
282
- //copy over frontend apiabstract class
283
- // copyFileSync(`${constants.templatedir}/nuxt.apigateway.eta`,`${targetfrontendfolder}/[...].ts`)
200
+ //generate code for every schema
201
+ const generateTemplatefolder = `${constants.templatedir}/basic/${foldertype}`
202
+ const allfiles = readdirSync(generateTemplatefolder,{recursive:true})
203
+ for(let j=0; j<allfiles.length;j++){
204
+ const filename:string = String(allfiles[j])
205
+ const templatepath = `${generateTemplatefolder}/${filename}`
206
+
207
+ if(_.last(filename.split('.'))!='eta'){
208
+ log.warn("skip file: ",filename)
209
+ continue;
210
+ }
211
+ if(foldertype=='nest'){
212
+ const arrfilename:string[] = filename.split('.')
213
+ const filecategory = arrfilename[0]
214
+ const filetype = arrfilename[1]
215
+ const autogeneratetypes = ['apischema','controller','jsonschema','model','processor','type','default']
216
+ if(autogeneratetypes.includes(filecategory)){
217
+ //multiple files in folder, append s at folder name
218
+ const storein = `${backendTargetFolder}/${filecategory}s`
219
+ const targetfile = `${storein}/${doctype}.${filecategory}.${filetype}`
220
+ if(!existsSync(storein)){
221
+ mkdirSync(storein,{recursive:true})
222
+ }
223
+ const filecontent = eta.render(templatepath, variables)
224
+ writeFileSync(targetfile,filecontent);
225
+ }else if(filecategory=='service'){ //service file won't override if exists
226
+
227
+ const targetfile = `${backendServiceFolder}/${doctype}.${filecategory}.${filetype}`
228
+ if(!existsSync(backendServiceFolder)){
229
+ mkdirSync(backendServiceFolder,{recursive:true})
230
+ }
231
+ if(!existsSync(targetfile)){
232
+ const filecontent = eta.render(templatepath, variables)
233
+ writeFileSync(targetfile,filecontent);
234
+ }
235
+
236
+ }
237
+ }else if(foldertype=='nuxt'){
238
+ const capname = capitalizeFirstLetter(docname)
239
+ const validateWritePage = (folder:string,isexists:boolean)=>{
240
+ if(!jsonschemas[docname][X_PAGE_TYPE] ){
241
+ return false
242
+ }else if(!isexists){
243
+ return true
244
+ }else if( existsSync(`${folder}/delete-me.txt`)){
245
+ return true
246
+ }else{
247
+ return false
248
+ }
249
+ }
250
+ const mapfiles = {
251
+ 'pages.[id].vue.eta': {
252
+ to:`pages/[xorg]/${docname}`,
253
+ as:'[id].vue',
254
+ validate: validateWritePage
255
+ },
256
+ 'pages.crud.vue.eta': {
257
+ to:`pages/[xorg]/${docname}`,
258
+ as:'index.vue',
259
+ validate: validateWritePage
260
+ },
261
+ 'simpleapp.doc.ts.eta': {
262
+ to:`simpleapp/docs`,
263
+ as:`${capname}Doc.ts`,
264
+ validate: (folder:string,isexists:boolean)=>!isexists
265
+ },
266
+ 'default.ts.eta': {
267
+ to:`simpleapp/generate/defaults`,
268
+ as:`${capname}.default.ts`,
269
+ validate: (folder:string,isexists:boolean)=>{
270
+ return true
271
+ }
272
+ },
273
+
274
+ 'simpleapp.generate.client.ts.eta': {
275
+ to:`simpleapp/generate/clients`,
276
+ as:`${capname}Client.ts`,
277
+ validate: (folder:string,isexists:boolean)=>{
278
+ return true
279
+ }
280
+ },
281
+ }
282
+
283
+ const target = mapfiles[filename]
284
+ const targetfolder = `${generateTypes[foldertype]}/${target.to}`
285
+ const targetfile = `${targetfolder}/${target.as}`
286
+ const isexists = existsSync(targetfile)
287
+ const iswrite:boolean = target.validate(targetfolder,isexists)
288
+ log.warn("process: ",filename,'---->',targetfile)
289
+ if(iswrite && !existsSync(targetfolder)){
290
+ mkdirSync(targetfolder,{recursive:true})
291
+ writeFileSync(`${targetfolder}/delete-me.txt`,"delete this file for keep modified page");
292
+ }
293
+
294
+ // if(
295
+ // target.override=="always" ||
296
+ // !existsSync(targetfile) ||
297
+ // (target.override=="check" && existsSync(`${targetfolder}/delete-me.txt`))
298
+ // ){
299
+ if(iswrite){
300
+ const filecontent = eta.render(templatepath, variables)
301
+ writeFileSync(targetfile,filecontent);
302
+ }
303
+
304
+
305
+
306
+
307
+ }
308
+ }
309
+
284
310
 
285
- //prepare backend config.ts
311
+ })
312
+
313
+
286
314
 
287
- //copy over frontend config.ts
288
315
  }
289
316
 
290
317
 
291
- const finalize=(modules:ModuleObject[],backendfolder:string,frontendfolder:string)=>{
292
- log.info("Finalizing foreignkey:",JSON.stringify(foreignkeys))
293
- mkdirSync(`${backendfolder}/src/dicts/`,{ recursive: true });
294
- mkdirSync(`${frontendfolder}/composables/`,{ recursive: true });
295
-
296
- const eta = new Eta({views:constants.templatedir});
297
- const txtMainModule = eta.render('./nest/app.module.eta', modules);
298
- writeFileSync(`${backendfolder}/src/app.module.ts`, txtMainModule);
318
+ const finalize=(modules:ModuleObject[])=>{
319
+ const renderProperties = {
320
+ configs:configs,
321
+ modules:modules,
322
+ allroles:allroles,
323
+ foreignkeys:allforeignkeys,
324
+ }
299
325
 
300
- const txtMainService = eta.render('./nest/app.service.eta', modules);
301
- writeFileSync(`${backendfolder}/src/app.service.ts`, txtMainService);
302
-
303
- const txtAppController = eta.render('./nest/app.controller.eta', modules);
304
- writeFileSync(`${backendfolder}/src/app.controller.ts`, txtAppController);
305
-
306
- const foreignkeyfile =`${backendfolder}/src/dicts/foreignkeys.json`
307
- writeFileSync(foreignkeyfile, JSON.stringify(foreignkeys));
308
- log.info("write to foreignkey file ",foreignkeyfile)
309
326
 
310
- const txtCatalogue = eta.render('./nuxt/composables.getautocomplete.ts.eta', modules);
311
- writeFileSync(`${frontendfolder}/composables/getAutocomplete.ts`, txtCatalogue);
327
+ Object.getOwnPropertyNames(generateTypes).forEach((foldertype)=>{
328
+ const frameworkpath = generateTypes[foldertype]
329
+ log.info("Generate ",foldertype)
330
+ const frameworkfolder = `${constants.templatedir}/${foldertype}`
331
+ const frameworkfiles = readdirSync(frameworkfolder,{recursive:true})
332
+ const eta = new Eta({views:frameworkfolder});
333
+
334
+ //generate code for framework
335
+ for(let index=0; index<frameworkfiles.length; index++){
336
+ const longfilename:string = String(frameworkfiles[index])
337
+ const patharr = longfilename.split('/')
338
+ const filename = _.last(patharr)
339
+ const arrfilename:string[] = filename.split('.')
340
+ // log.info("check longfilename:::",longfilename,"become====",arrfilename)
341
+ //only process .eta
342
+ if(_.last(arrfilename)=='eta'){
343
+ const relativepath = longfilename.includes('/') ? longfilename.replace(`/${filename}`,'') : ''
344
+ const foldername = `${frameworkpath}/${relativepath}`
345
+ const shortfilename = filename.replace('.eta','')
346
+ const targetfilename = `${foldername}/${shortfilename}`
347
+ if(!existsSync(foldername)){
348
+ mkdirSync(foldername,{recursive:true})
349
+ }
350
+ const templatename = `${frameworkfolder}/${longfilename}`.replace(".eta","")
351
+ log.info("Write template:",templatename, '----> ',targetfilename)
352
+ const txt = eta.render(longfilename, renderProperties)
353
+ writeFileSync(targetfilename,txt)
354
+
355
+ }else{
356
+ log.warn("skip: ",longfilename)
357
+ }
358
+
359
+ }
360
+ })
312
361
 
313
- const txtMenus = eta.render('./nuxt/composables.getmenus.ts.eta', modules);
314
- writeFileSync(`${frontendfolder}/composables/getMenus.ts`, txtMenus);
315
-
362
+ }
363
+
364
+ const prepareRoles =(groupsettings) => {
365
+ let roles = []
366
+ const docnames = Object.getOwnPropertyNames(groupsettings)
367
+ for(let i = 0; i< docnames.length; i++){
368
+ let docname = docnames[i]
369
+ let docpermissions:string[] = groupsettings[docname]
370
+ for(let j=0;j<docpermissions.length;j++){
371
+ const perm = docpermissions[j]
372
+ const typename = _.upperFirst(docname)
373
+ roles.push(`${typename}_${perm}`)
374
+ }
375
+ }
376
+ return roles
316
377
  }