beech-api 3.9.0-beta.9-rc → 3.9.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +1717 -1649
  3. package/index.js +2 -2
  4. package/package.json +92 -84
  5. package/packages/cli/beech +9 -10
  6. package/packages/cli/bin/beech-app.js +390 -390
  7. package/packages/cli/bin/beech-service.js +263 -170
  8. package/packages/cli/core/auth/Credentials.js +174 -174
  9. package/packages/cli/core/auth/Passport.js +664 -664
  10. package/packages/cli/core/auth/_Request.js +12 -12
  11. package/packages/cli/core/configure/_gitignore +16 -15
  12. package/packages/cli/core/configure/_sequelizerc +9 -9
  13. package/packages/cli/core/configure/app.config-basic.js +55 -55
  14. package/packages/cli/core/configure/app.config-sequelize.js +88 -88
  15. package/packages/cli/core/configure/beech.config.js +9 -9
  16. package/packages/cli/core/configure/global.config-basic.js +8 -8
  17. package/packages/cli/core/configure/global.config-sequelize.js +8 -8
  18. package/packages/cli/core/configure/jest.config.js +6 -6
  19. package/packages/cli/core/configure/jsconfig.json +8 -7
  20. package/packages/cli/core/configure/passport.config.js +97 -97
  21. package/packages/cli/core/databases/mysql.js +94 -95
  22. package/packages/cli/core/databases/sequelize.js +187 -188
  23. package/packages/cli/core/databases/test.js +250 -255
  24. package/packages/cli/core/file-walk/file-walk.js +35 -35
  25. package/packages/cli/core/generator/_endpoints +15 -15
  26. package/packages/cli/core/generator/_endpoints_basic +42 -42
  27. package/packages/cli/core/generator/_help +29 -19
  28. package/packages/cli/core/generator/_help_create +10 -10
  29. package/packages/cli/core/generator/_help_service +10 -10
  30. package/packages/cli/core/generator/_helpers +9 -9
  31. package/packages/cli/core/generator/_helpers_basic +166 -22
  32. package/packages/cli/core/generator/_models +6 -6
  33. package/packages/cli/core/generator/_models_basic +13 -13
  34. package/packages/cli/core/generator/_package +23 -19
  35. package/packages/cli/core/generator/_scheduler +32 -32
  36. package/packages/cli/core/generator/_spec +29 -29
  37. package/packages/cli/core/generator/index.js +1229 -992
  38. package/packages/cli/core/helpers/2fa.js +106 -106
  39. package/packages/cli/core/helpers/math.js +115 -115
  40. package/packages/cli/core/helpers/poolEntity.js +103 -103
  41. package/packages/cli/core/index.js +264 -266
  42. package/packages/cli/core/middleware/express/duplicateRequest.js +16 -16
  43. package/packages/cli/core/middleware/express/jwtCheckAllow.js +85 -85
  44. package/packages/cli/core/middleware/express/rateLimit.js +29 -29
  45. package/packages/cli/core/middleware/express/slowDown.js +2 -2
  46. package/packages/cli/core/middleware/index.js +6 -6
  47. package/packages/cli/core/middleware/origin/guard/advance.js +75 -75
  48. package/packages/cli/core/middleware/origin/whitelist/cors.js +94 -94
  49. package/packages/cli/core/services/http.express.js +481 -481
  50. package/packages/cli/core/test/check-node.js +21 -21
  51. package/packages/cli/core/test/utils.js +7 -7
  52. package/packages/cli/entry +10 -0
  53. package/packages/lib/index.js +6 -6
  54. package/packages/lib/src/endpoint.js +947 -885
  55. package/packages/lib/src/guard.js +60 -60
  56. package/packages/lib/src/salt.js +3 -3
  57. package/packages/lib/src/schema.js +96 -96
  58. package/packages/lib/src/specificExpress.js +7 -7
  59. package/packages/lib/src/user.js +271 -271
