beech-api 3.4.12 → 3.5.12

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 (53) hide show
  1. package/README.md +45 -16
  2. package/package.json +15 -9
  3. package/packages/cli/beech +2 -2
  4. package/packages/cli/bin/beech-service.js +305 -0
  5. package/packages/cli/bin/beech.js +133 -66
  6. package/packages/cli/core/auth/Credentials.js +34 -1
  7. package/packages/cli/core/auth/Passport.js +215 -88
  8. package/packages/cli/core/configure/{app.config.js → app.config-basic.js} +4 -4
  9. package/packages/cli/core/configure/app.config-sequelize.js +89 -0
  10. package/packages/cli/core/configure/global.config-basic.js +9 -0
  11. package/packages/cli/core/configure/global.config-sequelize.js +9 -0
  12. package/packages/cli/core/configure/passport.config.js +4 -4
  13. package/packages/cli/core/databases/{mysql.connection.js → mysql.js} +12 -11
  14. package/packages/cli/core/databases/sequelize.js +149 -0
  15. package/packages/cli/core/generator/_basic-helpers +23 -0
  16. package/packages/cli/core/generator/_basic-models +25 -0
  17. package/packages/cli/core/generator/{endpoints → _endpoints} +5 -5
  18. package/packages/cli/core/generator/_helpers +10 -0
  19. package/packages/cli/core/generator/_models +23 -0
  20. package/packages/cli/core/generator/{package → _package} +2 -2
  21. package/packages/cli/core/generator/_service +8 -0
  22. package/packages/cli/core/generator/index.js +91 -24
  23. package/packages/cli/core/index.js +11 -4
  24. package/packages/cli/core/services/http.express.js +17 -15
  25. package/packages/lib/beech.js +90 -26
  26. package/packages/package.json +20 -0
  27. package/packages/public/icon/beech_128.png +0 -0
  28. package/packages/src-/Add-on.js +9 -0
  29. package/packages/src-/endpoints/hello-endpoints.js +118 -0
  30. package/packages/src-/endpoints/test2-endpoints.js +75 -0
  31. package/packages/src-/endpoints/testSequalize-endpoints.js +23 -0
  32. package/packages/src-/helpers/my/Test.js +11 -0
  33. package/packages/src-/helpers/my/Test2.js +11 -0
  34. package/packages/src-/helpers/my/Test3.js +11 -0
  35. package/packages/src-/helpers/my/Test4.js +11 -0
  36. package/packages/src-/models/Jubu.js +29 -0
  37. package/packages/src-/models/Jubu2.js +20 -0
  38. package/packages/src-/models/Map_master.js +22 -0
  39. package/packages/{cli/core/generator/models → src-/models/Test.js} +1 -1
  40. package/packages/src-/models/Test2.js +29 -0
  41. package/packages/src-/models/User2Sequelize.js +23 -0
  42. package/packages/src-/models/Users-sqlite.js +21 -0
  43. package/packages/src-/models/Users.js +53 -0
  44. package/packages/src-/models/Uuuuuxxx.js +23 -0
  45. package/packages/src-/models/xxx/Uuuuuxxx.js +23 -0
  46. package/packages/cli/core/configure/global.config.js +0 -7
  47. /package/packages/cli/core/configure/{gitignore → _gitignore} +0 -0
  48. /package/packages/cli/core/configure/{sequelizerc → _sequelizerc} +0 -0
  49. /package/packages/cli/core/generator/{add-on → _add-on} +0 -0
  50. /package/packages/cli/core/generator/{create → _create} +0 -0
  51. /package/packages/cli/core/generator/{help → _help} +0 -0
  52. /package/packages/cli/core/generator/{spec → _spec} +0 -0
  53. /package/packages/{cli/core/generator/helpers → src-/helpers/Test2.js} +0 -0
package/README.md CHANGED
@@ -29,7 +29,7 @@
29
29
 
30
30
  ## Environment
31
31
 
