beech-api 3.5.12 → 3.7.0
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 +400 -185
- package/index.js +2 -3
- package/package.json +9 -6
- package/packages/cli/beech +2 -2
- package/packages/cli/bin/{beech.js → beech-app.js} +86 -28
- package/packages/cli/bin/beech-service.js +40 -212
- package/packages/cli/core/auth/Credentials.js +76 -35
- package/packages/cli/core/auth/Passport.js +318 -188
- package/packages/cli/core/auth/_Request.js +12 -0
- package/packages/cli/core/configure/_gitignore +9 -1
- package/packages/cli/core/configure/app.config-basic.js +10 -10
- package/packages/cli/core/configure/app.config-sequelize.js +12 -12
- package/packages/cli/core/configure/beech.config.js +8 -0
- package/packages/cli/core/configure/global.config-basic.js +4 -4
- package/packages/cli/core/configure/global.config-sequelize.js +4 -4
- package/packages/cli/core/configure/passport.config.js +5 -15
- package/packages/cli/core/databases/mysql.js +53 -29
- package/packages/cli/core/databases/sequelize.js +135 -107
- package/packages/cli/core/databases/test.js +168 -0
- package/packages/cli/core/file-walk/file-walk.js +31 -14
- package/packages/cli/core/generator/_add-on +15 -2
- package/packages/cli/core/generator/_endpoints +15 -82
- package/packages/cli/core/generator/_endpoints_basic +39 -0
- package/packages/cli/core/generator/_help +12 -11
- package/packages/cli/core/generator/_help_create +11 -0
- package/packages/cli/core/generator/{_service → _help_service} +4 -1
- package/packages/cli/core/generator/_models +20 -15
- package/packages/cli/core/generator/{_basic-models → _models_basic} +0 -2
- package/packages/cli/core/generator/_package +4 -3
- package/packages/cli/core/generator/index.js +302 -95
- package/packages/cli/core/helpers/math.js +55 -0
- package/packages/cli/core/helpers/poolEntity.js +31 -0
- package/packages/cli/core/index.js +96 -28
- package/packages/cli/core/origin/index.js +2 -0
- package/packages/cli/core/origin/whitelist/cors.js +91 -0
- package/packages/cli/core/services/http.express.js +338 -203
- package/packages/cli/core/test/utils.js +5 -5
- package/packages/lib/index.js +4 -0
- package/packages/lib/src/endpoint.js +98 -0
- package/packages/lib/src/salt.js +3 -0
- package/packages/lib/src/schema.js +62 -0
- package/packages/lib/src/user.js +196 -0
- package/packages/package.json +4 -7
- package/packages/cli/core/generator/_create +0 -7
- package/packages/lib/beech.js +0 -136
- package/packages/lib/salt.js +0 -3
- package/packages/src-/Add-on.js +0 -9
- package/packages/src-/endpoints/hello-endpoints.js +0 -118
- package/packages/src-/endpoints/test2-endpoints.js +0 -75
- package/packages/src-/endpoints/testSequalize-endpoints.js +0 -23
- package/packages/src-/helpers/Test2.js +0 -11
- package/packages/src-/helpers/my/Test.js +0 -11
- package/packages/src-/helpers/my/Test2.js +0 -11
- package/packages/src-/helpers/my/Test3.js +0 -11
- package/packages/src-/helpers/my/Test4.js +0 -11
- package/packages/src-/models/Jubu.js +0 -29
- package/packages/src-/models/Jubu2.js +0 -20
- package/packages/src-/models/Map_master.js +0 -22
- package/packages/src-/models/Test.js +0 -29
- package/packages/src-/models/Test2.js +0 -29
- package/packages/src-/models/User2Sequelize.js +0 -23
- package/packages/src-/models/Users-sqlite.js +0 -21
- package/packages/src-/models/Users.js +0 -53
- package/packages/src-/models/Uuuuuxxx.js +0 -23
- package/packages/src-/models/xxx/Uuuuuxxx.js +0 -23
- /package/packages/cli/core/generator/{_basic-helpers → _helpers_basic} +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
const logUpdate = require("log-update");
|
|
3
3
|
const inquirer = require('inquirer');
|
|
4
|
+
const walk = require("walk");
|
|
4
5
|
|
|
5
6
|
class Generator {
|
|
6
7
|
constructor() {
|
|
@@ -36,45 +37,134 @@ class Generator {
|
|
|
36
37
|
this.make()
|
|
37
38
|
.then(make => resolve(make))
|
|
38
39
|
.catch(err => reject(err));
|
|
39
|
-
} else if (this.special.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
40
|
+
} else if (this.special == '--require' || this.special == '-R') {
|
|
41
|
+
// walking model files
|
|
42
|
+
const walkModelPromise = new Promise((resolve) => {
|
|
43
|
+
let walker = walk.walk("./src/models", { followLinks: false });
|
|
44
|
+
let modelFiles = [];
|
|
45
|
+
walker.on("file", (root, stat, next) => {
|
|
46
|
+
let subFolderModel = root.split("src/models\\")[1];
|
|
47
|
+
modelFiles.push((subFolderModel ? subFolderModel + "/" : "") + stat.name.split('.')[0]);
|
|
48
|
+
next();
|
|
49
|
+
});
|
|
50
|
+
walker.on("end", () => {
|
|
51
|
+
if(modelFiles.length) {
|
|
52
|
+
inquirer.prompt([ {
|
|
53
|
+
type: "checkbox",
|
|
54
|
+
name: "selectModel",
|
|
55
|
+
message: "[93mPlease select Models:[0m",
|
|
56
|
+
choices: modelFiles.map(e => e.replace(/\\/g, "/")),
|
|
57
|
+
} ]).then(selected => {
|
|
58
|
+
resolve(selected.selectModel);
|
|
59
|
+
});
|
|
60
|
+
} else {
|
|
61
|
+
// model file not found, Only create endpoint
|
|
62
|
+
resolve();
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
Promise.all([walkModelPromise]).then((modelSelected) => {
|
|
67
|
+
let myModel = modelSelected[0];
|
|
48
68
|
// check require model exists
|
|
49
|
-
|
|
50
|
-
.
|
|
51
|
-
|
|
52
|
-
//
|
|
53
|
-
if (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
69
|
+
const modelExistsPromise = new Promise((resolve, reject) => {
|
|
70
|
+
this.isModelFound(myModel)
|
|
71
|
+
.then(existsModel => {
|
|
72
|
+
// check exists model
|
|
73
|
+
if (existsModel == false) {
|
|
74
|
+
inquirer.prompt([ {
|
|
75
|
+
type: "confirm",
|
|
76
|
+
name: "confirmModelNF",
|
|
77
|
+
message: "[93mModel is not found, Do you only create Endpoint ?:[0m",
|
|
78
|
+
} ]).then(confirm => {
|
|
79
|
+
if(confirm.confirmModelNF) {
|
|
80
|
+
resolve([true, []]);
|
|
81
|
+
} else {
|
|
82
|
+
resolve([false, []]);
|
|
83
|
+
}
|
|
62
84
|
});
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
.then(make => resolve(make))
|
|
66
|
-
.catch(err => reject(err));
|
|
85
|
+
} else {
|
|
86
|
+
resolve([true, myModel]);
|
|
67
87
|
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
88
|
+
})
|
|
89
|
+
.catch(err => reject(err));
|
|
90
|
+
});
|
|
91
|
+
// promise all check choose model(s)
|
|
92
|
+
Promise.all([modelExistsPromise]).then((modelRes) => {
|
|
93
|
+
// Say Yes, Making...
|
|
94
|
+
if(modelRes[0][0]) {
|
|
95
|
+
const poolBasePromise = new Promise((resolve) => {
|
|
96
|
+
// Check global config for prepare tmp endpoint
|
|
97
|
+
this.fs.readFile("./global.config.js", 'utf8', (err, data) => {
|
|
98
|
+
if (err) {
|
|
99
|
+
console.log("\n[101m Faltal [0m Can't read `global.config.js` file.\n", err);
|
|
100
|
+
return; // break;
|
|
101
|
+
} else {
|
|
102
|
+
let buffer = Buffer.from(data);
|
|
103
|
+
let buf2str = buffer.toString();
|
|
104
|
+
let buf2json = JSON.parse(JSON.stringify(buf2str));
|
|
105
|
+
let pool_base = /global.pool_base\s+=\s+(?:"|')([^"]+)(?:"|')(?:\r|\n|$|;|\r)/i.exec(buf2json);
|
|
106
|
+
if (pool_base) {
|
|
107
|
+
let myRequire = modelRes[0][1];
|
|
108
|
+
if (pool_base[ 1 ] == "basic") {
|
|
109
|
+
if(myRequire.length) {
|
|
110
|
+
// declare basic require model file
|
|
111
|
+
let rqr = "";
|
|
112
|
+
myRequire.map((data, key) => {
|
|
113
|
+
let modelName = data.split('/');
|
|
114
|
+
let modelFolder = "";
|
|
115
|
+
modelName = modelName.pop();
|
|
116
|
+
modelName = modelName.charAt(0).toUpperCase() + modelName.slice(1);
|
|
117
|
+
modelFolder = data.substring(0, data.lastIndexOf('/') + 1).replace(/\\/g, "/");
|
|
118
|
+
rqr += `const ${modelName} = require(\"@/models/${modelFolder + modelName}\");\n`;
|
|
119
|
+
if(myRequire.length == key+1) {
|
|
120
|
+
resolve([[rqr], myRequire]);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
} else {
|
|
124
|
+
resolve([[]]);
|
|
125
|
+
}
|
|
126
|
+
} else if (pool_base[ 1 ] == "sequelize") {
|
|
127
|
+
// check null require resolve it
|
|
128
|
+
if(myRequire.length) {
|
|
129
|
+
// declare basic require model file
|
|
130
|
+
let rqr = "";
|
|
131
|
+
myRequire.map((data, key) => {
|
|
132
|
+
let modelName = data.split('/');
|
|
133
|
+
let modelFolder = "";
|
|
134
|
+
modelName = modelName.pop();
|
|
135
|
+
modelName = modelName.charAt(0).toUpperCase() + modelName.slice(1);
|
|
136
|
+
modelFolder = data.substring(0, data.lastIndexOf('/') + 1).replace(/\\/g, "/");
|
|
137
|
+
rqr += `const { ${modelName}, exampleFindOne${modelName}ById } = require(\"@/models/${modelFolder + modelName}\");\n`;
|
|
138
|
+
if(myRequire.length == key+1) {
|
|
139
|
+
resolve([[rqr], myRequire]);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
} else {
|
|
143
|
+
resolve([[]]);
|
|
144
|
+
}
|
|
145
|
+
} else {
|
|
146
|
+
console.log("\n[101m Faltal [0m The pool_base in `global.config.js` file does not match the specific.");
|
|
147
|
+
}
|
|
148
|
+
} else {
|
|
149
|
+
console.log("\n[101m Faltal [0m The pool_base in `global.config.js` file is not found.");
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
// Final promise for make
|
|
155
|
+
Promise.all([poolBasePromise]).then((rqrRes) => {
|
|
156
|
+
// make with require model file
|
|
157
|
+
this.make(rqrRes[0])
|
|
158
|
+
.then(make => resolve(make))
|
|
159
|
+
.catch(err => reject(err));
|
|
160
|
+
});
|
|
161
|
+
} else {
|
|
162
|
+
// Say No, Nothing...
|
|
163
|
+
resolve(": Say no.");
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
} else if (this.special == '--model' || this.special == '-M') {
|
|
78
168
|
this.makeModel()
|
|
79
169
|
.then(make => resolve(make))
|
|
80
170
|
.catch(err => reject(err));
|
|
@@ -94,10 +184,26 @@ class Generator {
|
|
|
94
184
|
} else {
|
|
95
185
|
resolve("\n[103m[90m Warning [0m[0m Using `passport init` for initiate passport-jwt.");
|
|
96
186
|
}
|
|
97
|
-
} else if (this.option == "key:generate") {
|
|
187
|
+
} else if (this.option == "key:generate" || this.option == "key:gen") {
|
|
98
188
|
this.generateKeyConfigFile()
|
|
99
189
|
.then(resGenKey => resolve(resGenKey))
|
|
100
190
|
.catch(err => reject(err));
|
|
191
|
+
} else if (this.option && this.option.slice(0, 5) == 'hash:') {
|
|
192
|
+
if(this.option.length > 5) {
|
|
193
|
+
const { HashIt, Z } = require(__dirname + "/../helpers/math");
|
|
194
|
+
Z((err, ak) => {
|
|
195
|
+
if(err) {
|
|
196
|
+
logUpdate(err);
|
|
197
|
+
} else {
|
|
198
|
+
let txt = this.option.split(":");
|
|
199
|
+
HashIt(txt, ak, null, (5).toString().length, (hashed) => {
|
|
200
|
+
logUpdate(hashed);
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
} else {
|
|
205
|
+
resolve("\n[103m[90m Info. [0m[0m No text to hash.");
|
|
206
|
+
}
|
|
101
207
|
} else if (this.option == "add-on") {
|
|
102
208
|
if (this.argument == "init") {
|
|
103
209
|
this.makeAddOnInit()
|
|
@@ -107,7 +213,10 @@ class Generator {
|
|
|
107
213
|
resolve("\n[103m[90m Warning [0m[0m Using `add-on init` for initiate add-on.");
|
|
108
214
|
}
|
|
109
215
|
} else {
|
|
110
|
-
|
|
216
|
+
// help for see avaliable command
|
|
217
|
+
this.help()
|
|
218
|
+
.then(help => resolve(help))
|
|
219
|
+
.catch(err => reject(err));
|
|
111
220
|
}
|
|
112
221
|
} catch (error) {
|
|
113
222
|
reject(error);
|
|
@@ -118,7 +227,8 @@ class Generator {
|
|
|
118
227
|
make(rq = null) {
|
|
119
228
|
return new Promise((resolve, reject) => {
|
|
120
229
|
try {
|
|
121
|
-
|
|
230
|
+
// prepare data
|
|
231
|
+
let tmpEndpointsPath = __dirname;
|
|
122
232
|
let tmpSpecPath = __dirname + '/_spec';
|
|
123
233
|
let endpointsPath = './src/endpoints/';
|
|
124
234
|
let testPath = './__tests__/unit/endpoints/';
|
|
@@ -127,42 +237,129 @@ class Generator {
|
|
|
127
237
|
arg = arg.split('/');
|
|
128
238
|
let endpoints = arg.pop();
|
|
129
239
|
let subFolder = arg.join('/');
|
|
130
|
-
// endpoints
|
|
240
|
+
// endpoints file
|
|
131
241
|
let fullEndpoints = endpointsPath + subFolder.concat('/') + endpoints.concat('-endpoints.js');
|
|
132
242
|
let routeEndpoints = ((arg.length > 0) ? '/' : '') + subFolder.concat('/') + endpoints;
|
|
133
|
-
// test
|
|
243
|
+
// test file
|
|
134
244
|
let fullTest = testPath + subFolder + '/' + endpoints.concat('-endpoints.spec.js');
|
|
245
|
+
|
|
246
|
+
// Check exists endpoint file
|
|
135
247
|
if (!this.fs.existsSync(fullEndpoints)) {
|
|
136
|
-
//
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
.then(logUpdate("\n[104m [37mProcessing[0m [0m The endpoint `" + endpoints + "` it's generating..."))
|
|
162
|
-
.then(generated => logUpdate(generated))
|
|
163
|
-
.catch(err => {
|
|
164
|
-
throw err;
|
|
248
|
+
// STEP 0 : Check global config for prepare tmp endpoint
|
|
249
|
+
const promise0 = new Promise((resolve) => {
|
|
250
|
+
this.fs.readFile("./global.config.js", 'utf8', (err, data) => {
|
|
251
|
+
if (err) {
|
|
252
|
+
console.log("\n[101m Faltal [0m Can't read `global.config.js` file.", err);
|
|
253
|
+
resolve([false, null, null]);
|
|
254
|
+
} else {
|
|
255
|
+
let buffer = Buffer.from(data);
|
|
256
|
+
let buf2str = buffer.toString();
|
|
257
|
+
let buf2json = JSON.parse(JSON.stringify(buf2str));
|
|
258
|
+
let pool_base = /global.pool_base\s+=\s+(?:"|')([^"]+)(?:"|')(?:\r|\n|$|;|\r)/i.exec(buf2json);
|
|
259
|
+
if (pool_base) {
|
|
260
|
+
if (pool_base[ 1 ] == "basic") {
|
|
261
|
+
resolve([true, tmpEndpointsPath += '/_endpoints_basic', pool_base[ 1 ]]);
|
|
262
|
+
} else if (pool_base[ 1 ] == "sequelize") {
|
|
263
|
+
resolve([true, tmpEndpointsPath += '/_endpoints', pool_base[ 1 ]]);
|
|
264
|
+
} else {
|
|
265
|
+
console.log("\n[101m Faltal [0m The pool_base in `global.config.js` file does not match the specific.");
|
|
266
|
+
resolve([false, null, null]);
|
|
267
|
+
}
|
|
268
|
+
} else {
|
|
269
|
+
console.log("\n[101m Faltal [0m The pool_base in `global.config.js` file is not found.");
|
|
270
|
+
resolve([false, null, null]);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
165
273
|
});
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
// STEP 1 : format Model for base use [Users, Xxx, ...]
|
|
277
|
+
const promise1 = new Promise((resolve) => {
|
|
278
|
+
if(rq) {
|
|
279
|
+
if(rq[1]) {
|
|
280
|
+
let finalUseModel = [];
|
|
281
|
+
rq[1].map((data, key) => {
|
|
282
|
+
let lastModel = data.split("/");
|
|
283
|
+
finalUseModel.push(lastModel.pop());
|
|
284
|
+
if(rq[1].length == key+1) {
|
|
285
|
+
resolve(finalUseModel);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
} else {
|
|
289
|
+
resolve([]);
|
|
290
|
+
}
|
|
291
|
+
} else {
|
|
292
|
+
resolve([]);
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
// STEP 2 : Format Require model file
|
|
297
|
+
const promise2 = new Promise((resolve) => {
|
|
298
|
+
// prepare state require file if `rq[0]` not exists
|
|
299
|
+
let requireFile = '// You can require something \n';
|
|
300
|
+
// check exists requrie files
|
|
301
|
+
if(rq) {
|
|
302
|
+
if (rq[0].length) {
|
|
303
|
+
requireFile = '';
|
|
304
|
+
// make require multiples line
|
|
305
|
+
rq[0].map((data, key) => {
|
|
306
|
+
requireFile += data;
|
|
307
|
+
if(rq[0].length == key+1) {
|
|
308
|
+
//setTimeout(() => {
|
|
309
|
+
resolve(requireFile);
|
|
310
|
+
//}, 2000);
|
|
311
|
+
}
|
|
312
|
+
})
|
|
313
|
+
} else {
|
|
314
|
+
resolve(requireFile);
|
|
315
|
+
}
|
|
316
|
+
} else {
|
|
317
|
+
resolve(requireFile);
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
// promise all generate endpoint with require(s)
|
|
321
|
+
Promise.all([promise0, promise1, promise2]).then((rqFileRes) => {
|
|
322
|
+
/**
|
|
323
|
+
* @return
|
|
324
|
+
*
|
|
325
|
+
* rqFileRes[0] : Array[0 = global file true, 1 = tmp endpoint file, 2 = pool_base type ]
|
|
326
|
+
* rqFileRes[1] : Array[Users, ...] array tables
|
|
327
|
+
* rqFileRes[2] : Text require file
|
|
328
|
+
*
|
|
329
|
+
*/
|
|
330
|
+
// check global file exists.
|
|
331
|
+
if(rqFileRes[0][0]) {
|
|
332
|
+
logUpdate(": Initialize...");
|
|
333
|
+
// check for remove / slash from route endpoint
|
|
334
|
+
if(rqFileRes[0][2] == 'sequelize') {
|
|
335
|
+
routeEndpoints = routeEndpoints.replace(/\\|\//g,'');
|
|
336
|
+
}
|
|
337
|
+
// timeout generate endpoint and replace content
|
|
338
|
+
setTimeout(() => {
|
|
339
|
+
// generater endpoint
|
|
340
|
+
this.makeFolder(endpointsPath + subFolder)
|
|
341
|
+
.then(this.copy.bind(this, tmpEndpointsPath, fullEndpoints))
|
|
342
|
+
.then(this.contentReplace.bind(this, fullEndpoints, {
|
|
343
|
+
'endpoint': routeEndpoints,
|
|
344
|
+
'endpointName': endpoints,
|
|
345
|
+
'rq': rqFileRes[2],
|
|
346
|
+
'tables': rqFileRes[1],
|
|
347
|
+
}))
|
|
348
|
+
// generater test
|
|
349
|
+
.then(this.makeFolder.bind(this, testPath + subFolder))
|
|
350
|
+
.then(this.copy.bind(this, tmpSpecPath, fullTest))
|
|
351
|
+
.then(this.contentReplace.bind(this, fullTest, {
|
|
352
|
+
'endpoint': routeEndpoints,
|
|
353
|
+
'endpointName': endpoints
|
|
354
|
+
}))
|
|
355
|
+
.then(logUpdate("\n[104m [37mProcessing [0m [0m The endpoint `" + endpoints + "` it's generating..."))
|
|
356
|
+
.then(generated => logUpdate(generated))
|
|
357
|
+
.catch(err => {
|
|
358
|
+
throw err;
|
|
359
|
+
});
|
|
360
|
+
}, 2000);
|
|
361
|
+
}
|
|
362
|
+
});
|
|
166
363
|
} else {
|
|
167
364
|
resolve("\n[103m[90m Warning [0m[0m The endpoint `" + endpoints + "` it's duplicated.");
|
|
168
365
|
}
|
|
@@ -175,16 +372,22 @@ class Generator {
|
|
|
175
372
|
isModelFound(modelArr) {
|
|
176
373
|
return new Promise((resolve, reject) => {
|
|
177
374
|
try {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
375
|
+
if(modelArr !== undefined) {
|
|
376
|
+
if(modelArr.length) {
|
|
377
|
+
modelArr.map((data, key) => {
|
|
378
|
+
if (!this.fs.existsSync('./src/models/' + data.concat('.js'))) {
|
|
379
|
+
resolve(data);
|
|
380
|
+
}
|
|
381
|
+
if (modelArr.length == key+1) {
|
|
382
|
+
resolve(true);
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
} else {
|
|
386
|
+
resolve(false);
|
|
185
387
|
}
|
|
186
|
-
|
|
187
|
-
|
|
388
|
+
} else {
|
|
389
|
+
resolve(false);
|
|
390
|
+
}
|
|
188
391
|
} catch (error) {
|
|
189
392
|
reject(error);
|
|
190
393
|
}
|
|
@@ -199,7 +402,7 @@ class Generator {
|
|
|
199
402
|
// read global.config.js file for check pool_base for generate model file
|
|
200
403
|
this.fs.readFile("./global.config.js", 'utf8', (err, data) => {
|
|
201
404
|
if (err) {
|
|
202
|
-
|
|
405
|
+
resolve("\n[101m Faltal [0m Can't read `global.config.js` file.", err);
|
|
203
406
|
} else {
|
|
204
407
|
let buffer = Buffer.from(data);
|
|
205
408
|
let buf2str = buffer.toString();
|
|
@@ -209,7 +412,7 @@ class Generator {
|
|
|
209
412
|
// read app.config.js file for get db connect name
|
|
210
413
|
this.fs.readFile("./app.config.js", 'utf8', (appErr, appData) => {
|
|
211
414
|
if (appErr) {
|
|
212
|
-
|
|
415
|
+
resolve("\n[101m Faltal [0m Can't read `app.config.js` file.", appErr);
|
|
213
416
|
} else {
|
|
214
417
|
let appBuffer = Buffer.from(appData);
|
|
215
418
|
let appBuf2str = appBuffer.toString();
|
|
@@ -224,7 +427,7 @@ class Generator {
|
|
|
224
427
|
} ]).then(dbSelected => {
|
|
225
428
|
// check pool_base
|
|
226
429
|
if (pool_base[ 1 ] == "basic") {
|
|
227
|
-
tmpModelsPath += '/
|
|
430
|
+
tmpModelsPath += '/_models_basic';
|
|
228
431
|
this.generateModel(tmpModelsPath, dbSelected.selectDbConnect)
|
|
229
432
|
.then(console.log)
|
|
230
433
|
.catch(console.log);
|
|
@@ -234,13 +437,13 @@ class Generator {
|
|
|
234
437
|
.then(console.log)
|
|
235
438
|
.catch(console.log);
|
|
236
439
|
} else {
|
|
237
|
-
resolve("\n[101m Faltal [0m The pool_base does not match the specific.");
|
|
440
|
+
resolve("\n[101m Faltal [0m The pool_base in `global.config.js` file does not match the specific.");
|
|
238
441
|
}
|
|
239
442
|
});
|
|
240
443
|
}
|
|
241
444
|
});
|
|
242
445
|
} else {
|
|
243
|
-
resolve("\n[101m Faltal [0m The pool_base not found.");
|
|
446
|
+
resolve("\n[101m Faltal [0m The pool_base in `global.config.js` file is not found.");
|
|
244
447
|
}
|
|
245
448
|
}
|
|
246
449
|
});
|
|
@@ -386,7 +589,7 @@ class Generator {
|
|
|
386
589
|
return new Promise((resolve, reject) => {
|
|
387
590
|
try {
|
|
388
591
|
if (!this.fs.existsSync(to)) {
|
|
389
|
-
if (this.fs.
|
|
592
|
+
if (this.fs.ReadStream(path).pipe(this.fs.createWriteStream(to))) {
|
|
390
593
|
resolve(to);
|
|
391
594
|
} else {
|
|
392
595
|
throw err;
|
|
@@ -407,6 +610,7 @@ class Generator {
|
|
|
407
610
|
let endpointName = textCondition.endpointName;
|
|
408
611
|
let rq = textCondition.rq;
|
|
409
612
|
let modelName = textCondition.modelName;
|
|
613
|
+
let tables = textCondition.tables;
|
|
410
614
|
// delay for generator
|
|
411
615
|
setTimeout(() => {
|
|
412
616
|
this.fs.readFile(pathFile, 'utf8', (err, data) => {
|
|
@@ -418,14 +622,17 @@ class Generator {
|
|
|
418
622
|
text = text.replace(new RegExp('{{endpointName}}', 'g'), endpointName);
|
|
419
623
|
text = text.replace(new RegExp('{{requireSomething}}', 'g'), rq);
|
|
420
624
|
text = text.replace(new RegExp('{{modelName}}', 'g'), modelName);
|
|
421
|
-
//
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
625
|
+
text = text.replace(new RegExp('{{tables}}', 'g'), tables ? tables : "// You can use Base([Tables, ...])");
|
|
626
|
+
setTimeout(() => {
|
|
627
|
+
// writing the file
|
|
628
|
+
this.fs.writeFile(pathFile, text, 'utf8', (err) => {
|
|
629
|
+
if (err) {
|
|
630
|
+
throw err;
|
|
631
|
+
} else {
|
|
632
|
+
resolve("\n[102m[90m Passed [0m[0m The endpoint `" + endpointName + "` it's generated.");
|
|
633
|
+
}
|
|
634
|
+
});
|
|
635
|
+
}, 1000);
|
|
429
636
|
}
|
|
430
637
|
})
|
|
431
638
|
}, 1000);
|
|
@@ -473,7 +680,7 @@ class Generator {
|
|
|
473
680
|
return new Promise((resolve, reject) => {
|
|
474
681
|
try {
|
|
475
682
|
let md5 = require("md5");
|
|
476
|
-
let secret = require(__dirname + "/../../../lib/salt").salt;
|
|
683
|
+
let secret = require(__dirname + "/../../../lib/src/salt").salt;
|
|
477
684
|
let result = '';
|
|
478
685
|
let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
479
686
|
let charactersLength = characters.length;
|
|
@@ -499,7 +706,7 @@ class Generator {
|
|
|
499
706
|
let buf2str = buffer.toString();
|
|
500
707
|
let buf2json = JSON.parse(JSON.stringify(buf2str));
|
|
501
708
|
let buf2eval = eval(buf2json);
|
|
502
|
-
let oldSecret = buf2eval.main_config.
|
|
709
|
+
let oldSecret = buf2eval.main_config.app_key;
|
|
503
710
|
// generate new key secret
|
|
504
711
|
this.appKeyGenerator(8).then(newAppSecret => {
|
|
505
712
|
// content replace
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
const secret = require("../../../lib/src/salt").salt;
|
|
2
|
+
const Cryptr = require("cryptr");
|
|
3
|
+
const md5 = require("md5");
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const appRoot = require("app-root-path");
|
|
6
|
+
|
|
7
|
+
function Rand(length) {
|
|
8
|
+
let result = "";
|
|
9
|
+
const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".concat(Math.floor(Math.random() * 1000000000));
|
|
10
|
+
const charactersLength = characters.length;
|
|
11
|
+
let counter = 0;
|
|
12
|
+
while (counter < length) {
|
|
13
|
+
result += characters.charAt(Math.floor(Math.random() * charactersLength));
|
|
14
|
+
counter += 1;
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function HashIt(txt, app_key, iteration = 10000, len = 10, cb) {
|
|
20
|
+
const crypIt = new Cryptr(secret.toString().concat(app_key.toString()), { encoding: "base64url", pbkdf2Iterations: iteration, saltLength: len, });
|
|
21
|
+
cb(crypIt.encrypt(txt.concat(md5(secret).toString().slice(0,len+1))));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function getAppKey(cb) {
|
|
25
|
+
// chcek app.config file for Dev. || Prd.
|
|
26
|
+
if(fs.existsSync(appRoot + "/app.config.js")) {
|
|
27
|
+
cb(null, require(appRoot + "/app.config.js").main_config.app_key);
|
|
28
|
+
} else {
|
|
29
|
+
fs.readFile("./app.config.js", 'utf8', (err, e) => {
|
|
30
|
+
if(err) {
|
|
31
|
+
cb(err, null);
|
|
32
|
+
} else {
|
|
33
|
+
cb(null, eval(e).main_config.app_key);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function DeHashIt(txtHashed, iteration = 10000, len = 10, cb) {
|
|
40
|
+
try {
|
|
41
|
+
getAppKey((err, app_key) => {
|
|
42
|
+
if(err) {
|
|
43
|
+
cb(err, null);
|
|
44
|
+
} else {
|
|
45
|
+
const crypIt = new Cryptr(secret.toString().concat(app_key.toString()), { encoding: "base64url", pbkdf2Iterations: iteration, saltLength: len, });
|
|
46
|
+
let decryped = crypIt.decrypt(txtHashed);
|
|
47
|
+
cb(false, decryped.concat(md5(secret).toString()));
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
} catch (error) {
|
|
51
|
+
cb(error, null);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
module.exports = { Rand, HashIt, DeHashIt, X:secret, M:md5, Z:getAppKey };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
function findPassportPk(pool_base, pool, passportTable, passportConfigField, cb) {
|
|
2
|
+
try {
|
|
3
|
+
if(passportConfigField.length) {
|
|
4
|
+
cb(null, passportConfigField);
|
|
5
|
+
} else {
|
|
6
|
+
if(pool_base == "basic") {
|
|
7
|
+
// pool base is Basic
|
|
8
|
+
pool.query("SHOW KEYS FROM " + passportTable + " WHERE Key_name = 'PRIMARY'", (err, pk) => {
|
|
9
|
+
if(err) {
|
|
10
|
+
throw "Authentication table: " + err;
|
|
11
|
+
} else {
|
|
12
|
+
cb(null, [pk[0].Column_name]);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
} else if (pool_base == "sequelize") {
|
|
16
|
+
// pool base is Sequelize
|
|
17
|
+
pool.query("SHOW KEYS FROM " + passportTable + " WHERE Key_name = 'PRIMARY'", { type: QueryTypes.SELECT }).then((pk) => {
|
|
18
|
+
cb(null, [pk[0].Column_name]);
|
|
19
|
+
}).catch((err) => {
|
|
20
|
+
throw "Authentication table: " + err;
|
|
21
|
+
});
|
|
22
|
+
} else {
|
|
23
|
+
throw "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
} catch (error) {
|
|
27
|
+
cb(error, null);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
module.exports = { findPassportPk }
|