zet-lib 3.2.4 → 3.3.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/lib/Form.js CHANGED
@@ -4,6 +4,7 @@
4
4
  */
5
5
 
6
6
  const Util = require("./Util");
7
+ const path = require('path');
7
8
 
8
9
  const Form = {};
9
10
  // Menghitung jumlah tanda "[" dalam str
@@ -550,7 +551,12 @@ Form.field = (obj) => {
550
551
  break;
551
552
 
552
553
  case "html":
553
- displayForm = obj.code;
554
+ let obj_code = typeof obj.code === 'string' ? obj.code : '';
555
+ if (!obj_code && obj.code) {
556
+ const dir = path.join(dirRoot,'public','runtime','html',obj.routeName,obj.id+'.txt')
557
+ obj_code = Util.readFile(dir);
558
+ }
559
+ displayForm = obj_code;
554
560
  break;
555
561
 
556
562
  case "location":
@@ -1038,7 +1044,7 @@ Form.build = (obj) => {
1038
1044
  }
1039
1045
 
1040
1046
  if(obj.type == "html") {
1041
- html = obj.code;
1047
+ html = Form.field(obj)
1042
1048
  }
1043
1049
  return html;
1044
1050
  };
package/lib/Mail.js CHANGED
@@ -1,4 +1,5 @@
1
1
  require("dotenv").config();
2
+ const path = require('path');
2
3
  const nodemailer = require('nodemailer')
3
4
  const ejs = require('ejs')
4
5
  const Util = require('./Util')
@@ -47,7 +48,7 @@ MAIL.send = function (options = {}, transporter = null) {
47
48
  }
48
49
 