32
- - [`Node.js`](https://nodejs.org) >= 10.13.0+ (recommended)
32
+ - [`Node.js`](https://nodejs.org) >= 14.19.0+ (recommended)
33
33
  - `npm` >= 6.4.1+ or `yarn` >= 1.22.4+
34
34
 
35
35
  ## Installation
@@ -106,12 +106,12 @@ $ beech make endpointName
106
106
 
107
107
  exports.init = () => {
108
108
 
109
- /@GET/
109
+ //@GET
110
110
  endpoint.get('/fruits', (req, res) => {
111
111
  ...
112
112
  });
113
113
 
114
- /@POST/
114
+ //@POST
115
115
  endpoint.post('/fruits', (req, res) => {
116
116
  ...
117
117
  });
@@ -131,7 +131,7 @@ The `models` keep the files of function(s) for retriving, inserting, updating an
131
131
  $ beech make modelName --model
132
132
  ```
133
133
 
134
- **Example:** Fruits model.
134
+ **Example (basic):** Fruits model.
135
135
 
136
136
  ```js
137
137
  // Fruits.js
@@ -143,24 +143,53 @@ $ beech make modelName --model
143
143
  return { ... }
144
144
  },
145
145
 
146
- // Example basic function get data from MySQL (must be return promise)
146
+ // Example basic function get data from MySQL table
147
147
  getFruits() {
148
- return new Promise((resolve, reject) => {
149
- try {
150
- // call mysql `default_db` connection
151
- mysql.default_db.query("SELECT * FROM fruits", (err, results) => {
152
- if (err) { reject(err) }
153
- resolve(results);
154
- });
155
- } catch (error) {
156
- reject(error);
157
- }
148
+ // call example mysql `mysql.default_db` connection name
149
+ mysql.default_db.query("SELECT * FROM fruits", (err, results) => {
150
+
151
+ if (err) { throw err }
152
+ return results;
153
+
158
154
  });
159
155
  }
160
156
 
161
157
  };
162
158
  ```
163
159
 
160
+ **Example (sequelize):** Fruits model.
161
+
162
+ ```js
163
+ // Fruits.js
164
+
165
+ // call example define table with `sql.default_db` connection name
166
+ const Fruits = sql.default_db.define("fruits", {
167
+ // asign more DataTypes see more: https://sequelize.org/docs/v6/core-concepts/model-basics/#data-types
168
+ id: {
169
+ type: DataTypes.INTEGER,
170
+ autoIncrement: true,
171
+ primaryKey: true
172
+ },
173
+ fruitsName: DataTypes.STRING,
174
+ fruitsQty: DataTypes.INTEGER,
175
+ fruitsPrice: DataTypes.INTEGER,
176
+ });
177
+
178
+ module.exports = {
179
+
180
+ // Example basic function get one by id
181
+ findFruitsById(id) {
182
+ return Fruits.findOne({ where: { id: id } });
183
+ },
184
+
185
+ // Example basic function get all data from table fruits
186
+ findAll() {
187
+ return Fruits.findAll();
188
+ }
189
+
190
+ };
191
+ ```
192
+
164
193
  ## Helpers
165
194
 
166
195
  The `helpers` keep the files of functions for process specific something in the project. So, you might create the `helpers` in path `src/helpers` folder.
@@ -216,7 +245,7 @@ module.exports = {
216
245
  token_expired: 86400,
217
246
 
218
247
  model: {
219
- // your mysql connection name inside `app.config.js` file (users table storage)
248
+ // Main sql connection name. You must make sure connection name like inside `app.config.js` file and choose one connection name.
220
249
  name: "default_db",
221
250
 
222
251
  // table name of users store, default table `users`
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "beech-api",
3
- "version": "3.4.12",
3
+ "version": "3.5.12",
4
4
  "description": "Command line interface for rapid Beech API development",
5
5
  "keywords": [
6
+ "api",
7
+ "api-framework",
6
8
  "beech-api",
7
9
  "cli",
8
- "api",
9
- "nodejs",
10
- "api-framework"
10
+ "nodejs"
11
11
  ],
12
12
  "license": "MIT",
13
13
  "repository": {
@@ -18,6 +18,7 @@
18
18
  "authors": "bombkiml",
19
19
  "bin": {
20
20
  "beech-app": "./packages/cli/bin/beech.js",
21
+ "beech-service": "./packages/cli/bin/beech-service.js",
21
22
  "beech": "./packages/cli/core/generator/index.js"
22
23
  },
23
24
  "bugs": {
@@ -26,37 +27,42 @@
26
27
  "homepage": "https://github.com/bombkiml/beech-api/blob/master/README.md",
27
28
  "deprecated": false,
28
29
  "engines": {
29
- "node": ">=10.13"
30
+ "node": ">=14.19"
30
31
  },
31
32
  "dependencies": {
32
33
  "app-root-path": "^3.0.0",
33
34
  "axios": "^0.26.1",
35
+ "cli-clear": "^1.0.4",
34
36
  "cookie-parser": "1.4.3",
35
37
  "cors": "^2.8.1",
36
38
  "express": "4.16.3",
37
39
  "express-session": "^1.17.1",
38
40
  "express-validator": "2.21.0",
39
41
  "fs": "0.0.1-security",
42
+ "inquirer": "8.2.4",
40
43
  "jsonwebtoken": "^8.5.1",
41
44
  "log-update": "^4.0.0",
42
45
  "md5": "^2.3.0",
43
- "mkdirp": "^0.5.1",
46
+ "mkdirp": "^2.1.6",
44
47
  "module-alias": "^2.2.2",
45
48
  "mysql": "^2.18.1",
46
49
  "mysql2": "^2.3.3",
47
50
  "node-cmd": "^3.0.0",
48
- "passport": "^0.4.1",
51
+ "node-notifier": "^10.0.1",
52
+ "passport": "^0.6.0",
49
53
  "passport-facebook": "^3.0.0",
50
54
  "passport-google-oauth": "^2.0.0",
51
55
  "passport-jwt": "^4.0.0",
52
56
  "passport-local": "^1.0.0",
53
57
  "passport-oauth": "^1.0.0",
54
58
  "path": "^0.12.7",
55
- "sequelize": "^5.21.6",
59
+ "sequelize": "^6.21.3",
56
60
  "walk": "^2.3.14"
57
61
  },
58
62
  "devDependencies": {
59
- "jest": "^25.2.7",
63
+ "jest": "^28.1.3",
64
+ "node-dev": "^8.0.0",
65
+ "nodemon": "^3.0.1",
60
66
  "sequelize-cli": "^5.5.1"
61
67
  },
62
68
  "jest": {
@@ -4,8 +4,8 @@
4
4
  * The beech api (cli) package generator and server (bash for developer and production build)
5
5
  *
6
6
  * @author bombkiml
7
- * @version 3.2
8
- * @built Apr 17, 2020 at 00:09:19
7
+ * @version 3.6
8
+ * @built Aug 14, 2023 at 00:09:19
9
9
  *
10
10
  */
11
11
  (process.argv[2]) ? require('./core/generator/index') : require('./core/index')
@@ -0,0 +1,305 @@
1
+ #!/usr/bin/env node
2
+ const logUpdate = require("log-update");
3
+ const notifier = require("node-notifier");
4
+ const path = require("path");
5
+ const clear = require("cli-clear");
6
+ const express = require("express");
7
+ const _app_ = express();
8
+ const Sequelize = require('sequelize');
9
+ let testSql = {};
10
+
11
+ class Beech {
12
+ constructor() {
13
+ this.embed(process.argv)
14
+ .then(() => this.init()
15
+ .then(status => console.log(status))
16
+ .catch(err => {
17
+ throw err;
18
+ })
19
+ );
20
+ }
21
+
22
+ init() {
23
+ return new Promise(async (resolve, reject) => {
24
+ try {
25
+ if (this.option == "serve") {
26
+ let turnNoti = true;
27
+ if (this.argument == "--silent" || this.argument == "-S") {
28
+ turnNoti = false;
29
+ }
30
+ // check project config file exists ?
31
+ if (this.fs.existsSync(this.configFile)) {
32
+ const testServ = _app_.listen(this._config_.main_config.app_port, () => {
33
+ //console.log("Test Started.");
34
+ testServ.close();
35
+ // Start real service.
36
+ this.getStart(turnNoti, (err, res) => {
37
+ if (err) {
38
+ reject("\n Faltal  start service catch.");
39
+ return;
40
+ }
41
+ // show info
42
+ console.clear();
43
+ //console.log(res);
44
+ });
45
+
46
+ });
47
+ } else {
48
+ resolve("\n Faltal  The app.conifg.js file is not found.");
49
+ }
50
+ } else if (!this.option || this.option == "-h" || this.option == "?" || this.option == "--help") {
51
+ // help for see avaliable command
52
+ this.help()
53
+ .then(help => resolve(help))
54
+ .catch(err => reject(err));
55
+ } else {
56
+ resolve("\n Faltal  commnad it's not available.");
57
+ }
58
+ } catch (error) {
59
+ reject(error);
60
+ }
61
+ });
62
+ }
63
+
64
+ filterDbIsTrue(dbConfig, cb) {
65
+ try {
66
+ let dbIsTrue = [];
67
+ dbConfig.filter((e, k) => {
68
+ if (e.is_connect) {
69
+ dbIsTrue.push(e);
70
+ }
71
+ if (dbConfig.length == k + 1) {
72
+ cb(null, dbIsTrue);
73
+ }
74
+ });
75
+ } catch (error) {
76
+ cb(error, null);
77
+ }
78
+ }
79
+
80
+ initSequelize(val, cb) {
81
+ try {
82
+ const sq = new Sequelize({
83
+ dialect: val.dialect || "mysql",
84
+ host: val.host,
85
+ username: val.username,
86
+ password: val.password,
87
+ database: val.database,
88
+ port: val.port,
89
+ storage: val.storage || ":memory:",
90
+ protocol: val.protocol || null,
91
+ logging: val.logging || false,
92
+ dialectOptions: {
93
+ socketPath: ((val.dialectOptions) ? ((val.dialectOptions.socketPath) ? val.dialectOptions.socketPath : "") : ""), //Applications/MAMP/tmp/mysql/mysql.sock
94
+ supportBigNumbers: ((val.dialectOptions) ? ((val.dialectOptions.supportBigNumbers) ? val.dialectOptions.supportBigNumbers : false) : false),
95
+ bigNumberStrings: ((val.dialectOptions) ? ((val.dialectOptions.bigNumberStrings) ? val.dialectOptions.bigNumberStrings : false) : false),
96
+ options: ((val.dialectOptions) ? ((val.dialectOptions.options) ? ({ encrypt: false, ...val.dialectOptions.options }) : { encrypt: false }) : { encrypt: false }),
97
+ },
98
+ omitNull: val.omitNull || false,
99
+ native: val.native || false,
100
+ define: {
101
+ underscored: ((val.define) ? ((val.define.underscored) ? val.define.underscored : false) : false),
102
+ freezeTableName: ((val.define) ? ((val.define.freezeTableName === false) ? val.define.freezeTableName : true) : true),
103
+ charset: ((val.define) ? ((val.define.charset) ? val.define.charset : "utf8") : "utf8"),
104
+ dialectOptions: {
105
+ collate: ((val.define) ? ((val.define.dialectOptions) ? ((val.define.dialectOptions.timestamps) ? val.define.dialectOptions.timestamps : "utf8_general_ci") : "utf8_general_ci") : "utf8_general_ci"),
106
+ },
107
+ timestamps: ((val.define) ? ((val.define.timestamps) ? val.define.timestamps : false) : false),
108
+ },
109
+ sync: {
110
+ force: ((val.sync) ? ((val.sync.force) ? val.sync.force : false) : false),
111
+ },
112
+ pool: {
113
+ max: ((val.pool) ? ((val.pool.max) ? val.pool.max : 5) : 5),
114
+ idle: ((val.pool) ? ((val.pool.idle) ? val.pool.idle : 30000) : 30000),
115
+ acquire: ((val.pool) ? ((val.pool.acquire) ? val.pool.acquire : 60000) : 60000),
116
+ },
117
+ isolationLevel: val.isolationLevel || "Transaction.ISOLATION_LEVELS.REPEATABLE_READ",
118
+ query: {
119
+ raw: ((val.query) ? ((val.query.raw) ? val.query.raw : true) : true),
120
+ nest: ((val.query) ? ((val.query.nest) ? val.query.nest : true) : true),
121
+ }
122
+ });
123
+ cb(false, sq);
124
+ } catch (error) {
125
+ cb(error, null);
126
+ }
127
+ }
128
+
129
+ testConnectInProcess = (database_config, dbConnTotal, cb) => {
130
+ try {
131
+ let val = database_config.shift();
132
+ if (val) {
133
+ this.initSequelize(val, async (err, sq) => {
134
+ if (err) {
135
+ console.error(" Failed  Can't to create a Sequelize instance:", val.name, "\n", err);
136
+ cb(err, null, null);
137
+ }
138
+ // Test connection
139
+ await sq.authenticate()
140
+ .then(() => {
141
+ // Database some is true perfectly.
142
+ if (database_config.length == 0) {
143
+ if (sq) {
144
+ testSql[ val.name ] = sq;
145
+ //console.log("DB true, Perfectly.", val.name);
146
+ cb(null, true, testSql);
147
+ }
148
+ } else {
149
+ testSql[ val.name ] = sq;
150
+ this.testConnectInProcess(database_config, dbConnTotal, cb);
151
+ }
152
+ })
153
+ .catch(err => {
154
+ console.error(" Failed  Unable to connect to the database:", val.name, "\n", err);
155
+ cb(err, null, null);
156
+ });
157
+ });
158
+ } else if (!dbConnTotal) {
159
+ // All Database is falsly perfectly.
160
+ //console.log("DB all false, Perfectly.");
161
+ cb(null, true, testSql);
162
+ }
163
+ } catch (error) {
164
+ cb(error, null, null);
165
+ }
166
+ }
167
+
168
+ getStart(turnNoti, cb) {
169
+ try {
170
+ clear();
171
+ logUpdate("Compiling...");
172
+ // filter for check dabatase only true
173
+ this.filterDbIsTrue(this._config_.database_config, (err, dbConnectIsTrueOnly) => {
174
+ if (err) {
175
+ logUpdate("Config file crash.", err);
176
+ return;
177
+ }
178
+ // leave data to disconnect database
179
+ let leaveDataForDisconnect = dbConnectIsTrueOnly.slice(0);
180
+ // check db connect truthy length ?
181
+ if (dbConnectIsTrueOnly.length > 0) {
182
+ // Test connect process
183
+ this.testConnectInProcess(dbConnectIsTrueOnly, dbConnectIsTrueOnly.length, (err, result, dbs) => {
184
+ if (err) {
185
+ logUpdate(" Failed  Database connect failed.", err);
186
+ return;
187
+ }
188
+ if (result) {
189
+ // Disconnect database
190
+ this.disConnectTestDB(leaveDataForDisconnect, dbs, (err, disResult) => {
191
+ if (err) {
192
+ logUpdate(" Failed  Testing Database connect failed.", err);
193
+ return;
194
+ }
195
+ if (disResult) {
196
+ // Start service
197
+ this.serviceDevStart();
198
+ // check turn on nofi
199
+ if (turnNoti) {
200
+ this.notiCompile();
201
+ }
202
+ } else {
203
+ cb(err, null);
204
+ }
205
+ });
206
+ }
207
+ });
208
+ } else {
209
+ this.serviceDevStart();
210
+ }
211
+ });
212
+ } catch (error) {
213
+ cb(error, null);
214
+ }
215
+ }
216
+
217
+ serviceDevStart() {
218
+ let firstCount = 0;
219
+ const command = this.cmd.get(`npx nodemon -q ./node_modules/beech-api/packages/cli/beech`);
220
+ command.stdout.on('data', (data) => {
221
+ firstCount++;
222
+ let leaveData = data.slice(0);
223
+ if (firstCount == 1) {
224
+ clear();
225
+ }
226
+ // shout out
227
+ if (data.trim().slice(-1) == ":") {
228
+ console.log("\n", leaveData.trim());
229
+ } else {
230
+ let serviceShoutOut = leaveData.trim().split('- ');
231
+ if (serviceShoutOut.length > 2) {
232
+ console.log(" -", serviceShoutOut[ 1 ].trim());
233
+ console.log(" -", serviceShoutOut[ 2 ].trim());
234
+ } else {
235
+ console.log(" ", leaveData.trim());
236
+ }
237
+ }
238
+
239
+ });
240
+ }
241
+
242
+ notiCompile() {
243
+ notifier.notify({
244
+ title: 'Beech API',
245
+ subtitle: 'Beech service getting started.',
246
+ message: "Service getting started.",
247
+ sound: 'Funk',
248
+ wait: false,
249
+ icon: path.join(__dirname, "/../../public/icon/beech_128.png"),
250
+ contentImage: path.join(__dirname, "../../public/icon/beech_128.png"),
251
+ });
252
+ }
253
+
254
+ disConnectTestDB(dbConfigTruthy, dbs, cb) {
255
+ try {
256
+ dbConfigTruthy.map((e, k) => {
257
+ // Closing database
258
+ if (dbs[ e.name ].close()) {
259
+ if (dbConfigTruthy.length == k + 1) {
260
+ cb(null, dbConfigTruthy);
261
+ }
262
+ } else {
263
+ cb(`Close database failed, ${e.name}`, null);
264
+ }
265
+ });
266
+ } catch (error) {
267
+ cb(error, null);
268
+ }
269
+ }
270
+
271
+ help() {
272
+ return new Promise((resolve, reject) => {
273
+ try {
274
+ this.fs.readFile(__dirname + "/../core/generator/_service", "utf8", (err, data) => {
275
+ if (err) {
276
+ reject(err);
277
+ } else {
278
+ resolve(data);
279
+ }
280
+ });
281
+ } catch (error) {
282
+ reject(error);
283
+ }
284
+ });
285
+ }
286
+
287
+ embed(argv) {
288
+ return new Promise((resolve, reject) => {
289
+ try {
290
+ this.fs = require("fs");
291
+ this.cmd = require('node-cmd');
292
+ this.argv = argv;
293
+ this.option = argv[ 2 ];
294
+ this.argument = argv[ 3 ];
295
+ this.configFile = path.resolve("./app.config.js");
296
+ this._config_ = require(this.configFile);
297
+ resolve(this);
298
+ } catch (error) {
299
+ reject(error);
300
+ }
301
+ });
302
+ }
303
+ }
304
+
305
+ new Beech();