@simitgroup/simpleapp-generator 1.0.33 → 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 -13
- 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 +119 -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 +307 -235
- 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 +83 -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/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 +125 -67
- package/src/generate.ts +323 -274
- package/src/generate.ts.backup +339 -0
- package/src/index.ts +92 -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} +82 -20
- 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 → components/Menus.vue.eta} +17 -15
- 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/{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 +11 -1
- 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 -47
- package/templates/basic/simpleappclient.eta +0 -123
- package/templates/nest/SimpleAppController.eta +0 -69
- package/templates/nest/SimpleAppService.eta +0 -391
- 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/env.eta +0 -17
- package/templates/nuxt/pages.[xorg].index.vue.eta +0 -23
- package/templates/nuxt/pages.index.vue.eta +0 -69
- package/templates/nuxt/pages.login.vue.eta +0 -20
- package/templates/nuxt/plugins.simpleapp.ts.eta +0 -97
- 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/templates/nuxt/{composables.stringHelper.ts.eta → composables/stringHelper.generate.ts.eta} +0 -0
package/src/generate.ts
CHANGED
|
@@ -1,112 +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');
|
|
18
15
|
const X_DOCUMENT_TYPE='x-document-type'
|
|
19
16
|
const X_DOCUMENT_NAME='x-document-name'
|
|
20
17
|
const X_COLLECTION_NAME='x-collection-name'
|
|
18
|
+
const X_PAGE_TYPE='x-page-type'
|
|
21
19
|
const extFb = '.xfb.json';
|
|
22
20
|
const extHfb = '.xhfb.json';
|
|
23
21
|
const extjsonschema = '.jsonschema.json';
|
|
22
|
+
const extgroups = '.group.json';
|
|
24
23
|
let jsonschemas = {};
|
|
24
|
+
let configs:any = {}
|
|
25
25
|
const docs = [];
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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)
|
|
30
47
|
//
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
const file = files[j]
|
|
40
|
-
log.info(`Load `+clc.green(file))
|
|
41
|
-
const filearr = file.split('.');
|
|
42
|
-
let rendertype = 'basic';
|
|
43
|
-
let docname = filearr[0].toLowerCase();
|
|
44
|
-
let doctype = filearr[1].toLowerCase();
|
|
45
|
-
|
|
46
|
-
const jsonstring = readFileSync(defFolder +path.sep+ file, 'utf-8');
|
|
47
|
-
let allmodels: ChildModels = {} as ChildModels;
|
|
48
|
-
|
|
49
|
-
if (file.endsWith(extjsonschema)) {
|
|
50
|
-
const jsondata = JSON.parse(jsonstring);
|
|
51
|
-
rendertype = 'basic';
|
|
52
|
-
jsonschemas[docname] = jsondata;
|
|
53
|
-
|
|
54
|
-
// foreignkeys:
|
|
55
|
-
// tmpforeignkeys:TypeForeignKey
|
|
56
|
-
allmodels = await readJsonSchemaBuilder(doctype, docname, jsondata,foreignkeys);
|
|
57
|
-
|
|
58
|
-
//foreignkeycatalogues
|
|
59
|
-
// foreignkeys
|
|
60
|
-
generate(docname, doctype, rendertype, allmodels,backendfolder,frontendfolder);
|
|
61
|
-
activatemodules.push({doctype:doctype,docname:capitalizeFirstLetter(docname)})
|
|
62
|
-
} else {
|
|
63
|
-
log.warn(`Load `+clc.yellow(file) + ` but it is not supported`)
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
// log.warn("foreignkeys---",foreignkeys)
|
|
67
|
-
log.info("Activated backend modules: ",JSON.stringify(activatemodules))
|
|
68
|
-
// log.info(activatemodules)
|
|
69
|
-
finalize(activatemodules,backendfolder,frontendfolder)
|
|
70
|
-
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)
|
|
71
56
|
}
|
|
72
|
-
|
|
73
|
-
|
|
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
|
+
}
|
|
74
104
|
|
|
75
|
-
const
|
|
76
|
-
|
|
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,
|
|
77
147
|
doctype: string,
|
|
78
148
|
rendertype: string,
|
|
79
|
-
allmodels: ChildModels
|
|
80
|
-
|
|
81
|
-
frontendfolder:string
|
|
82
|
-
) => {
|
|
83
|
-
const targetfolder = `${backendfolder}/src/docs/${doctype}`;
|
|
84
|
-
const frontendpagefolder=`${frontendfolder}/pages/[xorg]`
|
|
85
|
-
try {
|
|
86
|
-
|
|
87
|
-
mkdirSync(targetfolder,{ recursive: true });
|
|
88
|
-
mkdirSync(`${frontendfolder}/simpleapp/simpleappdocs/`,{ recursive: true });
|
|
89
|
-
mkdirSync(frontendpagefolder,{recursive:true})
|
|
90
|
-
} catch (err) {
|
|
91
|
-
//do nothing if folder exists
|
|
92
|
-
} finally {
|
|
93
|
-
const templatefolder = `${constants.templatedir}/${rendertype}`
|
|
94
|
-
log.info(`- Generate ${docname}, ${doctype}, ${templatefolder}`)
|
|
95
|
-
const eta = new Eta({
|
|
96
|
-
views: templatefolder,
|
|
97
|
-
functionHeader:
|
|
98
|
-
'const capitalizeFirstLetter = (str) => str.slice(0, 1).toUpperCase() + str.slice(1);' +
|
|
99
|
-
'const initType=(str)=>{return ["string","number","boolean","array","object"].includes(str) ? capitalizeFirstLetter(str) : str;}',
|
|
100
|
-
});
|
|
149
|
+
allmodels: ChildModels)=>{
|
|
150
|
+
|
|
101
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)
|
|
102
158
|
const variables:TypeGenerateDocumentVariable = {
|
|
103
159
|
name: docname,
|
|
104
160
|
doctype: doctype,
|
|
105
161
|
models: allmodels,
|
|
106
|
-
autocompletecode:
|
|
107
|
-
autocompletename:
|
|
108
|
-
moreAutoComplete:
|
|
109
|
-
schema:
|
|
162
|
+
autocompletecode:currentmodel.codeField??'',
|
|
163
|
+
autocompletename:currentmodel.nameField??'',
|
|
164
|
+
moreAutoComplete:currentmodel.moreAutoComplete ??[],
|
|
165
|
+
schema: currentmodel.model,
|
|
110
166
|
apiSchemaName: capitalizeFirstLetter(docname), //capitalizeFirstLetter(doctype) + 'ApiSchema',
|
|
111
167
|
typename: capitalizeFirstLetter(docname),
|
|
112
168
|
fullApiSchemaName:
|
|
@@ -118,211 +174,204 @@ const generate = (
|
|
|
118
174
|
backEndCode: '',
|
|
119
175
|
controllerCode:'',
|
|
120
176
|
apiSchemaCode:'',
|
|
121
|
-
docStatusSettings:
|
|
122
|
-
apiSettings:
|
|
123
|
-
|
|
124
|
-
|
|
177
|
+
docStatusSettings: currentmodel.docStatusSettings??[],
|
|
178
|
+
apiSettings: currentmodel.apiSettings??[],
|
|
179
|
+
isolationtype: currentmodel.isolationtype,
|
|
180
|
+
hasdocformat: currentmodel.hasdocformat,
|
|
181
|
+
foreignkeys: currentmodel.foreignkeys ?? {}
|
|
125
182
|
};
|
|
126
183
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
// compile(jsonschemas[docname], docname).then((txtType: string) => {
|
|
136
|
-
// writeFileSync(`${targetfolder}/${doctype}.type.ts`, txtType);
|
|
137
|
-
// });
|
|
138
|
-
|
|
139
|
-
// generate jsonschema object, use for data validation
|
|
140
|
-
const txtJsonSchema = eta.render('./jsonschema', variables);
|
|
141
|
-
writeFileSync(`${targetfolder}/${doctype}.jsonschema.ts`, txtJsonSchema);
|
|
142
|
-
|
|
143
|
-
// generate before save source code, wont override after regenerate
|
|
144
|
-
// const customizefilename = `${targetfolder}/${doctype}.beforesave.ts`;
|
|
145
|
-
// if (!existsSync(customizefilename)) {
|
|
146
|
-
// const txtBeforeSave = eta.render('./beforesave', variables);
|
|
147
|
-
// writeFileSync(
|
|
148
|
-
// `${targetfolder}/${doctype}.beforesave.ts`,
|
|
149
|
-
// txtBeforeSave,
|
|
150
|
-
// );
|
|
151
|
-
// }
|
|
152
|
-
// write mongoose model file
|
|
153
|
-
const txtModel = eta.render('./model', variables);
|
|
154
|
-
writeFileSync(`${targetfolder}/${doctype}.model.ts`, txtModel);
|
|
155
|
-
|
|
156
|
-
// prepare openapi schema
|
|
157
|
-
const apischemafile=`${targetfolder}/${doctype}.apischema.ts`
|
|
158
|
-
if (existsSync(apischemafile)) {
|
|
159
|
-
const apischemaCode = readFileSync(apischemafile).toString();
|
|
160
|
-
const regexapischema =
|
|
161
|
-
/\/\/<begin-apischema-code>([\s\S]*?)\/\/<end-apischema-code>/g;
|
|
162
|
-
const apischemaresult = apischemaCode.match(regexapischema);
|
|
163
|
-
if (apischemaresult) {
|
|
164
|
-
variables.apiSchemaCode = apischemaresult[0];
|
|
165
|
-
}else{
|
|
166
|
-
variables.apiSchemaCode="//<begin-apischema-code>\n//<end-apischema-code>";
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
const txtApiSchema = eta.render('./apischema', variables);
|
|
170
|
-
writeFileSync(apischemafile, txtApiSchema);
|
|
171
|
-
|
|
172
|
-
// prepare backend classes
|
|
173
|
-
// prepare frontend api client
|
|
174
|
-
|
|
175
|
-
const servicefile = `${targetfolder}/${doctype}.service.ts`;
|
|
176
|
-
let bothEndCode = '';
|
|
177
|
-
let backEndCode = '';
|
|
178
|
-
if (existsSync(servicefile)) {
|
|
179
|
-
const servicecodes = readFileSync(servicefile).toString();
|
|
180
|
-
|
|
181
|
-
/* extract string bothend and backend, put in back */
|
|
182
|
-
const regex1 =
|
|
183
|
-
/\/\/<begin-bothend-code>([\s\S]*?)\/\/<end-bothend-code>/g;
|
|
184
|
-
const regex2 =
|
|
185
|
-
/\/\/<begin-backend-code>([\s\S]*?)\/\/<end-backend-code>/g;
|
|
186
|
-
const bothendresult = servicecodes.match(regex1);
|
|
187
|
-
const backendresult = servicecodes.match(regex2);
|
|
188
|
-
console.log("bothendresult",bothendresult)
|
|
189
|
-
console.log("backendresult",backendresult)
|
|
190
|
-
if (bothendresult) {
|
|
191
|
-
variables.bothEndCode = bothendresult[0];
|
|
192
|
-
}else{
|
|
193
|
-
variables.bothEndCode="//<begin-bothend-code>\n//<end-bothend-code>";
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
if (backendresult) {
|
|
197
|
-
variables.backEndCode = backendresult[0];
|
|
198
|
-
}else{
|
|
199
|
-
variables.backEndCode="//<begin-backend-code>\n//<end-backend-code>";
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
const txtService = eta.render('./service', variables);
|
|
205
|
-
writeFileSync(`${targetfolder}/${doctype}.service.ts`, txtService);
|
|
206
|
-
|
|
207
|
-
// prepare api router, allow add more api and wont override after regenerate
|
|
208
|
-
const controllerfile = `${targetfolder}/${doctype}.controller.ts`;
|
|
209
|
-
let controllerCode = ''
|
|
210
|
-
if (existsSync(controllerfile)) {
|
|
211
|
-
/* extract customized controller, put in back */
|
|
212
|
-
const controllersourcecodes = readFileSync(controllerfile).toString();
|
|
213
|
-
const controllerregex = /\/\/<begin-controller-code>([\s\S]*?)\/\/<end-controller-code>/g;
|
|
214
|
-
const controllerresult = controllersourcecodes.match(controllerregex);
|
|
215
|
-
if (controllerresult) {
|
|
216
|
-
controllerCode = controllerresult[0];
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
variables.controllerCode = controllerCode!='' ? controllerCode : "\n//<begin-controller-code>\n//<end-controller-code>";
|
|
220
|
-
const txtController = eta.render('./controller', variables);
|
|
221
|
-
writeFileSync(controllerfile, txtController);
|
|
222
|
-
|
|
223
|
-
// prepare module
|
|
224
|
-
const txtModule = eta.render('./module', variables);
|
|
225
|
-
writeFileSync(`${targetfolder}/${doctype}.module.ts`, txtModule);
|
|
226
|
-
|
|
227
|
-
// prepare readme
|
|
228
|
-
// const txtReadme = eta.render('./readme', variables);
|
|
229
|
-
// writeFileSync(`${targetfolder}/README.md`, txtReadme);
|
|
230
|
-
|
|
231
|
-
const frontendfile = `${frontendfolder}/simpleapp/simpleappdocs/${variables.typename}Doc.ts`;
|
|
232
|
-
let frontEndCode = '';
|
|
233
|
-
if (existsSync(frontendfile)) {
|
|
234
|
-
const clientcodes = readFileSync(frontendfile).toString();
|
|
235
|
-
|
|
236
|
-
/* extract string frontend code, put in back */
|
|
237
|
-
const regex3 =
|
|
238
|
-
/\/\/<begin-frontend-code>([\s\S]*?)\/\/<end-frontend-code>/g;
|
|
239
|
-
|
|
240
|
-
const frontendresult = clientcodes.match(regex3);
|
|
241
|
-
|
|
242
|
-
if (frontendresult) {
|
|
243
|
-
frontEndCode = frontendresult[0];
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
variables.frontEndCode = frontEndCode ?? '';
|
|
247
|
-
const txtDocClient = eta.render('./simpleappclient.eta', variables);
|
|
248
|
-
writeFileSync(frontendfile, txtDocClient);
|
|
249
|
-
|
|
250
|
-
generateClientPage(variables,eta,frontendpagefolder)
|
|
251
|
-
|
|
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
|
+
});
|
|
252
192
|
|
|
253
|
-
|
|
193
|
+
const backendTargetFolder = `${backendFolder}/src/simpleapp/generate`
|
|
194
|
+
const backendServiceFolder = `${backendFolder}/src/simpleapp/services`
|
|
254
195
|
|
|
255
196
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
const generateClientPage=(variables:TypeGenerateDocumentVariable,eta,frontendpagefolder:string)=>{
|
|
260
|
-
const docname = variables.name
|
|
261
|
-
const targetfolder = `${frontendpagefolder}/${docname}`
|
|
262
|
-
const overridefilename = `${targetfolder}/delete-me-for-avoid-override`
|
|
263
|
-
if(!existsSync(targetfolder)){
|
|
264
|
-
mkdirSync(targetfolder)
|
|
265
|
-
writeFileSync(overridefilename,'delete this file to prevent override by generator')
|
|
266
|
-
}
|
|
267
|
-
if(existsSync(overridefilename)){
|
|
268
|
-
const txtIndex= eta.render('./pageindex.vue.eta', variables);
|
|
269
|
-
const txtIndexwithid= eta.render('./pageindexwithid.vue.eta', variables);
|
|
270
|
-
writeFileSync(`${targetfolder}/index.vue`,txtIndex)
|
|
271
|
-
writeFileSync(`${targetfolder}/[id].vue`,txtIndexwithid)
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
const prepareEnvironments = (backendfolder:string,frontendfolder:string)=>{
|
|
275
|
-
const targetfolder = `${backendfolder}/src/class`
|
|
276
|
-
const targetfrontendfolder = `${frontendfolder}/server/api`
|
|
277
|
-
try{
|
|
278
|
-
mkdirSync(targetfolder,{recursive:true});
|
|
279
|
-
mkdirSync(targetfrontendfolder,{recursive:true});
|
|
280
|
-
}catch(error){
|
|
281
|
-
//do nothing
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
copyFileSync(`${constants.templatedir}/nest/SimpleAppService.eta`,`${targetfolder}/SimpleAppService.ts`)
|
|
285
|
-
copyFileSync(`${constants.templatedir}/nest/SimpleAppController.eta`,`${targetfolder}/SimpleAppController.ts`)
|
|
286
|
-
copyFileSync(`${constants.templatedir}/nest/Workflow.eta`,`${targetfolder}/Workflow.ts`)
|
|
287
|
-
copyFileSync(`${constants.templatedir}/nest/TenantMiddleware.eta`,`${targetfolder}/TenantMiddleware.ts`)
|
|
288
|
-
copyFileSync(`${constants.templatedir}/nest/UserProvider.eta`,`${targetfolder}/UserProvider.ts`)
|
|
197
|
+
Object.keys(generateTypes).forEach((foldertype)=>{
|
|
198
|
+
|
|
289
199
|
|
|
290
|
-
|
|
291
|
-
|
|
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
|
+
|
|
292
310
|
|
|
293
|
-
|
|
311
|
+
})
|
|
312
|
+
|
|
313
|
+
|
|
294
314
|
|
|
295
|
-
//copy over frontend config.ts
|
|
296
315
|
}
|
|
297
316
|
|
|
298
317
|
|
|
299
|
-
const finalize=(modules:ModuleObject[]
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
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
|
+
}
|
|
307
325
|
|
|
308
|
-
const txtMainService = eta.render('./nest/app.service.eta', modules);
|
|
309
|
-
writeFileSync(`${backendfolder}/src/app.service.ts`, txtMainService);
|
|
310
|
-
|
|
311
|
-
const txtAppController = eta.render('./nest/app.controller.eta', modules);
|
|
312
|
-
writeFileSync(`${backendfolder}/src/app.controller.ts`, txtAppController);
|
|
313
|
-
|
|
314
|
-
const foreignkeyfile =`${backendfolder}/src/dicts/foreignkeys.json`
|
|
315
|
-
writeFileSync(foreignkeyfile, JSON.stringify(foreignkeys));
|
|
316
|
-
log.info("write to foreignkey file ",foreignkeyfile)
|
|
317
326
|
|
|
318
|
-
|
|
319
|
-
|
|
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
|
+
})
|
|
320
361
|
|
|
321
|
-
|
|
322
|
-
writeFileSync(`${frontendfolder}/composables/getMenus.ts`, txtMenus);
|
|
362
|
+
}
|
|
323
363
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
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
|
|
328
377
|
}
|