49
50
  MAIL.forgotPassword = (datas = {}, options = {}) => {
50
- ejs.renderFile(`${dirRoot}/views/layouts/email/forgot_password.ejs`, { data: datas, Util: Util }, function (err, data) {
51
+ ejs.renderFile(path.join(dirRoot, 'views', 'layouts', 'email', 'forgot_password.ejs'), { data: datas, Util: Util }, function (err, data) {
51
52
  let option = Object.assign(mailOptions, options)
52
53
  option.html = data
53
54
  if (err) {
@@ -59,7 +60,7 @@ MAIL.forgotPassword = (datas = {}, options = {}) => {
59
60
  }
60
61
 
61
62
  MAIL.register = (datas = {}, options = {}) => {
62
- ejs.renderFile(`${dirRoot}/views/layouts/email/register.ejs`, { data: datas, Util: Util }, function (err, data) {
63
+ ejs.renderFile(path.join(dirRoot, 'views', 'layouts', 'email', 'register.ejs'), { data: datas, Util: Util }, function (err, data) {
63
64
  let option = Object.assign(mailOptions, options)
64
65
  option.html = data
65
66
  if (err) {
@@ -88,7 +89,7 @@ MAIL.approval = (req, res, data, email) => {
88
89
  });
89
90
 
90
91
  ejs.renderFile(
91
- dirRoot + "/views/layouts/email/approval.ejs",
92
+ path.join(dirRoot, 'views', 'layouts', 'email', 'approval.ejs'),
92
93
  { data: data, Util: Util },
93
94
  function (err, html) {
94
95
  if (err) {
package/lib/Model.js CHANGED
@@ -2394,7 +2394,8 @@ Model.relation = {
2394
2394
  "isSearch",
2395
2395
  "order_by",
2396
2396
  "import_field",
2397
- "relation_info"
2397
+ "relation_info",
2398
+ "isAttributes",
2398
2399
  ],
2399
2400
  labels: {
2400
2401
  required: "Required",
@@ -2413,7 +2414,8 @@ Model.relation = {
2413
2414
  isSearch:"Auto complete Search",
2414
2415
  order_by : "Order By",
2415
2416
  import_field :"Default Import Field (id)",
2416
- relation_info : "Relation Data"
2417
+ relation_info : "Relation Data",
2418
+ isAttributes:"Show all attributes data",
2417
2419
  },
2418
2420
  defaultValues: {
2419
2421
  required: false,
@@ -2423,6 +2425,7 @@ Model.relation = {
2423
2425
  name: "username",
2424
2426
  concat: "CONCAT(fullname, ' ',email)",
2425
2427
  where:"",
2428
+ isAttributes:false,
2426
2429
  isChain: false,
2427
2430
  onChange: "",
2428
2431
  information: "",
@@ -2463,6 +2466,10 @@ Model.relation = {
2463
2466
  tag: "input",
2464
2467
  type: "text",
2465
2468
  },
2469
+ isAttributes: {
2470
+ tag: "input",
2471
+ type: "checkbox",
2472
+ },
2466
2473
  isChain: {
2467
2474
  tag: "input",
2468
2475
  type: "checkbox",
@@ -34,7 +34,7 @@ generatorApp.CREATE_MODEL_API = async (columns, constraintList, MYMODEL) => {
34
34
  generatorApp.CREATE_ROUTER = async (MYMODEL, zFields) => {
35
35
  let CONTENT =
36
36
  zFields.router ||
37
- fs.readFileSync(generatorApp.DIRECTORY + "/routerApp.ejs", "utf-8");
37
+ fs.readFileSync(path.join(generatorApp.DIRECTORY, "routerApp.ejs"), "utf-8");
38
38
  const zfields = await connection.result({
39
39
  table: "zfields",
40
40
  where: { table: MYMODEL.table },
@@ -58,7 +58,7 @@ generatorApp.CREATE_ROUTER = async (MYMODEL, zFields) => {
58
58
  }
59
59
 
60
60
  fs.writeFileSync(
61
- generatorApp.DIRECTORY_ROUTES + "/" + MYMODEL.table + ".js",
61
+ path.join(generatorApp.DIRECTORY_ROUTES, MYMODEL.table + ".js"),
62
62
  CONTENT,
63
63
  "utf-8"
64
64
  );
@@ -67,7 +67,7 @@ generatorApp.CREATE_ROUTER = async (MYMODEL, zFields) => {
67
67
  generatorApp.CREATE_ROUTER_API = (MYMODEL, zfields) => {
68
68
  let CONTENT =
69
69
  zfields.router ||
70
- fs.readFileSync(generatorApp.DIRECTORY + "/routerApp.ejs", "utf-8");
70
+ fs.readFileSync(path.join(generatorApp.DIRECTORY, "routerApp.ejs"), "utf-8");
71
71
  //var zfields = await connection.result({table: "zfields", where: {table: MYMODEL.table}});
72
72
  const ADDITIONAL_FIELDS = generatorApp.ADDITIONAL_FIELDS(MYMODEL);
73
73
  const OBJ = {
@@ -86,7 +86,7 @@ generatorApp.CREATE_ROUTER_API = (MYMODEL, zfields) => {
86
86
  for (let KEY in OBJ) {
87
87
  CONTENT = Util.replaceAll(CONTENT, "[[[" + KEY + "]]]", OBJ[KEY]);
88
88
  }
89
- //fs.writeFileSync(generatorApp.DIRECTORY_ROUTES + "/" + MYMODEL.table + ".js", CONTENT, 'utf-8');
89
+ //fs.writeFileSync(path.join(generatorApp.DIRECTORY_ROUTES, MYMODEL.table + ".js"), CONTENT, 'utf-8');
90
90
  return {
91
91
  filename: MYMODEL.table + ".js",
92
92
  content: CONTENT,
@@ -123,7 +123,7 @@ generatorApp.CREATE_VIEWS = async (MYMODEL, zFields) => {
123
123
  "[[[GENERATE_VIEW]]]": GENERATE_VIEW,
124
124
  };
125
125
 
126
- const DIR_VIEW = generatorApp.DIRECTORY_VIEWS + "/" + MYMODEL.table;
126
+ const DIR_VIEW = path.join(generatorApp.DIRECTORY_VIEWS, MYMODEL.table);
127
127
  if (!fs.existsSync(DIR_VIEW)) {
128
128
  fs.mkdirSync(DIR_VIEW);
129
129
  }
@@ -133,16 +133,16 @@ generatorApp.CREATE_VIEWS = async (MYMODEL, zFields) => {
133
133
  name = name.replace(".", "_");
134
134
  let source = zFields[name];
135
135
  if (source) {
136
- fs.writeFileSync(DIR_VIEW + "/" + item, source);
136
+ fs.writeFileSync(path.join(DIR_VIEW, item), source);
137
137
  } else {
138
- source = generatorApp.DIRECTORY_GENERATOR_VIEWS + "/" + item;
139
- fs.copySync(source, DIR_VIEW + "/" + item);
138
+ source = path.join(generatorApp.DIRECTORY_GENERATOR_VIEWS, item);
139
+ fs.copySync(source, path.join(DIR_VIEW, item));
140
140
  }
141
- console.log(DIR_VIEW + "/" + item);
141
+ console.log(path.join(DIR_VIEW, item));
142
142
  for (let KEY in OBJ) {
143
143
  generatorApp.MODIFIY(
144
- DIR_VIEW + "/" + item,
145
- DIR_VIEW + "/" + item,
144
+ path.join(DIR_VIEW, item),
145
+ path.join(DIR_VIEW, item),
146
146
  KEY,
147
147
  OBJ[KEY]
148
148
  );
@@ -183,7 +183,7 @@ generatorApp.CREATE_VIEWS_API = (MYMODEL, zFields) => {
183
183
  "[[[GENERATE_VIEW]]]": GENERATE_VIEW,
184
184
  };
185
185
 
186
- const DIR_VIEW = `${dirRoot}/public/temp/${token}`;
186
+ const DIR_VIEW = path.join(dirRoot, "public", "temp", token);
187
187
  if (!fs.existsSync(DIR_VIEW)) {
188
188
  fs.mkdirSync(DIR_VIEW);
189
189
  }
@@ -194,23 +194,23 @@ generatorApp.CREATE_VIEWS_API = (MYMODEL, zFields) => {
194
194
  name = name.replace(".", "_");
195
195
  let source = zFields.hasOwnProperty(name)
196
196
  ? zFields[name]
197
- : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/" + item, {
197
+ : fs.readFileSync(path.join(generatorApp.DIRECTORY_GENERATOR_VIEWS, item), {
198
198
  encoding: "utf8",
199
199
  flag: "r",
200
200
  });
201
201
  if (source) {
202
- fs.writeFileSync(DIR_VIEW + "/" + item, source);
202
+ fs.writeFileSync(path.join(DIR_VIEW, item), source);
203
203
  } else {
204
204
  source = fs.readFileSync(
205
- generatorApp.DIRECTORY_GENERATOR_VIEWS + "/" + item,
205
+ path.join(generatorApp.DIRECTORY_GENERATOR_VIEWS, item),
206
206
  { encoding: "utf8", flag: "r" }
207
207
  );
208
- fs.copySync(source, DIR_VIEW + "/" + item);
208
+ fs.copySync(source, path.join(DIR_VIEW, item));
209
209
  }
210
210
  for (let KEY in OBJ) {
211
211
  generatorApp.MODIFIY(
212
- DIR_VIEW + "/" + item,
213
- DIR_VIEW + "/" + item,
212
+ path.join(DIR_VIEW, item),
213
+ path.join(DIR_VIEW, item),
214
214
  KEY,
215
215
  OBJ[KEY]
216
216
  );
@@ -218,7 +218,7 @@ generatorApp.CREATE_VIEWS_API = (MYMODEL, zFields) => {
218
218
  }
219
219
  for (let i = 0; i < views.length; i++) {
220
220
  const item = views[i];
221
- datas[item] = fs.readFileSync(`${DIR_VIEW}/${item}`, {
221
+ datas[item] = fs.readFileSync(path.join(DIR_VIEW, item), {
222
222
  encoding: "utf8",
223
223
  flag: "r",
224
224
  });
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Created by sintret dev on 10/1/2021.
3
3
  */
4
+ const path = require("path");
4
5
  const configGenerator = require("./config_generator");
5
6
  const Model = require("./Model");
6
7
  const fs = require("fs-extra");
@@ -285,6 +286,10 @@ me.prepare = (MYMODEL) => {
285
286
  widgets[key].inputGroupRight = property.values.inputGroupRight;
286
287
  widgets[key].hasInputGroup = true;
287
288
  }
289
+ widgets[key].isAttributes = false;
290
+ if (Object.prototype.hasOwnProperty.call(property.values,"isAttributes") && property.values.isAttributes) {
291
+ widgets[key].isAttributes = true;
292
+ }
288
293
  widgets[key].onChange = false;
289
294
  if (Object.prototype.hasOwnProperty.call(property.values,"onChange") && property.values.onChange.length > 4) {
290
295
  widgets[key].onChange = true;
@@ -393,22 +398,21 @@ me.prepare = (MYMODEL) => {
393
398
  widgets[key].relation_info = property.values.relation_info ? true : false;
394
399
  if(widgets[key].relation_info) {
395
400
  //create file info to runtime
396
- let dirInfo = `${dirRoot}/public/runtime/info/${MYMODEL.table}`
397
- //Util.writeFile(`${dirRoot}/runtime/info/${MYMODEL.tab}`)
401
+ let dirInfo = path.join(dirRoot, "public", "runtime", "info", MYMODEL.table);
402
+ //Util.writeFile(path.join(dirRoot, "runtime", "info", MYMODEL.tab))
398
403
  if(!fs.existsSync(dirInfo)) {
399
404
  fs.mkdirSync(dirInfo, { recursive: true });
400
405
  }
401
- fs.writeFileSync(`${dirInfo}/${key}.txt`, property.values.relation_info);
406
+ fs.writeFileSync(path.join(dirInfo, key + ".txt"), property.values.relation_info);
402
407
  }
403
- console.log(widgets[key].onChange)
404
408
  if(widgets[key].onChange) {
405
409
  //create file info to runtime
406
- let dirInfo = `${dirRoot}/public/runtime/onchange/${MYMODEL.table}`
407
- //Util.writeFile(`${dirRoot}/runtime/info/${MYMODEL.tab}`)
410
+ let dirInfo = path.join(dirRoot, "public", "runtime", "onchange", MYMODEL.table);
411
+ //Util.writeFile(path.join(dirRoot, "runtime", "info", MYMODEL.tab))
408
412
  if(!fs.existsSync(dirInfo)) {
409
413
  fs.mkdirSync(dirInfo, { recursive: true });
410
414
  }
411
- fs.writeFileSync(`${dirInfo}/${key}.txt`, property.values.onChange);
415
+ fs.writeFileSync(path.join(dirInfo, key + ".txt"), property.values.onChange);
412
416
  }
413
417
  break;
414
418
  case "dragdrop":
@@ -468,7 +472,16 @@ me.prepare = (MYMODEL) => {
468
472
  : property.values.height;
469
473
  break;
470
474
  case "html":
471
- widgets[key].code = property.values.code || "";
475
+ widgets[key].code = property.values.code ? true : false;
476
+ if(widgets[key].code) {
477
+ //create file info to runtime
478
+ let dirInfo = path.join(dirRoot, "public", "runtime", "html", MYMODEL.table);
479
+ //Util.writeFile(path.join(dirRoot, "runtime", "info", MYMODEL.tab))
480
+ if(!fs.existsSync(dirInfo)) {
481
+ fs.mkdirSync(dirInfo, { recursive: true });
482
+ }
483
+ fs.writeFileSync(path.join(dirInfo, key + ".txt"), property.values.code);
484
+ }
472
485
  break;
473
486
 
474
487
  case "money":
@@ -520,7 +533,7 @@ me.create = async (ZFIELDS) => {
520
533
  const JSON_MODEL = me.prepare(ZFIELDS);
521
534
  jsonText += me.build(JSON_MODEL);
522
535
  jsonText += `}`;
523
- const filename = `${dirRoot}/models/${ZFIELDS.table}.js`;
536
+ const filename = path.join(dirRoot, "models", ZFIELDS.table + ".js");
524
537
  fs.writeFile(filename, jsonText, function (err) {
525
538
  if (err) {
526
539
  return console.log(err.toString());
package/lib/io.js CHANGED
@@ -1,6 +1,5 @@
1
1
  const { Server } = require('socket.io');
2
- const io = new Server(); // TANPA listen/attach di sini
3
- //room = token
2
+ const io = new Server();
4
3
  let socketArray = [];
5
4
 
6
5
  io.on('connection', function (socket) {
@@ -11,26 +10,15 @@ io.on('connection', function (socket) {
11
10
  socket.handshake.session.user = {
12
11
  username: 'OSK'
13
12
  };
14
- //console.log('socket.handshake session data is %j.', socket.handshake.session);
15
-
16
- // socket.handshake.session.save();
17
- //emit logged_in for debugging purposes of this example
18
13
  socket.emit('logged_in', socket.handshake.session);
19
14
  });
20
15
  // Unset session data via socket
21
16
  socket.on('checksession', function() {
22
- // console.log('Received checksession message');
23
- // console.log('socket.handshake session data is %j.', socket.handshake.session);
24
17
  socket.emit('checksession', socket.handshake.session);
25
18
  });
26
- // Unset session data via socket
27
19
  socket.on('logout', function() {
28
20
  console.log('Received logout message');
29
21
  delete socket.handshake.session.user;
30
- // socket.handshake.session.save();
31
- //emit logged_out for debugging purposes of this example
32
- //console.log('socket.handshake session data is %j.', socket.handshake.session);
33
-
34
22
  socket.emit('logged_out', socket.handshake.session);
35
23
  });
36
24
 
package/lib/zAppRouter.js CHANGED
@@ -161,7 +161,7 @@ router.post("/profile-sign", access, async (req, res) => {
161
161
  },
162
162
  });
163
163
  fs.writeFile(
164
- dirRoot + "/public/uploads/zuser/" + filename,
164
+ path.join(dirRoot, "public", "uploads", "zuser", filename),
165
165
  base64Image,
166
166
  { encoding: "base64" },
167
167
  function (err) {}
@@ -1337,8 +1337,8 @@ router.post('/get_approval_comments', async(req,res) => {
1337
1337
 
1338
1338
  router.get("/zdownload/zgenerator/:table", async (req, res) => {
1339
1339
  var table = req.params.table;
1340
- var path = `${dirRoot}/public/uploads/zgenerator/${table}.json`;
1341
- res.download(path, function (err) {
1340
+ var filePath = path.join(dirRoot, "public", "uploads", "zgenerator", table + ".json");
1341
+ res.download(filePath, function (err) {
1342
1342
  if (err) {
1343
1343
  //console.log(err);
1344
1344
  }
@@ -1592,12 +1592,12 @@ router.post("/zdropzone", async (req, res) => {
1592
1592
  try {
1593
1593
  let userId = res.locals.userId;
1594
1594
  if (userId) {
1595
- let dir = `${dirRoot}/public/zdropzone/${userId}`;
1595
+ let dir = path.join(dirRoot, "public", "zdropzone", userId);
1596
1596
  if (!fs.existsSync(dir)) {
1597
1597
  fs.mkdirSync(dir, { recursive: true });
1598
1598
  }
1599
1599
  let filename = req.files.file.name;
1600
- req.files.file.mv(dir + "/" + filename, function (err) {
1600
+ req.files.file.mv(path.join(dir, filename), function (err) {
1601
1601
  if (err) {
1602
1602
  return res.status(500).send(err + "");
1603
1603
  }
@@ -1615,11 +1615,11 @@ router.post("/zdropzone-remove", async (req, res) => {
1615
1615
  try {
1616
1616
  let userId = res.locals.userId;
1617
1617
  let cacheName = req.body.cname.replace("ZUSER___ID", userId);
1618
- let dir = `${dirRoot}/public/zdropzone/${userId}`;
1618
+ let dir = path.join(dirRoot, "public", "zdropzone", userId);
1619
1619
  if (!fs.existsSync(dir)) {
1620
1620
  fs.mkdirSync(dir, { recursive: true });
1621
1621
  }
1622
- let filename = `${dirRoot}/public/zdropzone/${userId}/${req.body.file}`;
1622
+ let filename = path.join(dirRoot, "public", "zdropzone", userId, req.body.file);
1623
1623
  let arr = [];
1624
1624
  if (Util.fileExist(filename)) {
1625
1625
  await fs.unlink(filename);
@@ -1639,7 +1639,7 @@ router.post("/zdropzone-remove", async (req, res) => {
1639
1639
  router.post("/zdropzone-attributes", async (req, res) => {
1640
1640
  try {
1641
1641
  let userId = res.locals.userId;
1642
- let dir = `${dirRoot}/public/zdropzone/${userId}`;
1642
+ let dir = path.join(dirRoot, "public", "zdropzone", userId);
1643
1643
  if (!fs.existsSync(dir)) {
1644
1644
  fs.mkdirSync(dir, { recursive: true });
1645
1645
  }
@@ -1726,13 +1726,14 @@ router.get("/zdownloads-dropzone/:table/:field/:id", async (req, res) => {
1726
1726
  id: id,
1727
1727
  },
1728
1728
  });
1729
- let dir = `${dirRoot}/public/uploads/${table}/${field}/`;
1729
+ let dir = path.join(dirRoot, "public", "uploads", table, field);
1730
1730
  let arr = [];
1731
1731
  let files = result[field];
1732
1732
  for (const file of files) {
1733
- if (Util.fileExist(dir + file)) {
1733
+ let fullPath = path.join(dir, file);
1734
+ if (Util.fileExist(fullPath)) {
1734
1735
  let filename = file.substring(13);
1735
- arr.push({ path: dir + file, name: filename });
1736
+ arr.push({ path: fullPath, name: filename });
1736
1737
  //io.to(room).emit('message', `Zip file ${filename}`)
1737
1738
  }
1738
1739
  }
@@ -1792,14 +1793,14 @@ router.post("/zcompress-dropzone", async (req, res) => {
1792
1793
  if (!fs.existsSync(tempDir)) {
1793
1794
  fs.mkdirSync(tempDir);
1794
1795
  }
1795
- //let dir = `${dirRoot}/public/uploads/${table}/${field}/`;
1796
+ //let dir = path.join(dirRoot, "public", "uploads", table, field);
1796
1797
  let arr = [];
1797
1798
  let files = result[field];
1798
1799
  const count = files.length;
1799
1800
  let i = 0;
1800
1801
  for (const file of files) {
1801
1802
  let filename = file.substring(13);
1802
- let attributes = Util.fileAttribute(dir + file);
1803
+ let attributes = Util.fileAttribute(path.join(dir, file));
1803
1804
  if (attributes.type == "image") {
1804
1805
  const filePath = path.join(dir, file);
1805
1806
  const tempPath = path.join(tempDir, file);
@@ -2098,7 +2099,7 @@ router.get("/zdownloads-dropbox/:table/:field/:id", async (req, res) => {
2098
2099
  id: id,
2099
2100
  },
2100
2101
  });
2101
- let dir = `${dirRoot}/public/uploads/${table}/${field}/`;
2102
+ let dir = path.join(dirRoot, "public", "uploads", table, field);
2102
2103
  let arr = [];
2103
2104
  let files = result[field];
2104
2105
  const jsZip = new JSZip();
@@ -2273,7 +2274,7 @@ router.post('/zcall-information_info', async(req,res) => {
2273
2274
  let data = ''
2274
2275
  try {
2275
2276
  const {table, elementId, myvalue} = req.body;
2276
- let content = Util.readFile(`${dirRoot}/public/runtime/info/${table}/${elementId}.txt`)
2277
+ let content = Util.readFile(path.join(dirRoot, "public", "runtime", "info", table, elementId + ".txt"))
2277
2278
  data = content;
2278
2279
 
2279
2280
  // Fungsi untuk mengekstrak semua field dari template
@@ -47,7 +47,7 @@ const nots = [
47
47
  //const generatorUrl = "https://generator.cmsqu.com";
48
48
 
49
49
  const bodyView = Util.readFile(
50
- require.resolve(__dirname + "/views/generator.ejs")
50
+ require.resolve(path.join(__dirname, "views", "generator.ejs"))
51
51
  );
52
52
 
53
53
  router.get("/", csrfProtection, async (req, res) => {
@@ -136,14 +136,14 @@ router.get("/", csrfProtection, async (req, res) => {
136
136
 
137
137
  const bodyHTML = ejs.render(bodyView, renderData);
138
138
  const endHTML = ejs.render(
139
- Util.readFile(require.resolve(__dirname + "/views/generatorjs.ejs")),
139
+ Util.readFile(require.resolve(path.join(__dirname, "views", "generatorjs.ejs"))),
140
140
  renderData
141
141
  );
142
142
  let dataRender = renderData;
143
143
  dataRender.bodyHTML = bodyHTML;
144
144
  dataRender.endHTML = endHTML;
145
145
  res.render(
146
- require.resolve(__dirname + "/views/generator_layout.ejs"),
146
+ require.resolve(path.join(__dirname, "views", "generator_layout.ejs")),
147
147
  dataRender
148
148
  );
149
149
  });
@@ -342,7 +342,7 @@ router.post("/save_and_generate", csrfProtection, async (req, res) => {
342
342
  if (nots.includes(req.body.table)) {
343
343
  return res.json(Util.flashError("Table is locked"));
344
344
  }
345
- let dir = `${dirRoot}/public/temp`
345
+ let dir = path.join(dirRoot, "public", "temp");
346
346
  Util.dirExist(dir, true);
347
347
  //console.log(JSON.stringify(req.body))
348
348
  const json = await generate(req, res);
@@ -546,7 +546,7 @@ const generate = async (req, res) => {
546
546
  });
547
547
 
548
548
  fs.writeFileSync(
549
- `${dirRoot}/models/${filesKey.filename}`,
549
+ path.join(dirRoot, "models", filesKey.filename),
550
550
  filesKey.content
551
551
  );
552
552
  console.log(`The file model of ${filesKey.filename} is saved!`);
@@ -603,13 +603,13 @@ const generate = async (req, res) => {
603
603
  newModel += zRoute.buildFileModel(MYMODEL);
604
604
  newModel += `${Util.tab}};`;
605
605
 
606
- fs.writeFileSync(`${dirRoot}/models/${filesKey.filename}`, newModel);
606
+ fs.writeFileSync(path.join(dirRoot, "models", filesKey.filename), newModel);
607
607
  }
608
608
  //check model if it has select relation in concat
609
609
  await scanning(MYMODEL, result);
610
610
  }
611
611
  //generate views
612
- let DIR_VIEW = `${dirRoot}/views/${table}`;
612
+ let DIR_VIEW = path.join(dirRoot, "views", table);
613
613
  if (key == "views") {
614
614
  if (!fs.existsSync(DIR_VIEW)) {
615
615
  fs.mkdirSync(DIR_VIEW);
@@ -619,10 +619,10 @@ const generate = async (req, res) => {
619
619
  for (const q in filesKey) {
620
620
  console.log(q);
621
621
  if (Util.in_array(q, compilesJS)) {
622
- fs.writeFileSync(`${DIR_VIEW}/${q}`, filesKey[q]);
622
+ fs.writeFileSync(path.join(DIR_VIEW, q), filesKey[q]);
623
623
  } else {
624
624
  fs.writeFileSync(
625
- `${DIR_VIEW}/${q}`,
625
+ path.join(DIR_VIEW, q),
626
626
  await minify(filesKey[q], {
627
627
  minifyJS: true,
628
628
  minifyCSS: true,
@@ -637,7 +637,7 @@ const generate = async (req, res) => {
637
637
  if (!dummy) {
638
638
  if (key == "route") {
639
639
  fs.writeFileSync(
640
- `${dirRoot}/routes/${filesKey.filename}`,
640
+ path.join(dirRoot, "routes", filesKey.filename),
641
641
  filesKey.content
642
642
  );
643
643
  console.log(`The files route of ${filesKey.filename} is saved!`);
@@ -647,11 +647,11 @@ const generate = async (req, res) => {
647
647
 
648
648
  //make a directory
649
649
  if (!dummy) {
650
- let path_script = `${dirRoot}/public/runtime/script/${table}`;
650
+ let path_script = path.join(dirRoot, "public", "runtime", "script", table);
651
651
  Util.dirExist(path_script, true);
652
- let path_head = `${dirRoot}/public/runtime/head/${table}`;
652
+ let path_head = path.join(dirRoot, "public", "runtime", "head", table);
653
653
  Util.dirExist(path_head, true);
654
- let path_end = `${dirRoot}/public/runtime/end/${table}`;
654
+ let path_end = path.join(dirRoot, "public", "runtime", "end", table);
655
655
  Util.dirExist(path_end, true);
656
656
  //we need to generate javascript code into runtime
657
657
  let relations = await zRoute.relations(req, res, MYMODEL.table);
@@ -667,9 +667,9 @@ const generate = async (req, res) => {
667
667
  Util.deleteAllFiles(path_script);
668
668
  Util.deleteAllFiles(path_head);
669
669
  Util.deleteAllFiles(path_end);
670
- Util.writeFile(`${path_script}/${time}.js`, script.code);
671
- Util.writeFile(`${path_head}/head.txt`, jsObj.head);
672
- Util.writeFile(`${path_end}/end.txt`, jsObj.end);
670
+ Util.writeFile(path.join(path_script, `${time}.js`), script.code);
671
+ Util.writeFile(path.join(path_head, "head.txt"), jsObj.head);
672
+ Util.writeFile(path.join(path_end, "end.txt"), jsObj.end);
673
673
  }
674
674
 
675
675
  //restart pm2 module in production
@@ -784,7 +784,7 @@ const buildJoin = async (MYMODEL, result) => {
784
784
  if (result.joins && Object.keys(joins).length > 0) {
785
785
  let newDataObj = {};
786
786
  for (let key in joins) {
787
- let THEIR_MODEL = require(`${dirRoot}/models/${key}`);
787
+ let THEIR_MODEL = require(path.join(dirRoot, "models", key));
788
788
  //console.log(THEIR_MODEL)
789
789
  let arr = joins[key] || [];
790
790
  table_joins.push(key);
@@ -932,7 +932,7 @@ router.delete("/delete-table", csrfProtection, async (req, res) => {
932
932
  //await connection.query("DELETE FROM zfields WHERE `table` = ?", [table]);
933
933
  await connection.query(`DROP table "${table}";`);
934
934
  //delete file
935
- let modelFile = dirRoot + "/models/" + table + ".js";
935
+ let modelFile = path.join(dirRoot, "models", table + ".js");
936
936
  fs.stat(modelFile, function (err, stats) {
937
937
  console.log(stats); //here we got all information of file in stats variable
938
938
  if (err) {
@@ -945,7 +945,7 @@ router.delete("/delete-table", csrfProtection, async (req, res) => {
945
945
  }
946
946
  });
947
947
 
948
- let routesFile = dirRoot + "/routes/" + table + ".js";
948
+ let routesFile = path.join(dirRoot, "routes", table + ".js");
949
949
  fs.stat(routesFile, function (err, stats) {
950
950
  console.log(stats); //here we got all information of file in stats variable
951
951
  if (err) {
@@ -958,7 +958,7 @@ router.delete("/delete-table", csrfProtection, async (req, res) => {
958
958
  }
959
959
  });
960
960
 
961
- let runtimeFile = dirRoot + "/public/runtime/script/" + table;
961
+ let runtimeFile = path.join(dirRoot, "public", "runtime", "script", table);
962
962
  fs.rm(
963
963
  runtimeFile,
964
964
  {
@@ -972,7 +972,7 @@ router.delete("/delete-table", csrfProtection, async (req, res) => {
972
972
  }
973
973
  }
974
974
  );
975
- let runtimeFileHead = dirRoot + "/public/runtime/head/" + table;
975
+ let runtimeFileHead = path.join(dirRoot, "public", "runtime", "head", table);
976
976
  fs.rm(
977
977
  runtimeFileHead,
978
978
  {
@@ -986,7 +986,7 @@ router.delete("/delete-table", csrfProtection, async (req, res) => {
986
986
  }
987
987
  }
988
988
  );
989
- let runtimeFileEnd = dirRoot + "/public/runtime/end/" + table;
989
+ let runtimeFileEnd = path.join(dirRoot, "public", "runtime", "end", table);
990
990
  fs.rm(
991
991
  runtimeFileEnd,
992
992
  {
@@ -1006,7 +1006,7 @@ router.delete("/delete-table", csrfProtection, async (req, res) => {
1006
1006
  where: { route_name: table },
1007
1007
  });
1008
1008
  if (table) {
1009
- const viewsFile = dirRoot + "/views/" + table;
1009
+ const viewsFile = path.join(dirRoot, "views", table);
1010
1010
  fs.rm(
1011
1011
  viewsFile,
1012
1012
  {
@@ -1414,12 +1414,12 @@ router.post("/export", async (req, res) => {
1414
1414
  table: table,
1415
1415
  },
1416
1416
  });
1417
- const dir = `${dirRoot}/public/uploads/zgenerator`;
1417
+ const dir = path.join(dirRoot, "public", "uploads", "zgenerator");
1418
1418
  if (!fs.existsSync(dir)) {
1419
1419
  fs.mkdirSync(dir);
1420
1420
  }
1421
1421
  const text = JSON.stringify(result);
1422
- fs.writeFileSync(`${dir}/${table}.json`, text);
1422
+ fs.writeFileSync(path.join(dir, table + ".json"), text);
1423
1423
  } else {
1424
1424
  json = Util.flashError("no table selected");
1425
1425
  }
@@ -1495,7 +1495,7 @@ router.post("/import", async (req, res) => {
1495
1495
  Scanning relation id to name
1496
1496
  */
1497
1497
  const scanning = async (MYMODEL, result) => {
1498
- //let MYMODEL = require(`${dirRoot}/models/${table}`);
1498
+ //let MYMODEL = require(path.join(dirRoot, "models", table));
1499
1499
  let table = MYMODEL.table;
1500
1500
  const widgets = MYMODEL.widgets;
1501
1501
  const not_scanning = ["created_by", "updated_by"];
@@ -1511,7 +1511,7 @@ const scanning = async (MYMODEL, result) => {
1511
1511
  if (arr.length) {
1512
1512
  let str = Util.replaceAll(arr[0], '"', '')
1513
1513
  let mysplits = str.indexOf(',') > -1 ? str.split(',') : [str]
1514
- let MYMODEL_TABLE = require(`${dirRoot}/models/${widgets[key].table}`)
1514
+ let MYMODEL_TABLE = require(path.join(dirRoot, "models", widgets[key].table))
1515
1515
  let widgetsRelations = MYMODEL_TABLE.widgets
1516
1516
  let relationsKeys = []
1517
1517
  let relationsKeysObject = {}
@@ -1546,7 +1546,7 @@ const scanning = async (MYMODEL, result) => {
1546
1546
  newModel += zRoute.buildFileModel(MYMODEL);
1547
1547
  newModel += `${Util.newLine}`;
1548
1548
  newModel += `}`;
1549
- fs.writeFileSync(`${dirRoot}/models/${MYMODEL.table}.js`, newModel);
1549
+ fs.writeFileSync(path.join(dirRoot, "models", MYMODEL.table + ".js"), newModel);
1550
1550
  }
1551
1551
 
1552
1552
  //check if has join
@@ -1559,7 +1559,7 @@ const scanning = async (MYMODEL, result) => {
1559
1559
  newModel += zRoute.buildFileModel(MYMODEL);
1560
1560
  newModel += `${Util.newLine}`;
1561
1561
  newModel += `}`;
1562
- fs.writeFileSync(`${dirRoot}/models/${MYMODEL.table}.js`, newModel);
1562
+ fs.writeFileSync(path.join(dirRoot, "models", MYMODEL.table + ".js"), newModel);
1563
1563
  //return MYMODEL;
1564
1564
  };
1565
1565
 
@@ -1572,11 +1572,11 @@ router.post("/generate-assets", async (req, res) => {
1572
1572
  for (let key in MYMODELS) {
1573
1573
  let MYMODEL = MYMODELS[key];
1574
1574
  let table = MYMODEL.table;
1575
- let path_script = `${dirRoot}/public/runtime/script/${table}`;
1575
+ let path_script = path.join(dirRoot, "public", "runtime", "script", table);
1576
1576
  Util.dirExist(path_script, true);
1577
- let path_head = `${dirRoot}/public/runtime/head/${table}`;
1577
+ let path_head = path.join(dirRoot, "public", "runtime", "head", table);
1578
1578
  Util.dirExist(path_head, true);
1579
- let path_end = `${dirRoot}/public/runtime/end/${table}`;
1579
+ let path_end = path.join(dirRoot, "public", "runtime", "end", table);
1580
1580
  Util.dirExist(path_end, true);
1581
1581
  //we need to generate javascript code into runtime
1582
1582
  let relations = await zRoute.relations(req, res, MYMODEL.table);
@@ -1590,9 +1590,9 @@ router.post("/generate-assets", async (req, res) => {
1590
1590
  //minify script
1591
1591
  let script = uglifyJS.minify(jsObj.script);
1592
1592
  if (script.error) throw script.error;
1593
- Util.writeFile(`${path_script}/${time}.js`, script.code);
1594
- Util.writeFile(`${path_head}/head.txt`, jsObj.head);
1595
- Util.writeFile(`${path_end}/end.txt`, jsObj.end);
1593
+ Util.writeFile(path.join(path_script, `${time}.js`), script.code);
1594
+ Util.writeFile(path.join(path_head, "head.txt"), jsObj.head);
1595
+ Util.writeFile(path.join(path_end, "end.txt"), jsObj.end);
1596
1596
  }
1597
1597
  } catch (e) {
1598
1598
  notifObj = Util.flashError(e.toString());
@@ -1613,8 +1613,8 @@ router.post("/minify", async (req, res) => {
1613
1613
 
1614
1614
  const viewsMini = async () => {
1615
1615
  let notifyObj = Util.jsonSuccess("Success");
1616
- const viewDir = `${dirRoot}/views`;
1617
- const layoutsDir = `${dirRoot}/views/layouts`;
1616
+ const viewDir = path.join(dirRoot, "views");
1617
+ const layoutsDir = path.join(dirRoot, "views", "layouts");
1618
1618
  let item;
1619
1619
  try {
1620
1620
  let views = Util.getAllFiles(viewDir);
@@ -1627,11 +1627,11 @@ const viewsMini = async () => {
1627
1627
  for (const dir of views) {
1628
1628
  console.log("dir :", dir);
1629
1629
  if (!Util.in_array(dir, notViewDir)) {
1630
- let files = Util.getAllFiles(`${viewDir}/${dir}`);
1630
+ let files = Util.getAllFiles(path.join(viewDir, dir));
1631
1631
  //console.log(files);
1632
1632
  for (item of files) {
1633
1633
  if (item.includes(".ejs")) {
1634
- let filename = `${viewDir}/${dir}/${item}`;
1634
+ let filename = path.join(viewDir, dir, item);
1635
1635
  let content = Util.readFile(filename);
1636
1636
  let contentChange = await minify(content, options);
1637
1637
  fs.writeFileSync(filename, contentChange);
@@ -1643,7 +1643,7 @@ const viewsMini = async () => {
1643
1643
  let layouts = Util.getAllFiles(layoutsDir);
1644
1644
  for (item of layouts) {
1645
1645
  if (item.includes(".ejs")) {
1646
- let filename = `${layoutsDir}//${item}`;
1646
+ let filename = path.join(layoutsDir, item);
1647
1647
  let content = Util.readFile(filename);
1648
1648
  let contentChange = await minify(content, options);
1649
1649
  fs.writeFileSync(filename, contentChange);
@@ -1,4 +1,5 @@
1
1
  const express = require('express');
2
+ const path = require('path');
2
3
  const router = express.Router();
3
4
  const csrf = require('./csrf');
4
5
  const csrfProtection = csrf({cookie: true});
@@ -19,7 +20,7 @@ if (typeof global.dirRoot === 'undefined') {
19
20
  icons list for tabler and set to /public/js
20
21
  */
21
22
  const iconList = () => {
22
- const dir = `${dirRoot}/public/assets/icons`;
23
+ const dir = path.join(dirRoot, 'public', 'assets', 'icons');
23
24
  const icons = fs.readdirSync(dir);
24
25
  return icons;
25
26
  };
package/lib/zPage.js CHANGED
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * For dynamic router
3
3
  */
4
+ const path = require('path');
4
5
  const axios = require('axios');
5
6
  const fs = require('fs-extra');
6
7
  const nodemailer = require('nodemailer');
@@ -35,7 +36,7 @@ zpage.build = async (req, res) => {
35
36
  });
36
37
  server_code += `module.exports = router;`;
37
38
 
38
- fs.writeFileSync(dirRoot + "/routes/zindex.js", server_code, 'utf-8');
39
+ fs.writeFileSync(path.join(dirRoot, "routes", "zindex.js"), server_code, 'utf-8');
39
40
  if (process.env.NODE_ENV === "production") {
40
41
  setTimeout(function () {
41
42
  pm2.connect(function (err) {
@@ -65,7 +66,7 @@ const { connection, Util, io, zCache, myCache, zDebug, zDataTable, moduleLib, zF
65
66
  zpage.createRoute = (obj, token, layoutObj) => {
66
67
  const MYMODELS = myCache.get('MYMODELS');
67
68
  const MYMODEL = MYMODELS.zpage;
68
- let DIR = dirRoot + "/views/zindex";
69
+ let DIR = path.join(dirRoot, "views", "zindex");
69
70
  let METHOD = MYMODEL.widgets.method.fields;
70
71
  let layout = "new-blank.ejs";
71
72
  if (obj.layouts == 2) {
@@ -92,10 +93,10 @@ zpage.createRoute = (obj, token, layoutObj) => {
92
93
  let render = "";
93
94
  let renderData = "";
94
95
  if (obj.head) {
95
- fs.writeFileSync(`${DIR}/page${obj.id}-head.ejs`, obj.head, 'utf-8');
96
+ fs.writeFileSync(path.join(DIR, `page${obj.id}-head.ejs`), obj.head, 'utf-8');
96
97
  renderData += `renderData.renderHead = "zindex/page${obj.id}-head.ejs"; `
97
98
  } else {
98
- fs.unlink(`${DIR}/page${obj.id}-head.ejs`, function (err) {
99
+ fs.unlink(path.join(DIR, `page${obj.id}-head.ejs`), function (err) {
99
100
  if (err) return console.log(err);
100
101
  console.log('file deleted successfully');
101
102
  });
@@ -103,26 +104,26 @@ zpage.createRoute = (obj, token, layoutObj) => {
103
104
 
104
105
  let isrenderPage = false;
105
106
  if (obj.client_code) {
106
- fs.writeFileSync(`${DIR}/page${obj.id}.ejs`, obj.client_code, 'utf-8');
107
+ fs.writeFileSync(path.join(DIR, `page${obj.id}.ejs`), obj.client_code, 'utf-8');
107
108
  renderData += `renderData.renderBody = "zindex/page${obj.id}.ejs"; `
108
109
  isrenderPage = true;
109
110
  } else {
110
- fs.unlink(`${DIR}/page${obj.id}.ejs`, function (err) {
111
+ fs.unlink(path.join(DIR, `page${obj.id}.ejs`), function (err) {
111
112
  if (err) return console.log(err);
112
113
  console.log('file deleted successfully');
113
114
  });
114
115
  }
115
116
  //optional
116
117
  if(!isrenderPage && obj.method == 1) {
117
- fs.writeFileSync(`${DIR}/page${obj.id}.ejs`, obj.client_code, 'utf-8');
118
+ fs.writeFileSync(path.join(DIR, `page${obj.id}.ejs`), obj.client_code, 'utf-8');
118
119
  renderData += `renderData.renderBody = "zindex/page${obj.id}.ejs"; `
119
120
  }
120
121
  //end optional
121
122
  if (obj.scripts) {
122
- fs.writeFileSync(`${DIR}/page${obj.id}-script.ejs`, obj.scripts, 'utf-8');
123
+ fs.writeFileSync(path.join(DIR, `page${obj.id}-script.ejs`), obj.scripts, 'utf-8');
123
124
  renderData += `renderData.renderEnd = "zindex/page${obj.id}-script.ejs"; `
124
125
  } else {
125
- fs.unlink(`${DIR}/page${obj.id}-script.ejs`, function (err) {
126
+ fs.unlink(path.join(DIR, `page${obj.id}-script.ejs`), function (err) {
126
127
  if (err) return console.log(err);
127
128
  console.log('file deleted successfully');
128
129
  });
@@ -162,8 +163,8 @@ zpage.buildLayout = async (obj) => {
162
163
  minifyCSS:true,
163
164
  collapseWhitespace: true
164
165
  });
165
- console.log(dirRoot + "/views/layouts/" + name + ".ejs");
166
- fs.writeFileSync(dirRoot + "/views/layouts/" + name + ".ejs", html, 'utf-8');
166
+ console.log(path.join(dirRoot, "views", "layouts", name + ".ejs"));
167
+ fs.writeFileSync(path.join(dirRoot, "views", "layouts", name + ".ejs"), html, 'utf-8');
167
168
  if (process.env.NODE_ENV === "production") {
168
169
  setTimeout(function () {
169
170
  pm2.connect(function (err) {
@@ -181,8 +182,8 @@ zpage.buildLayout = async (obj) => {
181
182
 
182
183
  zpage.layoutDelete = async (obj) => {
183
184
  let name = Util.toName(obj.name);
184
- let path = dirRoot + "/views/layouts/customs/" + name + ".ejs"
185
- fs.unlink(path, function (err) {
185
+ let filePath = path.join(dirRoot, "views", "layouts", "customs", name + ".ejs");
186
+ fs.unlink(filePath, function (err) {
186
187
  if (err) return console.log(err);
187
188
  console.log('file deleted successfully');
188
189
  });
package/lib/zRoute.js CHANGED
@@ -3,6 +3,7 @@
3
3
  * service for routes
4
4
  */
5
5
  require("dotenv").config();
6
+ const path = require("path");
6
7
  const excelToJson = require("convert-excel-to-json");
7
8
  const qs = require("qs");
8
9
  //for generate PDF
@@ -34,11 +35,11 @@ zRoute.tableHasNoCompanyId = ["zcompany", "zrole", "zgrid"];
34
35
  //get all models
35
36
  zRoute.MYMODELS = () => {
36
37
  let obj = {};
37
- const dir = `${dirRoot}/models`;
38
+ const dir = path.join(dirRoot, "models");
38
39
  let models = Util.getAllFiles(dir);
39
40
  for (const item of models) {
40
41
  let name = item.replace(".js", "");
41
- obj[name] = require(`${dir}/${name}`);
42
+ obj[name] = require(path.join(dir, name));
42
43
  }
43
44
  return obj;
44
45
  };
@@ -46,7 +47,7 @@ zRoute.MYMODELS = () => {
46
47
  //get all routes
47
48
  zRoute.ROUTES = () => {
48
49
  let arr = [];
49
- const dir = `${dirRoot}/routes`;
50
+ const dir = path.join(dirRoot, "routes");
50
51
  let routes = Util.getAllFiles(dir);
51
52
  let nots = ["index", "zindex", "auth"];
52
53
  for (const item of routes) {
@@ -66,7 +67,7 @@ zRoute.renderHTML = (datas) => {
66
67
  if (myCache.has(renderBody)) {
67
68
  bodyHTML = myCache.get(renderBody);
68
69
  } else {
69
- bodyHTML = Util.readFile(`${dirRoot}/views/${datas.renderBody}`);
70
+ bodyHTML = Util.readFile(path.join(dirRoot, "views", datas.renderBody));
70
71
  myCache.set(renderBody, bodyHTML);
71
72
  }
72
73
  delete datas.renderBody;
@@ -76,7 +77,7 @@ zRoute.renderHTML = (datas) => {
76
77
  if (myCache.has(renderEnd)) {
77
78
  endHTML = myCache.get(renderEnd);
78
79
  } else {
79
- endHTML = Util.readFile(`${dirRoot}/views/${datas.renderEnd}`);
80
+ endHTML = Util.readFile(path.join(dirRoot, "views", datas.renderEnd));
80
81
  myCache.set(renderEnd, endHTML);
81
82
  }
82
83
  delete datas.renderEnd;
@@ -120,7 +121,7 @@ zRoute.post = (req, res, MYMODEL, routeName, body) => {
120
121
  let post = qs.parse(body);
121
122
  let isEmptyFiles = Util.isEmptyObject(req.files);
122
123
  let time = new Date().getTime();
123
- let path_tmp = dirRoot + "/public/uploads/" + routeName + "/";
124
+ let path_tmp = path.join(dirRoot, "public", "uploads", routeName);
124
125
  let hasFile = false;
125
126
  let files;
126
127
  let checkboxes = [];
@@ -137,11 +138,11 @@ zRoute.post = (req, res, MYMODEL, routeName, body) => {
137
138
  if (Array.isArray(fileRoute[key])) {
138
139
  hasFile = true;
139
140
  //add folder again
140
- fs.ensureDir(path_tmp + key, (err) => {
141
+ fs.ensureDir(path.join(path_tmp, key), (err) => {
141
142
  //console.log('ensureDir',err); // => null
142
143
  });
143
144
  } else {
144
- fileRoute[key].mv(path_tmp + filename, function (err) {
145
+ fileRoute[key].mv(path.join(path_tmp, filename), function (err) {
145
146
  if (err) {
146
147
  //console.log('fileempty move',err); // => null
147
148
  return res.status(500).send(err);
@@ -259,7 +260,7 @@ zRoute.post = (req, res, MYMODEL, routeName, body) => {
259
260
  req.files[fileImageName].name;
260
261
  item[k] = kname;
261
262
  req.files[fileImageName].mv(
262
- path_tmp + key + "/" + kname,
263
+ path.join(path_tmp, key, kname),
263
264
  function (err) {
264
265
  if (err) {
265
266
  return res.status(500).send(err);
@@ -1730,7 +1731,7 @@ zRoute.excelQuery = async (req, res, MYMODEL, paramsObject = {}) => {
1730
1731
  }
1731
1732
  }
1732
1733
  //check directory for import not export
1733
- const dir = `${dirRoot}/public/excel/tmp`;
1734
+ const dir = path.join(dirRoot, "public", "excel", "tmp");
1734
1735
  if (!fs.existsSync(dir)) {
1735
1736
  fs.mkdirSync(dir);
1736
1737
  }
@@ -2372,7 +2373,7 @@ zRoute.generatePDF = async (file, layout = "pdf_bootstrap", options = {}) => {
2372
2373
  puppeterOptions.defaultViewport = { width: 1920, height: 1080 };
2373
2374
  const browser = await puppeteer.launch(puppeterOptions);
2374
2375
  const page = await browser.newPage();
2375
- let mylayout = `${dirRoot}/views/layouts/${layout}.ejs`;
2376
+ let mylayout = path.join(dirRoot, "views", "layouts", layout + ".ejs");
2376
2377
  if (file.content) {
2377
2378
  const html = await ejs.renderFile(
2378
2379
  mylayout,
@@ -2390,7 +2391,7 @@ zRoute.generatePDF = async (file, layout = "pdf_bootstrap", options = {}) => {
2390
2391
  });
2391
2392
  }
2392
2393
  let fileName = new Date().getTime() + ".pdf";
2393
- const filePath = `${dirRoot}/public/_pdf/${fileName}`;
2394
+ const filePath = path.join(dirRoot, "public", "_pdf", fileName);
2394
2395
  const myoptions = {
2395
2396
  path: filePath,
2396
2397
  format: "A4",
@@ -3183,7 +3184,7 @@ zRoute.forms = (
3183
3184
  dropfiles = [obj.value];
3184
3185
  }
3185
3186
  dropfiles.map((item) => {
3186
- let filename = `${dirRoot}/public/uploads/${MYMODEL.table}/${key}/${item}`;
3187
+ let filename = path.join(dirRoot, "public", "uploads", MYMODEL.table, key, item);
3187
3188
  var fileSizeInBytes = 12345;
3188
3189
  if (Util.fileExist(filename)) {
3189
3190
  var stats = fs.statSync(filename);
@@ -3215,7 +3216,7 @@ zRoute.forms = (
3215
3216
  dropfiles = [obj.value];
3216
3217
  }
3217
3218
  dropfiles.map((item) => {
3218
- let filename = item; //`${dirRoot}/public/uploads/${MYMODEL.table}/${key}/${item}`;
3219
+ let filename = item; //path.join(dirRoot, "public", "uploads", MYMODEL.table, key, item);
3219
3220
  var fileSizeInBytes = 12345;
3220
3221
  if (Util.fileExist(filename)) {
3221
3222
  var stats = fs.statSync(filename);
@@ -4058,11 +4059,11 @@ zRoute.moduleLib = (req, res, MYMODEL, relations, zForms = "", data = {}) => {
4058
4059
  //check a file in directory
4059
4060
  //make a directory
4060
4061
  let table = MYMODEL.table;
4061
- let path_script = `${dirRoot}/public/runtime/script/${table}`;
4062
+ let path_script = path.join(dirRoot, "public", "runtime", "script", table);
4062
4063
  Util.dirExist(path_script, true);
4063
- let path_head = `${dirRoot}/public/runtime/head/${table}`;
4064
+ let path_head = path.join(dirRoot, "public", "runtime", "head", table);
4064
4065
  Util.dirExist(path_head, true);
4065
- let path_end = `${dirRoot}/public/runtime/end/${table}`;
4066
+ let path_end = path.join(dirRoot, "public", "runtime", "end", table);
4066
4067
  Util.dirExist(path_end, true);
4067
4068
  let files = Util.getAllFiles(path_script);
4068
4069
  let head = res.locals.moduleHead;
@@ -4071,10 +4072,10 @@ zRoute.moduleLib = (req, res, MYMODEL, relations, zForms = "", data = {}) => {
4071
4072
  let head_files = Util.getAllFiles(path_head);
4072
4073
  let end_files = Util.getAllFiles(path_end);
4073
4074
  if (head_files.length) {
4074
- head += Util.readFile(`${path_head}/head.txt`);
4075
+ head += Util.readFile(path.join(path_head, "head.txt"));
4075
4076
  }
4076
4077
  if (end_files.length) {
4077
- end += Util.readFile(`${path_end}/end.txt`);
4078
+ end += Util.readFile(path.join(path_end, "end.txt"));
4078
4079
  }
4079
4080
  end += `<script src="/runtime/script/${table}/${files[0]}"></script>`;
4080
4081
  } else {
@@ -4083,9 +4084,9 @@ zRoute.moduleLib = (req, res, MYMODEL, relations, zForms = "", data = {}) => {
4083
4084
  Util.deleteAllFiles(path_head);
4084
4085
  Util.deleteAllFiles(path_end);
4085
4086
  //minify js
4086
- Util.writeFile(`${path_script}/${time}.js`, uglifyJS.minify(jsObj.script));
4087
- Util.writeFile(`${path_head}/head.txt`, jsObj.head);
4088
- Util.writeFile(`${path_end}/end.txt`, jsObj.end);
4087
+ Util.writeFile(path.join(path_script, `${time}.js`), uglifyJS.minify(jsObj.script));
4088
+ Util.writeFile(path.join(path_head, "head.txt"), jsObj.head);
4089
+ Util.writeFile(path.join(path_end, "end.txt"), jsObj.end);
4089
4090
  end += `<script src="/runtime/script/${table}/${time}.js"></script>`;
4090
4091
  if (jsObj.head) {
4091
4092
  head += jsObj.head;
@@ -4104,7 +4105,7 @@ zRoute.moduleLib = (req, res, MYMODEL, relations, zForms = "", data = {}) => {
4104
4105
  let scriptTemp = "";
4105
4106
  for (let keys in MYMODEL.widgets) {
4106
4107
  if (MYMODEL.widgets[keys].name == "table") {
4107
- let MODEL_TABLE = require(`${dirRoot}/models/${MYMODEL.widgets[keys].table}`);
4108
+ let MODEL_TABLE = require(path.join(dirRoot, "models", MYMODEL.widgets[keys].table));
4108
4109
  for (let key in MODEL_TABLE.widgets) {
4109
4110
  if (MODEL_TABLE.widgets[key].name == "dropdown_multi") {
4110
4111
  let relObject = relations[keys + "Row"][key + "Object"];
@@ -4735,7 +4736,7 @@ zRoute.generateJS = (req, res, MYMODEL, relations, zForms = "", data = {}) => {
4735
4736
  case "table":
4736
4737
  let MODEL_TABLE =
4737
4738
  MYMODELS[MYMODEL.widgets[keys].table] ||
4738
- require(`${dirRoot}/models/${MYMODEL.widgets[keys].table}`);
4739
+ require(path.join(dirRoot, "models", MYMODEL.widgets[keys].table));
4739
4740
  //let MODEL_TABLE_RELATIONS = await zRoute.relations(req, res, MODEL_TABLE.table);
4740
4741
  //relations[key + "TABLE"]
4741
4742
  let RELATIONS_MODEL_TABLE =
@@ -4934,7 +4935,7 @@ $("#body-${keys}>tr").each(function (index, tr) {
4934
4935
  $(function(){`
4935
4936
  onChanges.forEach(function (item) {
4936
4937
  let tableItem = MYMODEL.widgets[item].table;
4937
- let dirContent = `${dirRoot}/public/runtime/onchange/${MYMODEL.table}/${item}.txt`;
4938
+ let dirContent = path.join(dirRoot, "public", "runtime", "onchange", MYMODEL.table, item + ".txt");
4938
4939
  let contentAjax = Util.readFile(dirContent);
4939
4940
  scriptForm += `
4940
4941
  $("#${item}").on("change", function() {
@@ -4997,9 +4998,8 @@ zRoute.insertSQL = async (req, res, table, data) => {
4997
4998
  for (let key in MYMODEL.widgets) {
4998
4999
  if (MYMODEL.widgets[key].name === "dropzone") {
4999
5000
  //console.log('has dropzone')
5000
- let path_src = dirRoot + "/public/zdropzone/" + userId + "/";
5001
- let path_dest =
5002
- dirRoot + "/public/uploads/" + MYMODEL.routeName + "/" + key + "/";
5001
+ let path_src = path.join(dirRoot, "public", "zdropzone", userId);
5002
+ let path_dest = path.join(dirRoot, "public", "uploads", MYMODEL.routeName, key);
5003
5003
  if (!fs.existsSync(path_dest)) {
5004
5004
  fs.mkdirSync(path_dest, { recursive: true });
5005
5005
  }
@@ -5010,10 +5010,11 @@ zRoute.insertSQL = async (req, res, table, data) => {
5010
5010
  if (arr.length > 0) {
5011
5011
  let time = new Date().getTime();
5012
5012
  arr.map((item) => {
5013
- if (Util.fileExist(path_src + item)) {
5013
+ let srcFile = path.join(path_src, item);
5014
+ if (Util.fileExist(srcFile)) {
5014
5015
  let newItem = Util.cleanString(time + item);
5015
5016
  newArr.push(newItem);
5016
- fs.rename(path_src + item, path_dest + newItem);
5017
+ fs.rename(srcFile, path.join(path_dest, newItem));
5017
5018
  }
5018
5019
  });
5019
5020
  data[key] = Util.array_to_jsonb(newArr);
@@ -5160,9 +5161,8 @@ zRoute.updateSQL = async (req, res, table, data, whereData) => {
5160
5161
  }
5161
5162
  if (MYMODEL.widgets[key].name === "dropzone") {
5162
5163
  //console.log('has dropzone')
5163
- let path_src = dirRoot + "/public/zdropzone/" + userId + "/";
5164
- let path_dest =
5165
- dirRoot + "/public/uploads/" + MYMODEL.table + "/" + key + "/";
5164
+ let path_src = path.join(dirRoot, "public", "zdropzone", userId);
5165
+ let path_dest = path.join(dirRoot, "public", "uploads", MYMODEL.table, key);
5166
5166
  if (!fs.existsSync(path_dest)) {
5167
5167
  fs.mkdirSync(path_dest, { recursive: true });
5168
5168
  }
@@ -5172,11 +5172,13 @@ zRoute.updateSQL = async (req, res, table, data, whereData) => {
5172
5172
  let newArr = [];
5173
5173
  let time = new Date().getTime();
5174
5174
  arr.map((item) => {
5175
- if (!Util.fileExist(path_dest + item)) {
5175
+ let destFile = path.join(path_dest, item);
5176
+ if (!Util.fileExist(destFile)) {
5176
5177
  let newItem = time + item;
5177
5178
  newArr.push(newItem);
5178
- if (Util.fileExist(path_src + item)) {
5179
- fs.rename(path_src + item, path_dest + newItem);
5179
+ let srcFile = path.join(path_src, item);
5180
+ if (Util.fileExist(srcFile)) {
5181
+ fs.rename(srcFile, path.join(path_dest, newItem));
5180
5182
  }
5181
5183
  } else {
5182
5184
  newArr.push(item);
@@ -5383,16 +5385,16 @@ zRoute.deleteFiles = async (table, result) => {
5383
5385
  for (let key in widgets) {
5384
5386
  if (widgets[key].name == "dropzone") {
5385
5387
  if (result[key]) {
5386
- let dir = `${dirRoot}/public/uploads/${table}/${key}/`;
5388
+ let dir = path.join(dirRoot, "public", "uploads", table, key);
5387
5389
  result[key].map((item) => {
5388
- fs.remove(dir + item, () => {});
5390
+ fs.remove(path.join(dir, item), () => {});
5389
5391
  });
5390
5392
  }
5391
5393
  }
5392
5394
  if (widgets[key].name == "image" || widgets[key].name == "file") {
5393
5395
  if (result[key]) {
5394
- let dir = `${dirRoot}/public/uploads/${table}/`;
5395
- fs.remove(dir + result[key], () => {});
5396
+ let dir = path.join(dirRoot, "public", "uploads", table);
5397
+ fs.remove(path.join(dir, result[key]), () => {});
5396
5398
  }
5397
5399
  }
5398
5400
  if (widgets[key].name == "dropbox") {
@@ -5487,7 +5489,7 @@ zRoute.import = async (req, res, MYMODEL) => {
5487
5489
  }
5488
5490
  let mytables = "<table>";
5489
5491
  let uniqueName = Util.generateUnique() + ".xlsx";
5490
- const filename = `${dirRoot}/public/uploads/zlogs_upload/${uniqueName}`;
5492
+ const filename = path.join(dirRoot, "public", "uploads", "zlogs_upload", uniqueName);
5491
5493
  let excelFile = req.files.excel,
5492
5494
  labels = MYMODEL.labels,
5493
5495
  keys = {};
@@ -5685,10 +5687,10 @@ zRoute.buildForm = async (req, res) => {
5685
5687
  let table = req.body.table;
5686
5688
  let keys = req.body.keys;
5687
5689
  let relations = JSON.parse(req.body.relations) || {};
5688
- let MYMODEL = MYMODELS[table] || require(`${dirRoot}/models/${table}`);
5690
+ let MYMODEL = MYMODELS[table] || require(path.join(dirRoot, "models", table));
5689
5691
  let MODEL_TABLE =
5690
5692
  MYMODELS[MYMODEL.widgets[keys].table] ||
5691
- require(`${dirRoot}/models/${MYMODEL.widgets[keys].table}`);
5693
+ require(path.join(dirRoot, "models", MYMODEL.widgets[keys].table));
5692
5694
  let MODEL_TABLE_RELATIONS = await zRoute.relations(
5693
5695
  req,
5694
5696
  res,
@@ -6187,7 +6189,7 @@ zRoute.makeFunctionsSystem = () => {
6187
6189
  }
6188
6190
  let templateSystem = `const { connection, Util, io, zCache, myCache, zDebug, zDataTable, moduleLib, zFunction, zFn, zMail, zRoute, zRole} = require('zet-lib');
6189
6191
  module.exports = (req, res, next) => {`;
6190
- let fileSystem = `${dirRoot}/components/zFunctionsSystem.js`;
6192
+ let fileSystem = path.join(dirRoot, "components", "zFunctionsSystem.js");
6191
6193
  templateSystem += content;
6192
6194
  templateSystem += ` next();
6193
6195
  };
@@ -1,4 +1,5 @@
1
1
  const express = require('express');
2
+ const path = require('path');
2
3
  const router = express.Router();
3
4
  const csrf = require('./csrf');
4
5
  const csrfProtection = csrf({cookie: true});
@@ -73,13 +74,13 @@ router.get('/', csrfProtection, async (req, res) => {
73
74
  relations: relations,
74
75
  routeName: res.locals.routeName
75
76
  }
76
- const bodyView = Util.readFile(require.resolve(__dirname + '/views/zview.ejs'))
77
+ const bodyView = Util.readFile(require.resolve(path.join(__dirname, 'views', 'zview.ejs')))
77
78
  const bodyHTML = ejs.render(bodyView, renderData)
78
- const endHTML = ejs.render(Util.readFile(require.resolve(__dirname + '/views/zviewjs.ejs')), renderData)
79
+ const endHTML = ejs.render(Util.readFile(require.resolve(path.join(__dirname, 'views', 'zviewjs.ejs'))), renderData)
79
80
  let dataRender = renderData
80
81
  dataRender.bodyHTML = bodyHTML
81
82
  dataRender.endHTML = endHTML
82
- res.render(require.resolve(__dirname + '/views/view_layout.ejs'), dataRender)
83
+ res.render(require.resolve(path.join(__dirname, 'views', 'view_layout.ejs')), dataRender)
83
84
  })
84
85
 
85
86
  router.post('/addview', async (req, res) => {
@@ -152,19 +153,19 @@ router.post('/load-form', async (req, res) => {
152
153
  if (result.id) {
153
154
  json = Util.jsonSuccess('success')
154
155
  if (!result.router) {
155
- result.router = Util.readFile(require.resolve(__dirname + '/views/router.txt'))
156
+ result.router = Util.readFile(require.resolve(path.join(__dirname, 'views', 'router.txt')))
156
157
  }
157
158
  if (!result.index_ejs) {
158
- result.index_ejs = Util.readFile(require.resolve(__dirname + '/views/index_ejs.txt'))
159
+ result.index_ejs = Util.readFile(require.resolve(path.join(__dirname, 'views', 'index_ejs.txt')))
159
160
  }
160
161
  if (!result.indexcss_ejs) {
161
- result.indexcss_ejs = Util.readFile(require.resolve(__dirname + '/views/indexcss_ejs.txt'))
162
+ result.indexcss_ejs = Util.readFile(require.resolve(path.join(__dirname, 'views', 'indexcss_ejs.txt')))
162
163
  }
163
164
  if (!result.indexjs_ejs) {
164
- result.indexjs_ejs = Util.readFile(require.resolve(__dirname + '/views/indexjs_ejs.txt'))
165
+ result.indexjs_ejs = Util.readFile(require.resolve(path.join(__dirname, 'views', 'indexjs_ejs.txt')))
165
166
  }
166
167
  if (!result.view_ejs) {
167
- result.view_ejs = Util.readFile(require.resolve(__dirname + '/views/view_ejs.txt'))
168
+ result.view_ejs = Util.readFile(require.resolve(path.join(__dirname, 'views', 'view_ejs.txt')))
168
169
  }
169
170
  if (!result.queries) {
170
171
  result.queries = {
@@ -274,7 +275,7 @@ router.delete('/delete-table', csrfProtection, async (req, res) => {
274
275
  //await connection.query("DELETE FROM zfields WHERE `table` = ?", [table]);
275
276
  await connection.query(`DROP VIEW "${table}";`)
276
277
  //delete file
277
- let modelFile = dirRoot + '/models/' + table + '.js'
278
+ let modelFile = path.join(dirRoot, 'models', table + '.js')
278
279
  fs.stat(modelFile, function (err, stats) {
279
280
  console.log(stats) //here we got all information of file in stats variable
280
281
  if (err) {
@@ -287,7 +288,7 @@ router.delete('/delete-table', csrfProtection, async (req, res) => {
287
288
  }
288
289
  })
289
290
 
290
- let routesFile = dirRoot + '/routes/' + table + '.js'
291
+ let routesFile = path.join(dirRoot, 'routes', table + '.js')
291
292
  fs.stat(routesFile, function (err, stats) {
292
293
  console.log(stats) //here we got all information of file in stats variable
293
294
  if (err) {
@@ -300,7 +301,7 @@ router.delete('/delete-table', csrfProtection, async (req, res) => {
300
301
  }
301
302
  })
302
303
 
303
- let runtimeFile = dirRoot + '/public/runtime/script/' + table
304
+ let runtimeFile = path.join(dirRoot, 'public', 'runtime', 'script', table)
304
305
  fs.rm(
305
306
  runtimeFile,
306
307
  {
@@ -314,7 +315,7 @@ router.delete('/delete-table', csrfProtection, async (req, res) => {
314
315
  }
315
316
  }
316
317
  )
317
- let runtimeFileHead = dirRoot + '/public/runtime/head/' + table
318
+ let runtimeFileHead = path.join(dirRoot, 'public', 'runtime', 'head', table)
318
319
  fs.rm(
319
320
  runtimeFileHead,
320
321
  {
@@ -328,7 +329,7 @@ router.delete('/delete-table', csrfProtection, async (req, res) => {
328
329
  }
329
330
  }
330
331
  )
331
- let runtimeFileEnd = dirRoot + '/public/runtime/end/' + table
332
+ let runtimeFileEnd = path.join(dirRoot, 'public', 'runtime', 'end', table)
332
333
  fs.rm(
333
334
  runtimeFileEnd,
334
335
  {
@@ -348,7 +349,7 @@ router.delete('/delete-table', csrfProtection, async (req, res) => {
348
349
  where: {route_name: table},
349
350
  })
350
351
  if (table) {
351
- const viewsFile = dirRoot + '/views/' + table
352
+ const viewsFile = path.join(dirRoot, 'views', table)
352
353
  fs.rm(
353
354
  viewsFile,
354
355
  {
@@ -1046,23 +1047,23 @@ const createAllFiles = async (table) => {
1046
1047
  })
1047
1048
  //create model file
1048
1049
  let modelContent = `let MYMODEL = ${Util.newLine} ${JSON.stringify(json,null,2)} ${Util.newLine}module.exports=MYMODEL`
1049
- fs.writeFileSync(`${dirRoot}/models/${table}.js`, modelContent)
1050
+ fs.writeFileSync(path.join(dirRoot, 'models', table + '.js'), modelContent)
1050
1051
  console.log(`The file model of ${table}.js is saved!`)
1051
1052
  //create route file
1052
- fs.writeFileSync(`${dirRoot}/routes/${table}.js`, result.router.replace('[[[TABLE_NAME]]]', table))
1053
+ fs.writeFileSync(path.join(dirRoot, 'routes', table + '.js'), result.router.replace('[[[TABLE_NAME]]]', table))
1053
1054
  console.log(`The file model of ${table}.js is saved!`)
1054
1055
  //create views file
1055
- let DIR_VIEW = `${dirRoot}/views/${table}`
1056
+ let DIR_VIEW = path.join(dirRoot, 'views', table)
1056
1057
  if (!fs.existsSync(DIR_VIEW)) {
1057
1058
  fs.mkdirSync(DIR_VIEW)
1058
1059
  }
1059
- fs.writeFileSync(`${DIR_VIEW}/index.ejs`, result.index_ejs)
1060
+ fs.writeFileSync(path.join(DIR_VIEW, 'index.ejs'), result.index_ejs)
1060
1061
  console.log(`The file model of index.ejs is saved!`)
1061
- fs.writeFileSync(`${DIR_VIEW}/indexcss.ejs`, result.indexcss_ejs)
1062
+ fs.writeFileSync(path.join(DIR_VIEW, 'indexcss.ejs'), result.indexcss_ejs)
1062
1063
  console.log(`The file model of indexcss.ejs is saved!`)
1063
- fs.writeFileSync(`${DIR_VIEW}/indexjs.ejs`, result.indexjs_ejs)
1064
+ fs.writeFileSync(path.join(DIR_VIEW, 'indexjs.ejs'), result.indexjs_ejs)
1064
1065
  console.log(`The file model of indexjs.ejs is saved!`)
1065
- fs.writeFileSync(`${DIR_VIEW}/view.ejs`, result.view_ejs)
1066
+ fs.writeFileSync(path.join(DIR_VIEW, 'view.ejs'), result.view_ejs)
1066
1067
  console.log(`The file model of view.ejs is saved!`)
1067
1068
  }
1068
1069
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zet-lib",
3
- "version": "3.2.4",
3
+ "version": "3.3.0",
4
4
  "description": "zet is a library that part of zet generator.",
5
5
  "engines": {
6
6
  "node": ">=18"