@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.
- package/.vscode/settings.json +3 -0
- package/README.md +185 -16
- package/buildinschemas copy/autoincreament.autoinc.jsonschema.json +39 -0
- package/buildinschemas copy/branch.branch.jsonschema.json +41 -0
- package/buildinschemas copy/docnoformat.docno.jsonschema.json +41 -0
- package/buildinschemas copy/organization.org.jsonschema.json +50 -0
- package/buildinschemas copy/permission.perm.jsonschema.json +23 -0
- package/buildinschemas copy/permission.perm.jsonschema.try.json +25 -0
- package/buildinschemas copy/tenant.tenant.jsonschema.json +21 -0
- package/buildinschemas copy/tenant.tenant.jsonschema.try.json +27 -0
- package/buildinschemas copy/user.user.jsonschema.json +31 -0
- package/dist/buildinschemas/autoincreament.d.ts +3 -0
- package/dist/buildinschemas/autoincreament.d.ts.map +1 -0
- package/dist/buildinschemas/autoincreament.js +36 -0
- package/dist/buildinschemas/autoincreament.js.map +1 -0
- package/dist/buildinschemas/branch.d.ts +3 -0
- package/dist/buildinschemas/branch.d.ts.map +1 -0
- package/dist/buildinschemas/branch.js +41 -0
- package/dist/buildinschemas/branch.js.map +1 -0
- package/dist/buildinschemas/docnoformat.d.ts +3 -0
- package/dist/buildinschemas/docnoformat.d.ts.map +1 -0
- package/dist/buildinschemas/docnoformat.js +60 -0
- package/dist/buildinschemas/docnoformat.js.map +1 -0
- package/dist/buildinschemas/index.d.ts +8 -0
- package/dist/buildinschemas/index.d.ts.map +1 -0
- package/dist/buildinschemas/index.js +18 -0
- package/dist/buildinschemas/index.js.map +1 -0
- package/dist/buildinschemas/organization.d.ts +3 -0
- package/dist/buildinschemas/organization.d.ts.map +1 -0
- package/dist/buildinschemas/organization.js +34 -0
- package/dist/buildinschemas/organization.js.map +1 -0
- package/dist/buildinschemas/permission.d.ts +3 -0
- package/dist/buildinschemas/permission.d.ts.map +1 -0
- package/dist/buildinschemas/permission.js +34 -0
- package/dist/buildinschemas/permission.js.map +1 -0
- package/dist/buildinschemas/tenant.d.ts +3 -0
- package/dist/buildinschemas/tenant.d.ts.map +1 -0
- package/dist/buildinschemas/tenant.js +41 -0
- package/dist/buildinschemas/tenant.js.map +1 -0
- package/dist/buildinschemas/user.d.ts +3 -0
- package/dist/buildinschemas/user.d.ts.map +1 -0
- package/dist/buildinschemas/user.js +31 -0
- package/dist/buildinschemas/user.js.map +1 -0
- package/dist/constant.d.ts +4 -0
- package/dist/constant.d.ts.map +1 -0
- package/dist/constant.js +2 -1
- package/dist/constant.js.map +1 -1
- package/dist/framework.d.ts +10 -0
- package/dist/framework.d.ts.map +1 -0
- package/dist/framework.js +120 -68
- package/dist/framework.js.map +1 -1
- package/dist/generate-allow-changebackend.js +305 -0
- package/dist/generate-allow-changebackend.js.map +1 -0
- package/dist/generate.d.ts +2 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +310 -230
- package/dist/generate.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -20
- package/dist/index.js.map +1 -1
- package/dist/libs.d.ts +2 -0
- package/dist/libs.d.ts.map +1 -0
- package/dist/processors/groupsbuilder.js +2 -0
- package/dist/processors/groupsbuilder.js.map +1 -0
- package/dist/processors/jsonschemabuilder.d.ts +4 -0
- package/dist/processors/jsonschemabuilder.d.ts.map +1 -0
- package/dist/processors/jsonschemabuilder.js +146 -172
- package/dist/processors/jsonschemabuilder.js.map +1 -1
- package/dist/schematype/baseschema.js +25 -0
- package/dist/schematype/baseschema.js.map +1 -0
- package/dist/schematype/default.js +2 -0
- package/dist/schematype/default.js.map +1 -0
- package/dist/schematype/index.js +12 -0
- package/dist/schematype/index.js.map +1 -0
- package/dist/schematype/primarymasterdata.js +38 -0
- package/dist/schematype/primarymasterdata.js.map +1 -0
- package/dist/schematype/simple.js +24 -0
- package/dist/schematype/simple.js.map +1 -0
- package/dist/schematype/simplemasterdata.js +31 -0
- package/dist/schematype/simplemasterdata.js.map +1 -0
- package/dist/schematype/transaction.js +74 -0
- package/dist/schematype/transaction.js.map +1 -0
- package/dist/storage.d.ts +3 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +2 -2
- package/dist/storage.js.map +1 -1
- package/dist/type.d.ts +164 -0
- package/dist/type.d.ts.map +1 -0
- package/dist/type.js +16 -1
- package/dist/type.js.map +1 -1
- package/dist/validation.d.ts +1 -0
- package/dist/validation.d.ts.map +1 -0
- package/documentation/designconcept.bpmn +349 -0
- package/documentation/documentation.png +0 -0
- package/documentation/infra.drawio +141 -0
- package/documentation/infra.png +0 -0
- package/documentation/management.drawio +57 -0
- package/documentation/stack.drawio +106 -0
- package/package.json +3 -1
- package/src/buildinschemas/autoincreament.ts +34 -0
- package/src/buildinschemas/branch.ts +39 -0
- package/src/buildinschemas/docnoformat.ts +58 -0
- package/src/buildinschemas/index.ts +7 -0
- package/src/buildinschemas/organization.ts +31 -0
- package/src/buildinschemas/permission.ts +31 -0
- package/src/buildinschemas/tenant.ts +38 -0
- package/src/buildinschemas/user.ts +28 -0
- package/src/constant.ts +2 -1
- package/src/framework.ts +126 -67
- package/src/generate.ts +327 -266
- package/src/generate.ts.backup +339 -0
- package/src/index.ts +93 -18
- package/src/processors/jsonschemabuilder.ts +199 -226
- package/src/processors/jsonschemabuilder.ts-old +383 -0
- package/src/storage.ts +1 -1
- package/src/type.ts +94 -27
- package/templates/basic/nest/controller.ts.eta +255 -0
- package/templates/basic/nest/default.ts.eta +42 -0
- package/templates/basic/{model.eta → nest/model.ts.eta} +18 -5
- package/templates/basic/nest/processor.ts.eta +129 -0
- package/templates/basic/nest/service.ts.eta +64 -0
- package/templates/basic/{type.eta → nest/type.ts.eta} +3 -3
- package/templates/basic/nuxt/default.ts.eta +42 -0
- package/templates/basic/{pageindex.vue.eta → nuxt/pages.crud.vue.eta} +85 -22
- package/templates/basic/nuxt/simpleapp.doc.ts.eta +11 -0
- package/templates/basic/nuxt/simpleapp.generate.client.ts.eta +212 -0
- package/templates/nest/.env.eta +31 -0
- package/templates/nest/.gitignore.eta +40 -0
- package/templates/nest/src/app.controller.ts.eta +19 -0
- package/templates/nest/src/app.module.ts.eta +77 -0
- package/templates/nest/src/app.service.ts.eta +9 -0
- package/templates/nest/src/main.ts.eta +58 -0
- package/templates/nest/src/simpleapp/generate/apischemas/index.ts.eta +16 -0
- package/templates/nest/src/simpleapp/generate/commons/decorators/appuser.decorator.ts.eta +8 -0
- package/templates/nest/src/simpleapp/generate/commons/dicts/foreignkeys.ts.eta +1 -0
- package/templates/nest/src/simpleapp/generate/commons/docnogenerator.service.ts.eta +101 -0
- package/templates/nest/src/simpleapp/generate/commons/exceptions/SimpleAppExceptionFilter.ts.eta +39 -0
- package/templates/nest/src/simpleapp/generate/commons/interceptors/response.interceptor.ts.eta +38 -0
- package/templates/nest/src/simpleapp/generate/commons/middlewares/tenant.middleware.ts.eta +88 -0
- package/templates/nest/{Workflow.eta → src/simpleapp/generate/commons/providers/workflow.provider.ts.etax} +20 -14
- package/templates/nest/src/simpleapp/generate/commons/roles/roles.decorator.ts.eta +6 -0
- package/templates/nest/src/simpleapp/generate/commons/roles/roles.enum.ts.eta +28 -0
- package/templates/nest/src/simpleapp/generate/commons/roles/roles.group.ts.eta +10 -0
- package/templates/nest/src/simpleapp/generate/commons/roles/roles.guard.ts.eta +34 -0
- package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +391 -0
- package/templates/nest/src/simpleapp/generate/controllers/simpleapp.controller.ts.eta +71 -0
- package/templates/nest/src/simpleapp/generate/models/perm.model.ts.eta +53 -0
- package/templates/nest/src/simpleapp/generate/models/tenant.model.ts.eta +45 -0
- package/templates/nest/src/simpleapp/generate/models/user.model.ts.eta +57 -0
- package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +624 -0
- package/templates/nest/src/simpleapp/generate/types/index.ts.eta +19 -0
- package/templates/nest/src/simpleapp/profile/profile.apischema.ts.eta +74 -0
- package/templates/nest/src/simpleapp/profile/profile.controller.ts.eta +110 -0
- package/templates/nest/src/simpleapp/profile/profile.service.ts.eta +195 -0
- package/templates/nest/src/simpleapp/profile/profile.types.ts.eta +18 -0
- package/templates/nest/src/simpleapp/services/autoinc.service.ts.eta +89 -0
- package/templates/nest/src/simpleapp/services/branch.service.ts.eta +66 -0
- package/templates/nest/src/simpleapp/services/docno.service.ts.eta +93 -0
- package/templates/nest/src/simpleapp/services/org.service.ts.eta +67 -0
- package/templates/nest/src/simpleapp/services/perm.service.ts.eta +102 -0
- package/templates/nest/src/simpleapp/services/tenant.service.ts.eta +69 -0
- package/templates/nest/src/simpleapp/services/user.service.ts.eta +66 -0
- package/templates/nest/src/simpleapp/simpleapp.module.ts.eta +43 -0
- package/templates/nuxt/.env.eta +21 -0
- package/templates/nuxt/.gitignore.eta +28 -0
- package/templates/nuxt/app.vue.eta +5 -2
- package/templates/nuxt/assets/css/tailwind.css.eta +35 -0
- package/templates/nuxt/components/CrudNestedDoc.vue.eta +164 -0
- package/templates/nuxt/components/CrudSimple.vue.eta +179 -0
- package/templates/nuxt/{components.debugdocdata.vue.eta → components/DebugDocumentData.vue.eta} +4 -1
- package/templates/nuxt/{components.eventmonitor.vue.eta → components/EventMonitor.vue.eta} +27 -27
- package/templates/nuxt/components/Invitation.vue.eta +50 -0
- package/templates/nuxt/components/Menus.vue.eta +58 -0
- package/templates/nuxt/components/PermissionInfo.vue.eta +92 -0
- package/templates/nuxt/components/SimpleAppAutocomplete.vue.eta +131 -0
- package/templates/nuxt/components/SimpleAppAutocompletemulti.vue.eta +73 -0
- package/templates/nuxt/components/SimpleAppCalendar.vue.eta +55 -0
- package/templates/nuxt/components/SimpleAppCheckbox.vue.eta +29 -0
- package/templates/nuxt/components/SimpleAppChip.vue.eta +28 -0
- package/templates/nuxt/components/SimpleAppColor.vue.eta +41 -0
- package/templates/nuxt/components/SimpleAppDatatable.vue.eta +20 -0
- package/templates/nuxt/components/SimpleAppDocumentNo.vue.eta +90 -0
- package/templates/nuxt/components/SimpleAppDynamicInput.vue.eta +29 -0
- package/templates/nuxt/components/SimpleAppEditor.vue.eta +31 -0
- package/templates/nuxt/components/SimpleAppForm.vue.eta +131 -0
- package/templates/nuxt/components/SimpleAppInputTable.vue.eta +104 -0
- package/templates/nuxt/components/SimpleAppList.vue.eta +38 -0
- package/templates/nuxt/components/SimpleAppListmulti.vue.eta +41 -0
- package/templates/nuxt/components/SimpleAppNumber.vue.eta +32 -0
- package/templates/nuxt/components/SimpleAppPassword.vue.eta +41 -0
- package/templates/nuxt/components/SimpleAppRadio.vue.eta +42 -0
- package/templates/nuxt/components/SimpleAppRating.vue.eta +41 -0
- package/templates/nuxt/components/SimpleAppSelect.vue.eta +38 -0
- package/templates/nuxt/components/SimpleAppSelectmulti.vue.eta +39 -0
- package/templates/nuxt/components/SimpleAppSlider.vue.eta +42 -0
- package/templates/nuxt/components/SimpleAppSwitch.vue.eta +30 -0
- package/templates/nuxt/components/SimpleAppText.vue.eta +50 -0
- package/templates/nuxt/components/SimpleAppTextarea.vue.eta +30 -0
- package/templates/nuxt/components/SimpleAppValue.vue.eta +86 -0
- package/templates/nuxt/components/SimpleFieldContainer.vue.eta +102 -0
- package/templates/nuxt/components/XorgPicker.vue.eta +66 -0
- package/templates/nuxt/components/helper.ts.eta +90 -0
- package/templates/nuxt/components/type.ts.eta +32 -0
- package/templates/nuxt/composables/docformat.generate.ts.eta +5 -0
- package/templates/nuxt/{composables.getautocomplete.ts.eta → composables/getAutocomplete.generate.ts.eta} +4 -5
- package/templates/nuxt/{composables.getmenus.ts.eta → composables/getMenus.generate.ts.eta} +22 -7
- package/templates/nuxt/composables/getOpenApi.generate.ts.eta +6 -0
- package/templates/nuxt/composables/getTenant.generate.ts.eta +4 -0
- package/templates/nuxt/composables/getUserStore.generate.ts.eta +22 -0
- package/templates/nuxt/composables/logout.generate.ts.eta +22 -0
- package/templates/nuxt/composables/roles.generate.ts.eta +48 -0
- package/templates/nuxt/composables/stringHelper.generate.ts.eta +5 -0
- package/templates/nuxt/{layouts.default.vue.eta → layouts/default.vue.eta} +2 -0
- package/templates/nuxt/middleware/10.acl.global.ts.eta +38 -0
- package/templates/nuxt/nuxt.config.ts.eta +12 -2
- package/templates/nuxt/pages/[xorg]/branch/index.vue.eta +102 -0
- package/templates/nuxt/pages/[xorg]/docnoformat/[id].vue.eta +17 -0
- package/templates/nuxt/pages/[xorg]/docnoformat/index.vue.eta +269 -0
- package/templates/nuxt/pages/[xorg]/index.vue.eta +36 -0
- package/templates/nuxt/pages/[xorg]/organization/index.vue.eta +148 -0
- package/templates/nuxt/pages/[xorg]/permission/index.vue.eta +280 -0
- package/templates/nuxt/pages/[xorg]/tenant/index.vue.eta +93 -0
- package/templates/nuxt/pages/[xorg]/user/index.vue.eta +468 -0
- package/templates/nuxt/pages/index.vue.eta +191 -0
- package/templates/nuxt/pages/login.vue.eta +21 -0
- package/templates/nuxt/plugins/10.simpleapp-event.ts.eta +53 -0
- package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +155 -0
- package/templates/nuxt/plugins/50.simpleapp-client.ts.eta +23 -0
- package/templates/nuxt/{server.api.ts.eta → server/api/[xorg]/[...].ts.eta} +5 -2
- package/templates/nuxt/server/api/auth/[...].ts.eta +68 -0
- package/templates/nuxt/{server.api.auth.logout.ts.eta → server/api/auth/logout.ts.eta} +1 -3
- package/templates/nuxt/server/api/profile/[...].ts.eta +150 -0
- package/templates/nuxt/server/api/profile/index.ts.eta +103 -0
- package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +187 -0
- package/templates/nuxt/simpleapp/generate/commons/documents.ts.eta +6 -0
- package/templates/nuxt/simpleapp/generate/commons/events.ts.eta +5 -0
- package/templates/nuxt/simpleapp/generate/commons/groups.ts.eta +11 -0
- package/templates/nuxt/simpleapp/generate/commons/roles.ts.eta +21 -0
- package/templates/nuxt/types/index.ts.eta +65 -0
- package/templates/project/README.md +11 -0
- package/templates/project/build.sh.eta +17 -0
- package/templates/project/config.json.eta +2 -0
- package/templates/project/generate.ts.eta +10 -0
- package/templates/project/schemas/category.ts.eta +26 -0
- package/templates/project/schemas/index.ts.eta +5 -0
- package/templates/project/schemas/product.ts.eta +59 -0
- package/templates/project/shares/hello.ts.eta +1 -0
- package/templates/project/shares/index.ts.eta +2 -0
- package/tsconfig.json +9 -2
- package/tsconfig.tsbuildinfo +1 -0
- package/definations/category.cat.jsonschema.json +0 -55
- package/definations/level.lvl.jsonschema.json +0 -48
- package/definations/product.prd.jsonschema.json +0 -46
- package/templates/basic/controller.eta +0 -152
- package/templates/basic/module.eta +0 -22
- package/templates/basic/service.eta +0 -62
- package/templates/basic/simpleappclient.eta +0 -120
- package/templates/nest/SimpleAppController.eta +0 -69
- package/templates/nest/SimpleAppService.eta +0 -366
- package/templates/nest/TenantMiddleware.eta +0 -34
- package/templates/nest/UserProvider.eta +0 -127
- package/templates/nest/app.controller.eta +0 -12
- package/templates/nest/app.module.eta +0 -64
- package/templates/nest/app.service.eta +0 -8
- package/templates/nest/inputvalidation-exception.eta +0 -6
- package/templates/nest/nest.env.eta +0 -28
- package/templates/nest/nest.main.eta +0 -31
- package/templates/nuxt/components.crudsimple.vue.eta +0 -124
- package/templates/nuxt/components.menus.vue.eta +0 -35
- package/templates/nuxt/env.eta +0 -17
- package/templates/nuxt/pages.[xorg].index.vue.eta +0 -20
- package/templates/nuxt/pages.index.vue.eta +0 -72
- package/templates/nuxt/pages.login.vue.eta +0 -20
- package/templates/nuxt/plugins.simpleapp.ts.eta +0 -88
- package/templates/nuxt/server.api.auth[...].ts.eta +0 -233
- package/templates/nuxt/tailwind.css.eta +0 -49
- /package/templates/basic/{apischema.eta → nest/apischema.ts.eta} +0 -0
- /package/templates/basic/{jsonschema.eta → nest/jsonschema.ts.eta} +0 -0
- /package/templates/basic/{pageindexwithid.vue.eta → nuxt/pages.[id].vue.eta} +0 -0
- /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 {
|
|
6
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
68
|
-
|
|
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
|
-
|
|
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:
|
|
99
|
-
autocompletename:
|
|
100
|
-
moreAutoComplete:
|
|
101
|
-
schema:
|
|
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:
|
|
114
|
-
apiSettings:
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
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
|
-
|
|
283
|
-
|
|
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
|
-
|
|
311
|
+
})
|
|
312
|
+
|
|
313
|
+
|
|
286
314
|
|
|
287
|
-
//copy over frontend config.ts
|
|
288
315
|
}
|
|
289
316
|
|
|
290
317
|
|
|
291
|
-
const finalize=(modules:ModuleObject[]
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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
|
-
|
|
311
|
-
|
|
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
|
-
|
|
314
|
-
|
|
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
|
}
|