@@ -1,170 +1,263 @@
1
- #!/usr/bin/env node
2
- const logUpdate = require("log-update");
3
- const notifier = require("node-notifier");
4
- const path = require("path");
5
- const express = require("express");
6
- const _app_ = express();
7
-
8
- class Beech {
9
- constructor() {
10
- this.embed(process.argv)
11
- .then(() => this.init()
12
- .then(status => console.log(status))
13
- .catch(err => {
14
- throw err;
15
- })
16
- );
17
- }
18
-
19
- init() {
20
- return new Promise(async (resolve, reject) => {
21
- try {
22
- if (this.option == "serve") {
23
- // Show comiling msg
24
- const frames = ['\n[-] Compiling', '\n[\\] Compiling.', '\n[|] Compiling..', '\n[/] Compiling...'];
25
- let i = 0;
26
- var refreshCompileIntervalId = setInterval(() => {
27
- const frame = frames[i = ++i % frames.length];
28
- logUpdate(`${frame}`);
29
- }, 300);
30
- // option logic for silent notify
31
- let turnNoti = true;
32
- if (this.argument == "--silent" || this.argument == "-S") {
33
- turnNoti = false;
34
- }
35
- // check project config file exists ?
36
- if (this.fs.existsSync(this.configFile)) {
37
- let testServ = require("http").createServer(_app_);
38
- testServ.listen(this._config_.main_config.app_port, async () => {
39
- await testServ.close();
40
- // Start real service.
41
- this.serviceDevStart(this.argument, (err, run) => {
42
- if(!err && run) {
43
- // Check turn on noti
44
- if (turnNoti) {
45
- this.notiCompile();
46
- }
47
- // Delay for new replace Compiling msg to Running
48
- setTimeout(() => {
49
- clearInterval(refreshCompileIntervalId);
50
- logUpdate("\n[OK] Running...");
51
- }, 1500);
52
- } else {
53
- setTimeout(() => {
54
- clearInterval(refreshCompileIntervalId);
55
- logUpdate("\n[ERR] Failed... ", err);
56
- reject();
57
- }, 1000);
58
- }
59
- });
60
- }).on('error', (err) => {
61
- clearInterval(refreshCompileIntervalId);
62
- console.log("\n Faltal ", err);
63
- reject();
64
- })
65
- } else {
66
- clearInterval(refreshCompileIntervalId);
67
- resolve("\n Faltal  The app.conifg.js file is not found.");
68
- }
69
- } else if (!this.option || this.option == "-h" || this.option == "?" || this.option == "--help") {
70
- // help for see avaliable command
71
- this.help()
72
- .then(help => resolve(help))
73
- .catch(err => reject(err));
74
- } else if (this.option == "build") {
75
- resolve("\n Notic.  The commnad it's not supported, Please wait for next version.");
76
- } else {
77
- // help for see avaliable command
78
- this.help()
79
- .then(help => resolve(help))
80
- .catch(err => reject(err));
81
- }
82
- } catch (error) {
83
- reject(error);
84
- }
85
- });
86
- }
87
-
88
- serviceDevStart(argument, cb) {
89
- let promise = null;
90
- try {
91
- const spawnData = new Promise((resolve) => {
92
- // check Dev. run service
93
- if(argument == "-D" || argument == "--dev") {
94
- console.log("\n Starting Beech service in Development mode ");
95
- promise = this.spawn('npx', ['nodemon', '-q', './cli/beech']); // For Dev.
96
- } else {
97
- promise = this.spawn('npx', ['nodemon', '-q', './node_modules/beech-api/packages/cli/beech']); // For Prd.
98
- }
99
- resolve(promise.childProcess);
100
- });
101
- Promise.all([spawnData]).then((childProcess) => {
102
- childProcess[0].stdout.on('data', (data) => {
103
- console.log(data.toString().slice(0, -1));
104
- });
105
- // Check process error
106
- childProcess[0].stderr.on('data', (data) => {
107
- // Check Error from std Allow for Mysql version error
108
- if(data.toString().slice(0, 8) != "Ignoring" && data.toString().match(/\[SEQUELIZE0006\]/g) != "[SEQUELIZE0006]") {
109
- if(data.toString().slice(0, 13) == "node:internal") {
110
- cb(data.toString(), false);
111
- } else {
112
- console.log(data.toString());
113
- }
114
- }
115
- });
116
- // Callback first
117
- cb(null, true);
118
- });
119
- } catch (error) {
120
- cb(error, false);
121
- }
122
- }
123
-
124
- notiCompile() {
125
- notifier.notify({
126
- title: 'Beech API',
127
- subtitle: 'Beech service getting started.',
128
- message: "Service getting started.",
129
- sound: 'Funk',
130
- wait: false,
131
- icon: path.join(__dirname, "/../../public/icon/beech_128.png"),
132
- contentImage: path.join(__dirname, "../../public/icon/beech_128.png"),
133
- });
134
- }
135
-
136
- help() {
137
- return new Promise((resolve, reject) => {
138
- try {
139
- this.fs.readFile(__dirname + "/../core/generator/_help_service", "utf8", (err, data) => {
140
- if (err) {
141
- reject(err);
142
- } else {
143
- resolve(data);
144
- }
145
- });
146
- } catch (error) {
147
- reject(error);
148
- }
149
- });
150
- }
151
-
152
- embed(argv) {
153
- return new Promise((resolve, reject) => {
154
- try {
155
- this.fs = require("fs");
156
- this.spawn = require('child-process-promise').spawn;
157
- this.argv = argv;
158
- this.option = argv[ 2 ]; // serve|build
159
- this.argument = argv[ 3 ]; // --silent -S | --dev -D
160
- this.configFile = path.resolve("./app.config.js");
161
- this._config_ = require(this.configFile);
162
- resolve(this);
163
- } catch (error) {
164
- reject(error);
165
- }
166
- });
167
- }
168
- }
169
-
170
- new Beech();
1
+ #!/usr/bin/env node
2
+ const logUpdate = require("log-update");
3
+ const notifier = require("node-notifier");
4
+ const path = require("path");
5
+ const express = require("express");
6
+ const _app_ = express();
7
+
8
+ class Beech {
9
+ constructor() {
10
+ this.embed(process.argv)
11
+ .then(() => this.init()
12
+ .then(status => console.log(status))
13
+ .catch(err => {
14
+ throw err;
15
+ })
16
+ );
17
+ }
18
+
19
+ init() {
20
+ return new Promise(async (resolve, reject) => {
21
+ try {
22
+ if (this.option == "serve") {
23
+ // Show comiling msg
24
+ const frames = ['\n[-] Compiling', '\n[\\] Compiling.', '\n[|] Compiling..', '\n[/] Compiling...'];
25
+ let i = 0;
26
+ var refreshCompileIntervalId = setInterval(() => {
27
+ const frame = frames[i = ++i % frames.length];
28
+ logUpdate(`${frame}`);
29
+ }, 300);
30
+ // option logic for silent notify
31
+ let turnNoti = true;
32
+ if (this.argument == "--silent" || this.argument == "-S") {
33
+ turnNoti = false;
34
+ }
35
+ // check project config file exists ?
36
+ if (this.fs.existsSync(this.configFile)) {
37
+ let testServ = require("http").createServer(_app_);
38
+ testServ.listen(this._config_.main_config.app_port, async () => {
39
+ testServ.close();
40
+ // Start real service.
41
+ this.serviceDevStart(this.argument, refreshCompileIntervalId, (err, run) => {
42
+ if(!err && run) {
43
+ // Check turn on noti
44
+ if (turnNoti) {
45
+ this.notiCompile();
46
+ }
47
+ } else {
48
+ setTimeout(() => {
49
+ if(refreshCompileIntervalId) clearInterval(refreshCompileIntervalId);
50
+ logUpdate("\n[ERR] Failed... ", err);
51
+ reject();
52
+ }, 1000);
53
+ }
54
+ });
55
+ }).on('error', (err) => {
56
+ if(refreshCompileIntervalId) clearInterval(refreshCompileIntervalId);
57
+ console.log("\n Fatal ", err);
58
+ reject();
59
+ })
60
+ } else {
61
+ if(refreshCompileIntervalId) clearInterval(refreshCompileIntervalId);
62
+ resolve("\n Fatal  The app.conifg.js file is not found.");
63
+ }
64
+ } else if (!this.option || this.option == "-h" || this.option == "?" || this.option == "--help") {
65
+ // help for see avaliable command
66
+ this.help()
67
+ .then(help => resolve(help))
68
+ .catch(err => reject(err));
69
+ } else if (this.option == "build") {
70
+ this.runBuild()
71
+ .then((builded) => (builded) ? resolve("\n[OK] Build completed successfully.\n") : resolve('[X] Build rejected.\n'))
72
+ .catch(err => reject(`\n[ERR] Build failed : ${err}`));
73
+ } else {
74
+ // help for see avaliable command
75
+ this.help()
76
+ .then(help => resolve(help))
77
+ .catch(err => reject(err));
78
+ }
79
+ } catch (error) {
80
+ reject(error);
81
+ }
82
+ });
83
+ }
84
+
85
+ serviceDevStart(argument, refreshCompileIntervalId, cb) {
86
+ if(refreshCompileIntervalId) clearInterval(refreshCompileIntervalId);
87
+ let promise = null;
88
+ try {
89
+ const spawnData = new Promise((resolve) => {
90
+ // check Dev. run service
91
+ if(argument == "-D" || argument == "--dev") {
92
+ console.log("\n Starting Beech service in Development mode ");
93
+ promise = this.spawn('npx', ['nodemon', '-q', './cli/beech']); // For Dev.
94
+ } else {
95
+ promise = this.spawn('npx', ['nodemon', '-q', './node_modules/beech-api/packages/cli/beech']); // For Prd.
96
+ }
97
+ resolve(promise.childProcess);
98
+ });
99
+ Promise.all([spawnData]).then((childProcess) => {
100
+ childProcess[0].stdout.on('data', (data) => {
101
+ console.log(data.toString().slice(0, -1));
102
+ });
103
+ // Check process error
104
+ childProcess[0].stderr.on('data', (data) => {
105
+ // Check Error from std Allow for Mysql version error
106
+ if(data.toString().slice(0, 8) != "Ignoring" && data.toString().match(/\[SEQUELIZE0006\]/g) != "[SEQUELIZE0006]") {
107
+ if(data.toString().slice(0, 13) == "node:internal") {
108
+ cb(data.toString(), false);
109
+ } else {
110
+ console.log(data.toString());
111
+ }
112
+ }
113
+ });
114
+ // Callback first
115
+ cb(null, true);
116
+ });
117
+ } catch (error) {
118
+ cb(error, false);
119
+ }
120
+ }
121
+
122
+ async runBuild() {
123
+ // detect if current working directory is 'dist' to prevent build inside dist folder
124
+ if (process.cwd().endsWith('dist')) {
125
+ console.log("\n[ERR] Fatal: Cannot run build command inside 'dist' folder.\n");
126
+ return false;
127
+ }
128
+ const esbuild = require("esbuild");
129
+ const { glob } = require("glob");
130
+ const JavaScriptObfuscator = require("javascript-obfuscator");
131
+ const fs = require("fs");
132
+ const path = require("path");
133
+ const appRoot = require("app-root-path");
134
+ const _config_ = require(appRoot + "/app.config");
135
+ const beechTxtPath = path.join("./node_modules/beech-api/packages/cli/entry");
136
+ console.log("\n[Obf] Starting Beech Secure Build... \n");
137
+ try {
138
+ const projectFiles = glob.sync("{src/**/*.js,*.config.js}", {
139
+ ignore: ["node_modules/**", "dist/**", "cli/**"],
140
+ posix: true
141
+ });
142
+ // Check file exists to build
143
+ if (fs.existsSync(beechTxtPath)) {
144
+ projectFiles.push(beechTxtPath);
145
+ } else {
146
+ console.log("[!] Warning: Beech entry not found at: ", beechTxtPath);
147
+ }
148
+ if (projectFiles.length === 0) {
149
+ console.log("[!] No files found to build. ");
150
+ return true;
151
+ }
152
+ const MY_BUILD_SEED = _config_.main_config.app_key;
153
+ for (const file of projectFiles) {
154
+ let codeToObfuscate = "";
155
+ let fileName = file;
156
+ if (file === beechTxtPath) {
157
+ codeToObfuscate = fs.readFileSync(file, "utf8");
158
+ fileName = "server.js";
159
+ } else {
160
+ // Log file being processed
161
+ console.log(`[+] dist/${file} `);
162
+ const result = await esbuild.build({
163
+ entryPoints: [file],
164
+ bundle: false,
165
+ minify: true,
166
+ platform: "node",
167
+ format: "cjs",
168
+ write: false,
169
+ });
170
+ codeToObfuscate = result.outputFiles[0].text;
171
+ fileName = file;
172
+ }
173
+ const obfuscatedResult = JavaScriptObfuscator.obfuscate(codeToObfuscate, {
174
+ compact: true,
175
+ seed: MY_BUILD_SEED,
176
+ identifierNamesGenerator: 'hexadecimal',
177
+ renameGlobals: false,
178
+ stringArray: true,
179
+ stringArrayEncoding: ['base64'],
180
+ stringArrayThreshold: 0.8,
181
+ unicodeEscapeSequence: true,
182
+ controlFlowFlattening: false,
183
+ deadCodeInjection: false,
184
+ numbersToExpressions: false,
185
+ splitStrings: false,
186
+ selfDefending: false,
187
+ simplify: true,
188
+ });
189
+ const outPath = path.join("dist", fileName);
190
+ const outDir = path.dirname(outPath);
191
+ if (!fs.existsSync(outDir)) fs.mkdirSync(outDir, { recursive: true });
192
+ fs.writeFileSync(outPath, obfuscatedResult.getObfuscatedCode());
193
+ }
194
+ // Copy package.json & Modify for Production
195
+ if (fs.existsSync("./package.json")) {
196
+ const pkg = JSON.parse(fs.readFileSync("./package.json", "utf8"));
197
+ // set new start script for production
198
+ pkg.scripts = {
199
+ "prod-start": "node server.js",
200
+ "prod-pm2": "pm2 start server.js --name " + (pkg.name || "beech-api")
201
+ };
202
+ // delete devDependencies for production
203
+ delete pkg.devDependencies;
204
+ // write new package.json to dist
205
+ fs.writeFileSync(
206
+ path.join("dist", "package.json"),
207
+ JSON.stringify(pkg, null, 2)
208
+ );
209
+ }
210
+ return true;
211
+ } catch (error) {
212
+ console.log("\n[ERR] Build Error ", error.message);
213
+ throw error;
214
+ }
215
+ }
216
+
217
+ notiCompile() {
218
+ notifier.notify({
219
+ title: 'Beech API',
220
+ subtitle: 'Beech service getting started.',
221
+ message: "Service getting started.",
222
+ sound: 'Funk',
223
+ wait: false,
224
+ icon: path.join(__dirname, "/../../public/icon/beech_128.png"),
225
+ contentImage: path.join(__dirname, "../../public/icon/beech_128.png"),
226
+ });
227
+ }
228
+
229
+ help() {
230
+ return new Promise((resolve, reject) => {
231
+ try {
232
+ this.fs.readFile(__dirname + "/../core/generator/_help_service", "utf8", (err, data) => {
233
+ if (err) {
234
+ reject(err);
235
+ } else {
236
+ resolve(data);
237
+ }
238
+ });
239
+ } catch (error) {
240
+ reject(error);
241
+ }
242
+ });
243
+ }
244
+
245
+ embed(argv) {
246
+ return new Promise((resolve, reject) => {
247
+ try {
248
+ this.fs = require("fs");
249
+ this.spawn = require('child-process-promise').spawn;
250
+ this.argv = argv;
251
+ this.option = argv[ 2 ]; // serve|build
252
+ this.argument = argv[ 3 ]; // --silent -S | --dev -D
253
+ this.configFile = path.resolve("./app.config.js");
254
+ this._config_ = require(this.configFile);
255
+ resolve(this);
256
+ } catch (error) {
257
+ reject(error);
258
+ }
259
+ });
260
+ }
261
+ }
262
+
263
+ new Beech();