@simitgroup/simpleapp-generator 1.0.8 → 1.0.14
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/README.md +128 -1
- package/dist/createproject.js +39 -18
- package/dist/createproject.js.map +1 -1
- package/dist/generate.js +49 -20
- package/dist/generate.js.map +1 -1
- package/dist/index.js +36 -25
- package/dist/index.js.map +1 -1
- package/dist/processors/jsonschemabuilder.js +60 -9
- package/dist/processors/jsonschemabuilder.js.map +1 -1
- package/dist/storage.js +5 -0
- package/dist/storage.js.map +1 -0
- package/package.json +10 -5
- package/src/createproject.ts +40 -14
- package/src/generate.ts +62 -28
- package/src/index.ts +31 -20
- package/src/processors/jsonschemabuilder.ts +70 -15
- package/src/storage.ts +3 -0
- package/src/type.ts +24 -2
- package/templates/SimpleAppClient.eta +10 -5
- package/templates/SimpleAppController.eta +4 -1
- package/templates/SimpleAppService.eta +87 -11
- package/templates/basic/controller.eta +17 -1
- package/templates/basic/model.eta +1 -1
- package/templates/basic/pageindex.vue.eta +50 -0
- package/templates/basic/pageindexwithid.vue.eta +1 -0
- package/templates/basic/service.eta +2 -0
- package/templates/basic/{apiclient.eta → simpleappclient.eta} +15 -7
- package/templates/nuxt/app.vue.eta +8 -0
- package/templates/nuxt/components.crudsimple.vue.eta +95 -0
- package/templates/nuxt/components.debugdocdata.vue.eta +20 -0
- package/templates/nuxt/components.eventmonitor.vue.eta +79 -0
- package/templates/nuxt/components.menus.vue.eta +8 -0
- package/templates/nuxt/composables.getautocomplete.ts.eta +24 -0
- package/templates/nuxt/composables.getmenus.ts.eta +8 -0
- package/templates/nuxt/env.eta +3 -0
- package/templates/nuxt/layouts.default.vue.eta +10 -0
- package/templates/{nuxt.config.eta → nuxt/nuxt.config.ts.eta} +6 -3
- package/templates/nuxt/pages.index.vue.eta +3 -0
- package/templates/{nuxt.plugins.eta → nuxt/plugins.simpleapp.ts.eta} +12 -2
- package/templates/nuxt/server.api.ts.eta +131 -0
- package/templates/nuxt/tailwind.config.ts.eta +9 -0
- package/templates/nuxt/tailwind.css.eta +28 -0
- package/templates/nuxt.env.eta +0 -2
|
@@ -1,14 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.readJsonSchemaBuilder = void 0;
|
|
4
7
|
const libs_1 = require("../libs");
|
|
8
|
+
const tslog_1 = require("tslog");
|
|
9
|
+
const json_schema_ref_parser_1 = __importDefault(require("@apidevtools/json-schema-ref-parser"));
|
|
10
|
+
const storage_1 = require("../storage");
|
|
5
11
|
// import { ConflictException } from '@nestjs/common';
|
|
6
12
|
const type_1 = require("../type");
|
|
13
|
+
const log = new tslog_1.Logger();
|
|
14
|
+
const FIELD_AUTOCOMPLETE_CODE = 'field-autocomplete-code';
|
|
15
|
+
const FIELD_AUTOCOMPLETE_NAME = 'field-autocomplete-name';
|
|
16
|
+
const FOREIGNKEY_PROPERTY = 'x-foreignkey';
|
|
7
17
|
let allmodels = {};
|
|
8
|
-
|
|
18
|
+
let fullschema = {};
|
|
19
|
+
let fieldAutoCompleteCode = '';
|
|
20
|
+
let fieldAutoCompleteName = '';
|
|
21
|
+
const readJsonSchemaBuilder = async (doctype, docname, orijsondata, allforeignkeys) => {
|
|
22
|
+
fieldAutoCompleteCode = '';
|
|
23
|
+
fieldAutoCompleteName = '';
|
|
9
24
|
allmodels = {};
|
|
10
|
-
const validateddata = Object.assign({},
|
|
25
|
+
const validateddata = Object.assign({}, orijsondata);
|
|
11
26
|
let schema;
|
|
27
|
+
const tmpjsondata = await json_schema_ref_parser_1.default.dereference(orijsondata).then((schema) => {
|
|
28
|
+
// console.log("schema",doctype, schema['properties']['category']? schema['properties']['category']:'')
|
|
29
|
+
return schema;
|
|
30
|
+
});
|
|
31
|
+
const jsondata = Object.assign({}, tmpjsondata);
|
|
12
32
|
if (jsondata && jsondata.type == 'object') {
|
|
13
33
|
//no _id then need add
|
|
14
34
|
// console.log(jsondata)
|
|
@@ -18,7 +38,15 @@ const readJsonSchemaBuilder = (doctype, docname, jsondata) => {
|
|
|
18
38
|
else if (jsondata.type == 'array') {
|
|
19
39
|
throw (`unsupport array type for ${docname}.${doctype}`);
|
|
20
40
|
}
|
|
21
|
-
|
|
41
|
+
if (fieldAutoCompleteCode == '') {
|
|
42
|
+
log.error(`you shall define 1 field with format:'${FIELD_AUTOCOMPLETE_CODE}'`);
|
|
43
|
+
throw "missing field format";
|
|
44
|
+
}
|
|
45
|
+
if (fieldAutoCompleteName == '') {
|
|
46
|
+
log.error(`you shall define 1 field with format: '${FIELD_AUTOCOMPLETE_NAME}'}`);
|
|
47
|
+
throw "missing field format";
|
|
48
|
+
}
|
|
49
|
+
return Promise.resolve(allmodels);
|
|
22
50
|
};
|
|
23
51
|
exports.readJsonSchemaBuilder = readJsonSchemaBuilder;
|
|
24
52
|
const processObject = (doctype, docname, jsondata) => {
|
|
@@ -50,14 +78,37 @@ requiredlist) => {
|
|
|
50
78
|
Object.assign(obj, jsondata[key]);
|
|
51
79
|
const objectitem = {};
|
|
52
80
|
Object.assign(objectitem, obj.items);
|
|
53
|
-
// Object.assign(objtmp,jsondata?[key]:{});
|
|
54
81
|
const isrequired = requiredlist && requiredlist.includes(key);
|
|
55
|
-
// console.log('----', key, isrequired, obj);
|
|
56
82
|
const newName = docname + (0, libs_1.capitalizeFirstLetter)(key);
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
83
|
+
if (obj.format && obj.format == FIELD_AUTOCOMPLETE_CODE) {
|
|
84
|
+
fieldAutoCompleteCode = key;
|
|
85
|
+
}
|
|
86
|
+
if (obj.format && obj.format == FIELD_AUTOCOMPLETE_NAME) {
|
|
87
|
+
fieldAutoCompleteName = key;
|
|
88
|
+
}
|
|
89
|
+
// if (obj.type == 'object' && obj.items ){
|
|
90
|
+
// console.log("Refer to another object",docname,': ',key,obj,obj.items)
|
|
91
|
+
// obj,obj.items
|
|
92
|
+
//foreignkeys
|
|
93
|
+
//FOREIGNKEY_PROPERTY
|
|
94
|
+
// newmodel[key] = 'Object';
|
|
95
|
+
// }
|
|
96
|
+
// else
|
|
60
97
|
if (obj.type == 'object') {
|
|
98
|
+
if (obj[FOREIGNKEY_PROPERTY]) {
|
|
99
|
+
console.warn("FOREIGNKEY_PROPERTY exists", FOREIGNKEY_PROPERTY, obj[FOREIGNKEY_PROPERTY]);
|
|
100
|
+
const masterdatacollection = obj[FOREIGNKEY_PROPERTY];
|
|
101
|
+
const clientdatacollection = docname.toLowerCase();
|
|
102
|
+
const foreignkeyidentity = key + '._id';
|
|
103
|
+
if (!storage_1.foreignkeys[masterdatacollection]) {
|
|
104
|
+
let tmp = {};
|
|
105
|
+
tmp[clientdatacollection] = [foreignkeyidentity];
|
|
106
|
+
storage_1.foreignkeys[masterdatacollection] = tmp;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
storage_1.foreignkeys[masterdatacollection][clientdatacollection].push(foreignkeyidentity);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
61
112
|
genSchema(newName, obj.type, obj.properties, obj.required);
|
|
62
113
|
newmodel[key] = newName;
|
|
63
114
|
}
|
|
@@ -78,7 +129,7 @@ requiredlist) => {
|
|
|
78
129
|
// console.log(key,'--------newmodel',obj, newmodel[key]);
|
|
79
130
|
}
|
|
80
131
|
}
|
|
81
|
-
allmodels[docname] = { type: schematype, model: newmodel };
|
|
132
|
+
allmodels[docname] = { type: schematype, model: newmodel, codeField: fieldAutoCompleteCode, nameField: fieldAutoCompleteName };
|
|
82
133
|
return newmodel;
|
|
83
134
|
};
|
|
84
135
|
const getField = (fieldname, obj, isrequired) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonschemabuilder.js","sourceRoot":"","sources":["../../src/processors/jsonschemabuilder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jsonschemabuilder.js","sourceRoot":"","sources":["../../src/processors/jsonschemabuilder.ts"],"names":[],"mappings":"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"}
|
package/dist/storage.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":";;;AAEW,QAAA,WAAW,GAA2B,EAAE,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simitgroup/simpleapp-generator",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "frontend nuxtjs and backend nests code generator using jsonschema",
|
|
3
|
+
"version": "1.0.14",
|
|
4
|
+
"description": "frontend nuxtjs and backend nests code generator using jsonschema",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"generate": "ts-node src/index.ts -c ../sampleconfig.json; pnpm exec prettier ./backend --write;pnpm exec prettier ./frontend --write",
|
|
8
8
|
"build": "npx tsc",
|
|
9
9
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
10
|
-
},
|
|
10
|
+
},
|
|
11
11
|
"keywords": [],
|
|
12
|
-
"author": "Ks Tan",
|
|
12
|
+
"author": "Ks Tan",
|
|
13
13
|
"license": "ISC",
|
|
14
|
-
"repository": {
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git://github.com/SIMITGROUP/simpleapp-generator.git"
|
|
17
|
+
},
|
|
15
18
|
"publishConfig": {
|
|
16
19
|
"access": "public"
|
|
17
20
|
},
|
|
18
21
|
"dependencies": {
|
|
22
|
+
"@apidevtools/json-schema-ref-parser": "^10.1.0",
|
|
19
23
|
"@nestjs/config": "^3.0.0",
|
|
20
24
|
"@nestjs/mongoose": "^10.0.1",
|
|
21
25
|
"@nestjs/swagger": "^7.1.8",
|
|
@@ -29,6 +33,7 @@
|
|
|
29
33
|
"figlet": "^1.6.0",
|
|
30
34
|
"fs": "0.0.1-security",
|
|
31
35
|
"json-schema": "^0.4.0",
|
|
36
|
+
"json-schema-ref-parser": "^9.0.9",
|
|
32
37
|
"mongoose": "^7.4.4",
|
|
33
38
|
"path": "^0.12.7",
|
|
34
39
|
"tslog": "^4.9.1"
|
package/src/createproject.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { exec ,spawn} from "child_process";
|
|
2
|
-
import {writeFileSync} from 'fs'
|
|
2
|
+
import {mkdirSync, writeFileSync} from 'fs'
|
|
3
3
|
import * as constants from './constant'
|
|
4
4
|
import { Logger, ILogObj } from "tslog";
|
|
5
5
|
const log: Logger<ILogObj> = new Logger();
|
|
@@ -32,24 +32,50 @@ export const createNuxt= (targetfolder:string,callback)=>{
|
|
|
32
32
|
log.info("setting up nuxt frontend ${targetfolder}")
|
|
33
33
|
|
|
34
34
|
log.info(`frontend nuxt project "${targetfolder}" created, installing module`)
|
|
35
|
-
exec(`cd ${targetfolder};
|
|
35
|
+
exec(`cd ${targetfolder};pnpm install;pnpm install -D @types/node prettier @nuxtjs/tailwindcss`, (error, stdout, stderr)=>{
|
|
36
36
|
//;pnpm install
|
|
37
|
-
|
|
38
|
-
exec(`pnpm install --save ajv ajv-formats primeflex primeicons primevue axios json-schema @simitgroup/simpleapp-vue-component@latest`, (error, stdout, stderr)=>{
|
|
39
|
-
|
|
37
|
+
console.log(error, stdout, stderr)
|
|
38
|
+
exec(`cd ${targetfolder};pnpm install --save ajv ajv-formats primeflex primeicons prettier primevue axios json-schema mitt @simitgroup/simpleapp-vue-component@latest`, (error, stdout, stderr)=>{
|
|
39
|
+
console.log(error, stdout, stderr)
|
|
40
|
+
|
|
41
|
+
mkdirSync(`${targetfolder}/assets/css/`,{recursive:true})
|
|
42
|
+
mkdirSync(`${targetfolder}/layouts`,{recursive:true})
|
|
43
|
+
mkdirSync(`${targetfolder}/components`,{recursive:true})
|
|
44
|
+
mkdirSync(`${targetfolder}/server/api`,{recursive:true})
|
|
45
|
+
mkdirSync(`${targetfolder}/pages`,{recursive:true})
|
|
46
|
+
mkdirSync(`${targetfolder}/plugins`,{recursive:true})
|
|
47
|
+
const eta = new Eta({views: `${constants.templatedir}/nuxt`});
|
|
40
48
|
const variables=[]
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
49
|
+
const writes = {
|
|
50
|
+
'./app.vue.eta':'app.vue',
|
|
51
|
+
'./components.eventmonitor.vue.eta':'components/EventMonitor.vue',
|
|
52
|
+
'./components.menus.vue.eta':'components/Menus.vue',
|
|
53
|
+
'./components.crudsimple.vue.eta':'components/CrudSimple.vue',
|
|
54
|
+
'./components.debugdocdata.vue.eta':'components/DebugDocumentData.vue',
|
|
55
|
+
'./layouts.default.vue.eta':'layouts/default.vue',
|
|
56
|
+
'./server.api.ts.eta':'server/api/[...].ts',
|
|
57
|
+
'./nuxt.config.ts.eta':'nuxt.config.ts',
|
|
58
|
+
'./pages.index.vue.eta':'pages/index.vue',
|
|
59
|
+
'./plugins.simpleapp.ts.eta':'plugins/simpleapp.ts',
|
|
60
|
+
'./tailwind.config.ts.eta':'tailwind.config.ts',
|
|
61
|
+
'./tailwind.css.eta':'assets/css/tailwind.css',
|
|
62
|
+
'./env.eta':'.env',
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const templates = Object.getOwnPropertyNames(writes)
|
|
66
|
+
for(let i=0; i<templates.length;i++){
|
|
67
|
+
const template = templates[i]
|
|
68
|
+
const filename = writes[template]
|
|
69
|
+
const txt = eta.render(template, variables);
|
|
70
|
+
const file =`${targetfolder}/${filename}`
|
|
71
|
+
log.info("writing ",file)
|
|
72
|
+
writeFileSync(file, txt);
|
|
73
|
+
}
|
|
74
|
+
|
|
47
75
|
log.info("nuxt project completed")
|
|
48
76
|
callback()
|
|
49
77
|
})
|
|
50
|
-
|
|
51
|
-
throw error
|
|
52
|
-
}
|
|
78
|
+
|
|
53
79
|
})
|
|
54
80
|
|
|
55
81
|
}
|
package/src/generate.ts
CHANGED
|
@@ -2,16 +2,17 @@
|
|
|
2
2
|
// import { readJsonSchemaBuilder } from './processors/jsonschemabuilder';
|
|
3
3
|
import * as constants from './constant'
|
|
4
4
|
import {readJsonSchemaBuilder} from './processors/jsonschemabuilder'
|
|
5
|
+
import {foreignkeys} from './storage'
|
|
5
6
|
// import { compile } from 'json-schema-to-typescript';
|
|
6
7
|
// import { Fieldtypes, SchemaModel, ChildModels } from './type';
|
|
7
|
-
import {
|
|
8
|
+
import { TypeForeignKeyCatalogue, TypeGenerateDocumentVariable,ChildModels,ModuleObject } from './type'
|
|
8
9
|
import { Logger, ILogObj } from "tslog";
|
|
9
10
|
const log: Logger<ILogObj> = new Logger();
|
|
10
11
|
const clc = require("cli-color");
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
const path = require('path');
|
|
14
|
-
import {mkdirSync,readdir,readFileSync,writeFileSync,existsSync,copyFileSync, readdirSync} from 'fs'
|
|
15
|
+
import {mkdirSync, readdir,readFileSync,writeFileSync,existsSync,copyFileSync, readdirSync} from 'fs'
|
|
15
16
|
const { Eta } = require('eta');
|
|
16
17
|
const { capitalizeFirstLetter }= require('./libs');
|
|
17
18
|
const extFb = '.xfb.json';
|
|
@@ -20,9 +21,10 @@ const extjsonschema = '.jsonschema.json';
|
|
|
20
21
|
let jsonschemas = {};
|
|
21
22
|
const docs = [];
|
|
22
23
|
|
|
23
|
-
export const initialize = (defFolder:string,backendfolder:string,frontendfolder:string) => {
|
|
24
|
+
export const initialize = async (defFolder:string,backendfolder:string,frontendfolder:string) => {
|
|
24
25
|
prepareEnvironments(backendfolder,frontendfolder)
|
|
25
|
-
let activatemodules:ModuleObject[]=[]
|
|
26
|
+
let activatemodules:ModuleObject[]=[]
|
|
27
|
+
//
|
|
26
28
|
const files = readdirSync(defFolder)
|
|
27
29
|
// readdir(defFolder, (err, files) => {
|
|
28
30
|
// files.forEach((file) => {
|
|
@@ -40,17 +42,22 @@ let activatemodules:ModuleObject[]=[]
|
|
|
40
42
|
log.info(`Load `+clc.green(file))
|
|
41
43
|
rendertype = 'basic';
|
|
42
44
|
jsonschemas[docname] = jsondata;
|
|
43
|
-
|
|
45
|
+
// foreignkeys:
|
|
46
|
+
// tmpforeignkeys:TypeForeignKey
|
|
47
|
+
allmodels = await readJsonSchemaBuilder(doctype, docname, jsondata,foreignkeys);
|
|
48
|
+
|
|
49
|
+
//foreignkeycatalogues
|
|
50
|
+
// foreignkeys
|
|
44
51
|
generate(docname, doctype, rendertype, allmodels,backendfolder,frontendfolder);
|
|
45
52
|
activatemodules.push({doctype:doctype,docname:capitalizeFirstLetter(docname)})
|
|
46
53
|
} else {
|
|
47
54
|
log.warn(`Load `+clc.yellow(file) + ` but it is not supported`)
|
|
48
|
-
}
|
|
49
|
-
|
|
55
|
+
}
|
|
50
56
|
}
|
|
57
|
+
// log.warn("foreignkeys---",foreignkeys)
|
|
51
58
|
log.info("Activated backend modules: ",activatemodules)
|
|
52
59
|
// log.info(activatemodules)
|
|
53
|
-
|
|
60
|
+
finalize(activatemodules,backendfolder,frontendfolder)
|
|
54
61
|
return Promise.resolve(true)
|
|
55
62
|
}
|
|
56
63
|
|
|
@@ -65,12 +72,12 @@ const generate = (
|
|
|
65
72
|
frontendfolder:string
|
|
66
73
|
) => {
|
|
67
74
|
const targetfolder = `${backendfolder}/src/docs/${doctype}`;
|
|
68
|
-
|
|
75
|
+
const frontendpagefolder=`${frontendfolder}/pages`
|
|
69
76
|
try {
|
|
70
77
|
|
|
71
78
|
mkdirSync(targetfolder,{ recursive: true });
|
|
72
|
-
mkdirSync(`${frontendfolder}/
|
|
73
|
-
|
|
79
|
+
mkdirSync(`${frontendfolder}/simpleapp/simpleappdocs/`,{ recursive: true });
|
|
80
|
+
mkdirSync(frontendpagefolder,{recursive:true})
|
|
74
81
|
} catch (err) {
|
|
75
82
|
//do nothing if folder exists
|
|
76
83
|
} finally {
|
|
@@ -83,10 +90,12 @@ const generate = (
|
|
|
83
90
|
'const initType=(str)=>{return ["string","number","boolean","array","object"].includes(str) ? capitalizeFirstLetter(str) : str;}',
|
|
84
91
|
});
|
|
85
92
|
|
|
86
|
-
const variables = {
|
|
93
|
+
const variables:TypeGenerateDocumentVariable = {
|
|
87
94
|
name: docname,
|
|
88
95
|
doctype: doctype,
|
|
89
96
|
models: allmodels,
|
|
97
|
+
autocompletecode:allmodels[capitalizeFirstLetter(docname)].codeField,
|
|
98
|
+
autocompletename:allmodels[capitalizeFirstLetter(docname)].nameField,
|
|
90
99
|
schema: allmodels[capitalizeFirstLetter(docname)].model,
|
|
91
100
|
apiSchemaName: capitalizeFirstLetter(docname), //capitalizeFirstLetter(doctype) + 'ApiSchema',
|
|
92
101
|
typename: capitalizeFirstLetter(docname),
|
|
@@ -187,7 +196,7 @@ const generate = (
|
|
|
187
196
|
const txtReadme = eta.render('./readme', variables);
|
|
188
197
|
writeFileSync(`${targetfolder}/README.md`, txtReadme);
|
|
189
198
|
|
|
190
|
-
const frontendfile = `${frontendfolder}/
|
|
199
|
+
const frontendfile = `${frontendfolder}/simpleapp/simpleappdocs/${variables.typename}Doc.ts`;
|
|
191
200
|
let frontEndCode = '';
|
|
192
201
|
if (existsSync(frontendfile)) {
|
|
193
202
|
const clientcodes = readFileSync(frontendfile).toString();
|
|
@@ -203,28 +212,39 @@ const generate = (
|
|
|
203
212
|
}
|
|
204
213
|
}
|
|
205
214
|
variables.frontEndCode = frontEndCode ?? '';
|
|
206
|
-
const txtDocClient = eta.render('./
|
|
215
|
+
const txtDocClient = eta.render('./simpleappclient.eta', variables);
|
|
207
216
|
writeFileSync(frontendfile, txtDocClient);
|
|
208
217
|
|
|
209
|
-
|
|
210
|
-
|
|
218
|
+
generateClientPage(variables,eta,frontendpagefolder)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
log.info(`- write completed: ${doctype}`)
|
|
222
|
+
|
|
211
223
|
|
|
212
|
-
//create type
|
|
213
|
-
//create service
|
|
214
|
-
//create controller
|
|
215
|
-
//create module
|
|
216
|
-
//create apischema
|
|
217
|
-
//create beforesave if not exists
|
|
218
|
-
// console.log(schema, res);
|
|
219
224
|
}
|
|
220
225
|
};
|
|
221
226
|
|
|
227
|
+
const generateClientPage=(variables:TypeGenerateDocumentVariable,eta,frontendpagefolder:string)=>{
|
|
228
|
+
const docname = variables.name
|
|
229
|
+
const targetfolder = `${frontendpagefolder}/${docname}`
|
|
230
|
+
const overridefilename = `${targetfolder}/delete-me-for-avoid-override`
|
|
231
|
+
if(!existsSync(targetfolder)){
|
|
232
|
+
mkdirSync(targetfolder)
|
|
233
|
+
writeFileSync(overridefilename,'delete this file to prevent override by generator')
|
|
234
|
+
}
|
|
235
|
+
if(existsSync(overridefilename)){
|
|
236
|
+
const txtIndex= eta.render('./pageindex.vue.eta', variables);
|
|
237
|
+
const txtIndexwithid= eta.render('./pageindexwithid.vue.eta', variables);
|
|
238
|
+
writeFileSync(`${targetfolder}/index.vue`,txtIndex)
|
|
239
|
+
writeFileSync(`${targetfolder}/[id].vue`,txtIndexwithid)
|
|
240
|
+
}
|
|
241
|
+
}
|
|
222
242
|
const prepareEnvironments = (backendfolder:string,frontendfolder:string)=>{
|
|
223
243
|
const targetfolder = `${backendfolder}/src/class`
|
|
224
|
-
const targetfrontendfolder = `${frontendfolder}/server/
|
|
244
|
+
const targetfrontendfolder = `${frontendfolder}/server/api`
|
|
225
245
|
try{
|
|
226
246
|
mkdirSync(targetfolder,{recursive:true});
|
|
227
|
-
mkdirSync(targetfrontendfolder);
|
|
247
|
+
mkdirSync(targetfrontendfolder,{recursive:true});
|
|
228
248
|
}catch(error){
|
|
229
249
|
//do nothing
|
|
230
250
|
}
|
|
@@ -237,7 +257,7 @@ const prepareEnvironments = (backendfolder:string,frontendfolder:string)=>{
|
|
|
237
257
|
copyFileSync(`${constants.templatedir}/SimpleAppController.eta`,`${targetfolder}/SimpleAppController.ts`)
|
|
238
258
|
|
|
239
259
|
//copy over frontend apiabstract class
|
|
240
|
-
// copyFileSync(`${constants.templatedir}/
|
|
260
|
+
// copyFileSync(`${constants.templatedir}/nuxt.apigateway.eta`,`${targetfrontendfolder}/[...].ts`)
|
|
241
261
|
|
|
242
262
|
//prepare backend config.ts
|
|
243
263
|
|
|
@@ -245,9 +265,23 @@ const prepareEnvironments = (backendfolder:string,frontendfolder:string)=>{
|
|
|
245
265
|
}
|
|
246
266
|
|
|
247
267
|
|
|
248
|
-
const
|
|
268
|
+
const finalize=(modules:ModuleObject[],backendfolder:string,frontendfolder:string)=>{
|
|
269
|
+
log.info("Finalizing foreignkey:",foreignkeys)
|
|
270
|
+
mkdirSync(`${backendfolder}/src/dicts/`,{ recursive: true });
|
|
271
|
+
mkdirSync(`${frontendfolder}/composables/`,{ recursive: true });
|
|
272
|
+
|
|
249
273
|
const eta = new Eta({views:constants.templatedir});
|
|
250
274
|
const txtMainModule = eta.render('app.module.eta', modules);
|
|
251
|
-
writeFileSync(`${
|
|
275
|
+
writeFileSync(`${backendfolder}/src/app.module.ts`, txtMainModule);
|
|
252
276
|
|
|
277
|
+
const foreignkeyfile =`${backendfolder}/src/dicts/foreignkeys.json`
|
|
278
|
+
writeFileSync(foreignkeyfile, JSON.stringify(foreignkeys));
|
|
279
|
+
console.log("write to foreignkey file ",foreignkeyfile)
|
|
280
|
+
|
|
281
|
+
const txtCatalogue = eta.render('./nuxt/composables.getautocomplete.ts.eta', modules);
|
|
282
|
+
writeFileSync(`${frontendfolder}/composables/getAutocomplete.ts`, txtCatalogue);
|
|
283
|
+
|
|
284
|
+
const txtMenus = eta.render('./nuxt/composables.getmenus.ts.eta', modules);
|
|
285
|
+
writeFileSync(`${frontendfolder}/composables/getMenus.ts`, txtMenus);
|
|
286
|
+
|
|
253
287
|
}
|
package/src/index.ts
CHANGED
|
@@ -7,29 +7,36 @@ const {createNuxt,createNest} =require( './createproject')
|
|
|
7
7
|
const {exec} = require( "child_process")
|
|
8
8
|
|
|
9
9
|
const capitalizeFirstLetter= require( './libs')
|
|
10
|
-
|
|
10
|
+
const {Logger, ILogObj} = require( "tslog");
|
|
11
|
+
|
|
12
|
+
const log :typeof Logger= new Logger();
|
|
11
13
|
|
|
12
|
-
// const log: Logger = new Logger();
|
|
13
14
|
const figlet = require("figlet");
|
|
14
15
|
// const program = new Command();
|
|
16
|
+
const pj = require('../package.json')
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
let version='1.0.8'
|
|
18
|
+
let version=pj.version
|
|
18
19
|
program
|
|
19
20
|
.version(version)
|
|
20
21
|
.description("An simpleapp CLI tool for generate frontend (vuejs) and backend(nestjs) codes")
|
|
21
22
|
.option("-c, --config-file <value>", 'configuration file content such as:{"definationsFolder":"./definations", "backendFolder":"./nestproject/src/docs", "frontendFolder":"./nuxt/server"}')
|
|
22
|
-
.option("-s, --definations-folder <value>", "load defination files from which folder")
|
|
23
|
-
.option("-b, --backend-folder <value>", "Create backend code at which folder")
|
|
24
|
-
.option("-f, --frontend-folder <value>", "Create frontend code at which folder")
|
|
25
|
-
.option("-i, --openapi3-yaml <value>", 'openapi3.yaml generated by backend server')
|
|
23
|
+
// .option("-s, --definations-folder <value>", "load defination files from which folder")
|
|
24
|
+
// .option("-b, --backend-folder <value>", "Create backend code at which folder")
|
|
25
|
+
// .option("-f, --frontend-folder <value>", "Create frontend code at which folder")
|
|
26
|
+
// .option("-i, --openapi3-yaml <value>", 'openapi3.yaml generated by backend server')
|
|
26
27
|
.parse(process.argv);
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
const options = program.opts();
|
|
30
31
|
console.log(figlet.textSync(`SimpleApp Generator ${version}`));
|
|
31
32
|
// console.log(options)
|
|
32
|
-
|
|
33
|
+
let path=''
|
|
34
|
+
if(options.configFile[0]=='.'){
|
|
35
|
+
path=process.cwd()+'/'+options.configFile
|
|
36
|
+
}else{
|
|
37
|
+
path=options.configFile
|
|
38
|
+
}
|
|
39
|
+
const configs = require(path)
|
|
33
40
|
console.log("configurations: ",configs)
|
|
34
41
|
const definationsFolder = configs.definationsFolder ?? options.definationsFolder
|
|
35
42
|
const backendFolder = configs.backendFolder ?? options.backendFolder
|
|
@@ -38,41 +45,45 @@ const openapi3Yaml:string = configs.openapi3Yaml ?? options.openapi3Yaml
|
|
|
38
45
|
|
|
39
46
|
const runGenNext = (callback)=>{
|
|
40
47
|
if(!fs.existsSync(backendFolder)){
|
|
41
|
-
|
|
48
|
+
log.error(`${backendFolder} does not exists, please run "nest new -p pnpm ${backendFolder}"`)
|
|
42
49
|
}else if(!fs.existsSync(`${backendFolder}/.env`)){
|
|
43
|
-
|
|
50
|
+
log.info(`initial nest configuratoin for simpleapp generator`)
|
|
44
51
|
createNest(backendFolder,callback)
|
|
45
52
|
}else{
|
|
46
|
-
|
|
53
|
+
log.warn(`.env file exists, skip nest initialization`)
|
|
47
54
|
callback()
|
|
48
55
|
}
|
|
49
56
|
}
|
|
50
57
|
const runGenNuxt = (callback)=>{
|
|
51
58
|
if(!fs.existsSync(frontendFolder)){
|
|
52
|
-
|
|
59
|
+
log.error(`${frontendFolder} does not exists, please run "npx nuxi@latest init ${frontendFolder}"`)
|
|
53
60
|
}else if(!fs.existsSync(`${frontendFolder}/.env`)){
|
|
54
|
-
|
|
61
|
+
log.info(`initial nuxt configuratoin for simpleapp generator`)
|
|
55
62
|
createNuxt(frontendFolder,callback)
|
|
56
63
|
}else{
|
|
57
|
-
|
|
64
|
+
log.warn(`.env file exists, skip nuxt initialization`)
|
|
58
65
|
callback()
|
|
59
66
|
|
|
60
67
|
}
|
|
61
68
|
}
|
|
62
69
|
runGenNext(()=>{
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
70
|
+
|
|
71
|
+
log.info("runGenNext (backen) done")
|
|
72
|
+
runGenNuxt(()=>{
|
|
73
|
+
log.info("runGenNuxt (frontend) done")
|
|
66
74
|
generator.initialize(definationsFolder,backendFolder,frontendFolder)
|
|
75
|
+
exec(`cd ${frontendFolder};npx prettier --write "./pages/**/*.vue" "./simpleapp/**/*" `)
|
|
76
|
+
exec(`cd ${backendFolder};npx run format `)
|
|
67
77
|
if(openapi3Yaml !=''){
|
|
68
78
|
|
|
69
|
-
exec(`openapi-generator generate -i ${openapi3Yaml} -o ${frontendFolder}/
|
|
79
|
+
exec(`openapi-generator generate -i ${openapi3Yaml} -o ${frontendFolder}/simpleapp/openapi -g typescript-axios --skip-validate-spec`,(error, stdout, stderr)=>{
|
|
70
80
|
if(error){
|
|
71
|
-
|
|
81
|
+
log.error(stderr);
|
|
72
82
|
}
|
|
73
83
|
});
|
|
74
84
|
}
|
|
75
85
|
})
|
|
86
|
+
})
|
|
76
87
|
|
|
77
88
|
|
|
78
89
|
|