@opengis/fastify-table 1.4.51 → 1.4.52

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/config.js CHANGED
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-console */
1
2
  // import dotenv from 'dotenv';
2
3
 
3
4
  import { existsSync, readFileSync } from 'node:fs';
package/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-console */
1
2
  import path from 'node:path';
2
3
  import { existsSync, readdirSync, readFileSync } from 'node:fs';
3
4
  import { fileURLToPath } from 'node:url';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengis/fastify-table",
3
- "version": "1.4.51",
3
+ "version": "1.4.52",
4
4
  "type": "module",
5
5
  "description": "core-plugins",
6
6
  "keywords": [
@@ -89,67 +89,67 @@ const mapNumbers = {
89
89
  };
90
90
  const mapOrders = {
91
91
  ua: [
92
- { _Gender: true, _arrStates: ['', '', ''] },
93
- { _Gender: true, _arrStates: ['тисяча', 'тисячі', 'тисяч'] },
94
- { _Gender: false, _arrStates: ['мільйон', 'мільйона', 'мільйонів'] },
95
- { _Gender: false, _arrStates: ['мільярд', 'мільярда', 'мільярдів'] },
96
- { _Gender: false, _arrStates: ['триліон', 'триліона', 'триліонів'] },
92
+ { Gender: true, arrStates: ['', '', ''] },
93
+ { Gender: true, arrStates: ['тисяча', 'тисячі', 'тисяч'] },
94
+ { Gender: false, arrStates: ['мільйон', 'мільйона', 'мільйонів'] },
95
+ { Gender: false, arrStates: ['мільярд', 'мільярда', 'мільярдів'] },
96
+ { Gender: false, arrStates: ['триліон', 'триліона', 'триліонів'] },
97
97
  {
98
- _Gender: true,
99
- _arrStates: {
98
+ Gender: true,
99
+ arrStates: {
100
100
  uah: ['грн.', 'грн.', 'грн.'],
101
101
  rur: ['руб.', 'руб.', 'руб.'],
102
102
  },
103
- _bAddZeroWord: true,
103
+ bAddZeroWord: true,
104
104
  },
105
105
  {
106
- _Gender: true,
107
- _arrStates: ['ціла', 'цілих', 'цілих'],
108
- _bAddZeroWord: true,
106
+ Gender: true,
107
+ arrStates: ['ціла', 'цілих', 'цілих'],
108
+ bAddZeroWord: true,
109
109
  },
110
- { _Gender: true, _arrStates: ['', '', ''], _bAddZeroWord: true },
110
+ { Gender: true, arrStates: ['', '', ''], bAddZeroWord: true },
111
111
  {
112
- _Gender: true,
113
- _arrStates: ['дол.', 'дол.', 'дол.'],
114
- _bAddZeroWord: true,
112
+ Gender: true,
113
+ arrStates: ['дол.', 'дол.', 'дол.'],
114
+ bAddZeroWord: true,
115
115
  },
116
116
  {
117
- _Gender: true,
118
- _arrStates: ['грн.', 'грн.', 'грн.'],
119
- _bAddZeroWord: true,
117
+ Gender: true,
118
+ arrStates: ['грн.', 'грн.', 'грн.'],
119
+ bAddZeroWord: true,
120
120
  },
121
121
  ],
122
122
  ru: [
123
- { _Gender: true, _arrStates: ['', '', ''] },
124
- { _Gender: true, _arrStates: ['тысяча', 'тысячи', 'тысяч'] },
125
- { _Gender: false, _arrStates: ['миллион', 'миллиона', 'миллионов'] },
126
- { _Gender: false, _arrStates: ['миллиард', 'миллиарда', 'миллиардов'] },
127
- { _Gender: false, _arrStates: ['триллион', 'триллиона', 'триллионов'] },
123
+ { Gender: true, arrStates: ['', '', ''] },
124
+ { Gender: true, arrStates: ['тысяча', 'тысячи', 'тысяч'] },
125
+ { Gender: false, arrStates: ['миллион', 'миллиона', 'миллионов'] },
126
+ { Gender: false, arrStates: ['миллиард', 'миллиарда', 'миллиардов'] },
127
+ { Gender: false, arrStates: ['триллион', 'триллиона', 'триллионов'] },
128
128
  {
129
- _Gender: true,
130
- _arrStates: {
129
+ Gender: true,
130
+ arrStates: {
131
131
  uah: ['грн.', 'грн.', 'грн.'],
132
132
  rur: ['руб.', 'руб.', 'руб.'],
133
133
  usd: ['дол.', 'дол.', 'дол.'],
134
134
  },
135
- _bAddZeroWord: true,
135
+ bAddZeroWord: true,
136
136
  },
137
137
  {
138
- _Gender: true,
139
- _arrStates: ['целых', 'целых', 'целых'],
140
- _bAddZeroWord: true,
138
+ Gender: true,
139
+ arrStates: ['целых', 'целых', 'целых'],
140
+ bAddZeroWord: true,
141
141
  },
142
- { _Gender: true, _arrStates: ['', '', ''], _bAddZeroWord: true },
142
+ { Gender: true, arrStates: ['', '', ''], bAddZeroWord: true },
143
143
  {
144
- _Gender: true,
145
- _arrStates: ['дол.', 'дол.', 'дол.'],
146
- _bAddZeroWord: true,
144
+ Gender: true,
145
+ arrStates: ['дол.', 'дол.', 'дол.'],
146
+ bAddZeroWord: true,
147
147
  },
148
148
  ],
149
149
  };
150
150
  const objCur = {
151
- _Gender: false,
152
- _arrStates: {
151
+ Gender: false,
152
+ arrStates: {
153
153
  uah: ['грн.', 'грн.', 'грн.'],
154
154
  rur: ['руб.', 'руб.', 'руб.'],
155
155
  usd: ['дол.', 'дол.', 'дол.'],
@@ -157,15 +157,15 @@ const objCur = {
157
157
  },
158
158
  };
159
159
  const objCoin = {
160
- _Gender: false,
161
- _arrStates: {
160
+ Gender: false,
161
+ arrStates: {
162
162
  uah: 'коп.',
163
163
  rur: 'коп.',
164
164
  usd: 'цен.',
165
165
  num: { ru: 'сот.', ua: 'сот.', en: 'hund.' },
166
166
  },
167
167
  };
168
- // функции которые отвечают за форматирование
168
+ // функции которые отвечают за форматирование
169
169
  /**
170
170
  * Formatting from number to string
171
171
  *
@@ -197,17 +197,17 @@ function value(dVal, bGender, lang) {
197
197
  * from0To999(arrRet, 404,
198
198
  * oObjDesc:
199
199
  * {
200
- * _Gender: true,
201
- * _bAddZeroWord: undefined,
202
- * _arrStates: ['','',''],
200
+ * Gender: true,
201
+ * bAddZeroWord: undefined,
202
+ * arrStates: ['','',''],
203
203
  * },
204
204
  * lang: 'ru'
205
205
  * })
206
206
  * @param {Array} arrRet
207
207
  * @param {Number} fValue
208
- * @param {Object} [oObjDesc._Gender]
209
- * @param {Object} [oObjDesc._bAddZeroWord]
210
- * @param {Object} [oObjDesc._arrStates]
208
+ * @param {Object} [oObjDesc.Gender]
209
+ * @param {Object} [oObjDesc.bAddZeroWord]
210
+ * @param {Object} [oObjDesc.arrStates]
211
211
  * @param oObjDesc
212
212
  * @param {String} lang
213
213
  */
@@ -216,32 +216,32 @@ function from0To999(arrRet, fValue, oObjDesc, lang) {
216
216
  let nCurrState = 2;
217
217
  if (Math.floor(fValueNew / 100) > 0) {
218
218
  const fCurr = Math.floor(fValueNew / 100) * 100;
219
- arrRet.push(value(fCurr, oObjDesc._Gender, lang));
219
+ arrRet.push(value(fCurr, oObjDesc.Gender, lang));
220
220
  nCurrState = mapNumbers[lang][fCurr][0];
221
221
  fValueNew -= fCurr;
222
222
  }
223
223
  if (fValueNew === 0) {
224
- arrRet.push(value(fValueNew, oObjDesc._Gender, lang));
224
+ arrRet.push(value(fValueNew, oObjDesc.Gender, lang));
225
225
  nCurrState = mapNumbers[lang][fValueNew][0];
226
226
  }
227
- else if (fValueNew < 20) {
228
- if (Math.floor(fValueNew) > 0 || oObjDesc._bAddZeroWord) {
229
- arrRet.push(value(fValueNew, oObjDesc._Gender, lang));
227
+ else if (fValueNew < 20) {
228
+ if (Math.floor(fValueNew) > 0 || oObjDesc.bAddZeroWord) {
229
+ arrRet.push(value(fValueNew, oObjDesc.Gender, lang));
230
230
  nCurrState = mapNumbers[lang][fValueNew][0];
231
231
  }
232
232
  }
233
- else {
233
+ else {
234
234
  const fCurr = Math.floor(fValueNew / 10) * 10;
235
- arrRet.push(value(fCurr, oObjDesc._Gender, lang));
235
+ arrRet.push(value(fCurr, oObjDesc.Gender, lang));
236
236
  nCurrState = mapNumbers[lang][fCurr][0];
237
237
  fValueNew -= fCurr;
238
238
 
239
239
  if (Math.floor(fValueNew) > 0) {
240
- arrRet.push(value(fValueNew, oObjDesc._Gender, lang));
240
+ arrRet.push(value(fValueNew, oObjDesc.Gender, lang));
241
241
  nCurrState = mapNumbers[lang][fValueNew][0];
242
242
  }
243
243
  }
244
- arrRet.push(oObjDesc._arrStates[nCurrState]);
244
+ arrRet.push(oObjDesc.arrStates[nCurrState]);
245
245
  }
246
246
 
247
247
  /**
@@ -289,11 +289,11 @@ function floatToSamplesInWordsUkr(fAmount, resultStr, exp, lang, currency) {
289
289
  /%d/,
290
290
  Math.floor(parseInt(fAmount, 10) + 0.005),
291
291
  );
292
- if (currency !== 'num' && objCur._arrStates[currency]) { resultStrNew = resultStrNew.replace(/%curr/, objCur._arrStates[currency][0]); }
293
- else {
292
+ if (currency !== 'num' && objCur.arrStates[currency]) { resultStrNew = resultStrNew.replace(/%curr/, objCur.arrStates[currency][0]); }
293
+ else {
294
294
  resultStrNew = resultStrNew.replace(
295
295
  /%curr/,
296
- objCur._arrStates[lang === 'ru' ? 'rur' : lang][0],
296
+ objCur.arrStates[lang === 'ru' ? 'rur' : lang][0],
297
297
  );
298
298
  }
299
299
 
@@ -309,11 +309,11 @@ function floatToSamplesInWordsUkr(fAmount, resultStr, exp, lang, currency) {
309
309
 
310
310
  resultStrNew = resultStrNew.replace(/%f/, fDec);
311
311
 
312
- if (currency !== 'num' && objCur._arrStates[currency]) { resultStrNew = resultStrNew.replace(/%coin/, objCoin._arrStates[currency]); }
313
- else {
312
+ if (currency !== 'num' && objCur.arrStates[currency]) { resultStrNew = resultStrNew.replace(/%coin/, objCoin.arrStates[currency]); }
313
+ else {
314
314
  resultStrNew = resultStrNew.replace(
315
315
  /%coin/,
316
- objCoin._arrStates[lang === 'ru' ? 'rur' : lang],
316
+ objCoin.arrStates[lang === 'ru' ? 'rur' : lang],
317
317
  );
318
318
  }
319
319
  return resultStrNew;
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-param-reassign */
1
2
  /**
2
3
  * Форматування до числа
3
4
  *
@@ -1,3 +1,5 @@
1
+ /* eslint-disable no-restricted-globals */
2
+ /* eslint-disable no-param-reassign */
1
3
  /**
2
4
  * Повертає розмір файлу на диску у встановлених одиницях вимірювання об'єму файлу.
3
5
  *
@@ -17,13 +19,13 @@ export default function formatUnit(data, options) {
17
19
  data = parseFloat(data);
18
20
  if (isNaN(data)) return data;
19
21
 
20
- const _UNIT = {
22
+ const UNIT = {
21
23
  B: {
22
24
  4: 'TB', 3: 'GB', 2: 'MB', 1: 'KB', 0: 'B',
23
25
  },
24
26
  };
25
27
 
26
- const unit = _UNIT[options.hash.unit] || _UNIT.B;
28
+ const unit = UNIT[options.hash.unit] || UNIT.B;
27
29
  const number = options.hash.number || 0;
28
30
 
29
31
  for (let i = 4; i >= 0; i -= 1) {
@@ -1,3 +1,5 @@
1
+ /* eslint-disable no-restricted-globals */
2
+ /* eslint-disable no-param-reassign */
1
3
  /**
2
4
  * Приведення чисел до стандартизованого виду
3
5
  *
@@ -15,12 +15,12 @@
15
15
  * @param {Object} operator Оператор для дії з числами
16
16
  * @param {Object} arg1 Перше число для дії
17
17
  * @param {Object} arg2 Друге число для дії
18
- * @param {Array} args[0]] Перше число для дії
19
- * @param {Array} args[1]] Оператор для дії з числами
20
- * @param {Array} args[2]] Друге число для дії
18
+ * @param {Array} args[0] Перше число для дії
19
+ * @param {Array} args[1] Оператор для дії з числами
20
+ * @param {Array} args[2] Друге число для дії
21
21
  * @returns {String} Returns HTML
22
22
  */
23
- export default function _math(...args) {
23
+ export default function math(...args) {
24
24
  const options = args.pop();
25
25
  const opt = options.hash;
26
26
 
@@ -25,9 +25,9 @@ const maxLimit = 100;
25
25
  * @returns {String} Returns HTML
26
26
  */
27
27
  export default async function contentList(options) {
28
- const {
29
- table, limit, query, order, sql, debug,
30
- } = options.hash;
28
+ const {
29
+ table, limit, query, order, sql, debug,
30
+ } = options.hash;
31
31
  if (!table) { return 'Table undefined'; }
32
32
 
33
33
  try {
@@ -35,11 +35,7 @@ export default async function contentList(options) {
35
35
 
36
36
  const hasBrackets = table.trim().startsWith('(') && table.trim().endsWith(')');
37
37
 
38
- const where = `where ${query || '1=1'}`;
39
- const _limit = limit !== undefined && limit !== null ? Math.min(maxLimit, +limit) : 15;
40
- const _order = order ? `order by ${order}` : '';
41
-
42
- const SQL = `select *,${pg.pk[table] || '1'}::text from ${hasBrackets ? `${table} t` : table} ${where} ${_order} limit ${_limit}`;
38
+ const SQL = `select *,${pg.pk[table] || '1'}::text from ${hasBrackets ? `${table} t` : table} where ${query || '1=1'} ${order ? `order by ${order}` : ''} limit ${limit !== undefined && limit !== null ? Math.min(maxLimit, +limit) : 15}`;
43
39
  const compiledSQL = Handlebars.compile(SQL)(options.data.root);
44
40
 
45
41
  if (sql) {
@@ -54,8 +50,8 @@ export default async function contentList(options) {
54
50
  }
55
51
 
56
52
  return options.fn(data);
57
- }
58
- catch (err) {
53
+ }
54
+ catch (err) {
59
55
  return `Сталася помилка, зверніться до відділу підтримки.<!-- err: ${err.toString()} -->`;
60
56
  }
61
57
  }
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-param-reassign */
1
2
  /**
2
3
  * Перетинає два масиви
3
4
  *
@@ -32,75 +33,77 @@ function intersect(a, b) {
32
33
  * @example
33
34
  * {{#ifCond 'debug' 'in' @root.setting.core.setting}}Умова виконана{{^}}Не виконана умова{{/ifCond}}
34
35
  * @param {Array} args Параметри для значень і умов
35
- * @param {Array} args[0]] Перше значення
36
- * @param {Array} args[1]] Оператор
37
- * @param {Array} args[2]] Друге значення
36
+ * @param {Array} args[0] Перше значення
37
+ * @param {Array} args[1] Оператор
38
+ * @param {Array} args[2] Друге значення
38
39
  * @returns {String} Returns HTML
39
40
  */
40
41
  export default function ifCond(v1, operator, v2, options) {
41
- const __obj = this;
42
+ const obj = this;
42
43
 
43
44
  const isEmpty = (val) => val === null || val === undefined || (Array.isArray(val) && val.length === 0) || val === '';
44
45
 
45
46
  switch (operator) {
46
47
  case '==':
47
- return (v1 == v2) ? options.fn(__obj) : options.inverse(__obj);
48
+ // eslint-disable-next-line eqeqeq
49
+ return (v1 == v2) ? options.fn(obj) : options.inverse(obj);
48
50
  case '!=':
49
- return (v1 != v2) ? options.fn(__obj) : options.inverse(__obj);
51
+ // eslint-disable-next-line eqeqeq
52
+ return (v1 != v2) ? options.fn(obj) : options.inverse(obj);
50
53
  case '===':
51
- return (v1 === v2) ? options.fn(__obj) : options.inverse(__obj);
54
+ return (v1 === v2) ? options.fn(obj) : options.inverse(obj);
52
55
  case '!==':
53
- return (v1 !== v2) ? options.fn(__obj) : options.inverse(__obj);
56
+ return (v1 !== v2) ? options.fn(obj) : options.inverse(obj);
54
57
  case '&&':
55
- return (v1 && v2) ? options.fn(__obj) : options.inverse(__obj);
58
+ return (v1 && v2) ? options.fn(obj) : options.inverse(obj);
56
59
  case '||':
57
- return (v1 || v2) ? options.fn(__obj) : options.inverse(__obj);
60
+ return (v1 || v2) ? options.fn(obj) : options.inverse(obj);
58
61
  case '<':
59
- return (v1 < v2) ? options.fn(__obj) : options.inverse(__obj);
62
+ return (v1 < v2) ? options.fn(obj) : options.inverse(obj);
60
63
  case '<=':
61
- return (v1 <= v2) ? options.fn(__obj) : options.inverse(__obj);
64
+ return (v1 <= v2) ? options.fn(obj) : options.inverse(obj);
62
65
  case '>':
63
- return (v1 > v2) ? options.fn(__obj) : options.inverse(__obj);
66
+ return (v1 > v2) ? options.fn(obj) : options.inverse(obj);
64
67
  case '>=':
65
- return (v1 >= v2) ? options.fn(__obj) : options.inverse(__obj);
68
+ return (v1 >= v2) ? options.fn(obj) : options.inverse(obj);
66
69
  case '&':
67
70
  return (!isEmpty(v1) && !isEmpty(v2) && intersect(v1, v2).length !== 0)
68
- ? options.fn(__obj)
69
- : options.inverse(__obj);
71
+ ? options.fn(obj)
72
+ : options.inverse(obj);
70
73
  case '!~':
71
74
  return (v1 || '').indexOf(v2) === -1
72
- ? options.fn(__obj)
73
- : options.inverse(__obj);
75
+ ? options.fn(obj)
76
+ : options.inverse(obj);
74
77
  case '~':
75
78
  return (v1 || '').indexOf(v2) !== -1
76
- ? options.fn(__obj)
77
- : options.inverse(__obj);
79
+ ? options.fn(obj)
80
+ : options.inverse(obj);
78
81
  case 'period':
79
82
  return (!isEmpty(v1) && !isEmpty(v2) && new Date(v1) < new Date() && new Date(v2) > new Date())
80
- ? options.fn(__obj)
81
- : options.inverse(__obj);
83
+ ? options.fn(obj)
84
+ : options.inverse(obj);
82
85
  case 'in': {
83
86
  if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
84
- if (isEmpty(v1) || isEmpty(v2)) return options.inverse(__obj);
87
+ if (isEmpty(v1) || isEmpty(v2)) return options.inverse(obj);
85
88
 
86
89
  if (Array.isArray(v1)) {
87
90
  return v1.some((value) => v2.includes(value.toString()))
88
- ? options.fn(__obj)
89
- : options.inverse(__obj);
91
+ ? options.fn(obj)
92
+ : options.inverse(obj);
90
93
  }
91
94
  return v2.includes(v1.toString())
92
- ? options.fn(__obj)
93
- : options.inverse(__obj);
95
+ ? options.fn(obj)
96
+ : options.inverse(obj);
94
97
  }
95
98
  case 'not in': {
96
99
  if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
97
- if (isEmpty(v1) || isEmpty(v2)) return options.inverse(__obj);
100
+ if (isEmpty(v1) || isEmpty(v2)) return options.inverse(obj);
98
101
 
99
102
  return !v2.includes(v1.toString())
100
- ? options.fn(__obj)
101
- : options.inverse(__obj);
103
+ ? options.fn(obj)
104
+ : options.inverse(obj);
102
105
  }
103
106
  default:
104
- return options.inverse(__obj);
107
+ return options.inverse(obj);
105
108
  }
106
109
  }
@@ -1,8 +1,23 @@
1
+ /* eslint-disable prefer-rest-params */
1
2
  function intersect(a, b) {
2
- const aN = Array.isArray(a) ? a : typeof a === 'string' ? a.split(',') : [];
3
- const bN = Array.isArray(b) ? b : typeof b === 'string' ? b.split(',') : [];
3
+ let aN = [];
4
+ let bN = [];
4
5
 
5
- return aN.filter((e) => bN.includes(e));
6
+ if (Array.isArray(a)) {
7
+ aN = a;
8
+ }
9
+ else if (typeof a === 'string') {
10
+ aN = a.split(',');
11
+ }
12
+
13
+ if (Array.isArray(b)) {
14
+ bN = b;
15
+ }
16
+ else if (typeof b === 'string') {
17
+ bN = b.split(',');
18
+ }
19
+
20
+ return aN.filter(e => bN.includes(e));
6
21
  }
7
22
 
8
23
  /**
@@ -31,9 +46,11 @@ export default function ifCondAnd() {
31
46
 
32
47
  switch (operator) {
33
48
  case '==':
49
+ // eslint-disable-next-line eqeqeq
34
50
  conditions.push(v1 == v2);
35
51
  break;
36
52
  case '!=':
53
+ // eslint-disable-next-line eqeqeq
37
54
  conditions.push(v1 != v2);
38
55
  break;
39
56
  case '===':
@@ -77,7 +94,7 @@ export default function ifCondAnd() {
77
94
  if (Array.isArray(v1)) {
78
95
  conditions.push(v1.some((value) => v2.includes(value.toString())));
79
96
  }
80
- else {
97
+ else {
81
98
  conditions.push(v2.includes(v1.toString()));
82
99
  }
83
100
  break;
@@ -1,8 +1,23 @@
1
+ /* eslint-disable prefer-rest-params */
1
2
  function intersect(a, b) {
2
- const aN = Array.isArray(a) ? a : typeof a === 'string' ? a.split(',') : [];
3
- const bN = Array.isArray(b) ? b : typeof b === 'string' ? b.split(',') : [];
3
+ let aN = [];
4
+ let bN = [];
4
5
 
5
- return aN.filter((e) => bN.includes(e));
6
+ if (Array.isArray(a)) {
7
+ aN = a;
8
+ }
9
+ else if (typeof a === 'string') {
10
+ aN = a.split(',');
11
+ }
12
+
13
+ if (Array.isArray(b)) {
14
+ bN = b;
15
+ }
16
+ else if (typeof b === 'string') {
17
+ bN = b.split(',');
18
+ }
19
+
20
+ return aN.filter(e => bN.includes(e));
6
21
  }
7
22
 
8
23
  /**
@@ -32,9 +47,11 @@ export default function ifCondOr() {
32
47
 
33
48
  switch (operator) {
34
49
  case '==':
50
+ // eslint-disable-next-line eqeqeq
35
51
  conditions.push(v1 == v2);
36
52
  break;
37
53
  case '!=':
54
+ // eslint-disable-next-line eqeqeq
38
55
  conditions.push(v1 != v2);
39
56
  break;
40
57
  case '===':
@@ -78,7 +95,7 @@ export default function ifCondOr() {
78
95
  if (Array.isArray(v1)) {
79
96
  conditions.push(v1.some((value) => v2.includes(value.toString())));
80
97
  }
81
- else {
98
+ else {
82
99
  conditions.push(v2.includes(v1.toString()));
83
100
  }
84
101
  break;
@@ -1,3 +1,3 @@
1
- export default function (data) {
1
+ export default function jsonStringify(data) {
2
2
  return JSON.stringify(data, null, 2);
3
3
  }
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-restricted-globals */
1
2
  /**
2
3
  * Округлення числа до певної точності
3
4
  *
@@ -15,14 +16,14 @@
15
16
  * @returns {String} Returns HTML
16
17
  */
17
18
  export default function round(data, options) {
18
- const _data = parseFloat(data);
19
- if (isNaN(_data)) return '';
19
+ const floatData = parseFloat(data);
20
+ if (isNaN(floatData)) return '';
20
21
 
21
22
  const dec = options.hash.dec ? parseInt(options.hash.dec, 10) : 0;
22
23
 
23
24
  if (options.hash.floor) {
24
- return Math.floor(_data).toFixed(dec);
25
+ return Math.floor(floatData).toFixed(dec);
25
26
  }
26
27
 
27
- return _data.toFixed(dec);
28
+ return floatData.toFixed(dec);
28
29
  }
@@ -1,5 +1,5 @@
1
1
  import getPG from '../../plugins/pg/funcs/getPG.js';
2
- import getSelect from '../../plugins/table/funcs/getSelect.js';
2
+ import getSelect from '../../plugins/table/funcs/getSelect.js';
3
3
 
4
4
  const pg = getPG();
5
5
 
@@ -19,7 +19,7 @@ export default async function select(ids, options) {
19
19
  if (!classifier) return `Не знайдено класифікатор ${data}`;
20
20
 
21
21
  const arr = classifier.arr || [];
22
- if (classifier.sql && typeof classifier.sql === 'string') {
22
+ if (classifier.sql && typeof classifier.sql === 'string') {
23
23
  const metaQuery = `SELECT * FROM (${classifier.sql})q LIMIT 0`;
24
24
  const meta = await pg.query(metaQuery);
25
25
  const idColumn = meta.fields[0].name;
@@ -29,18 +29,18 @@ export default async function select(ids, options) {
29
29
  const values = [idsArray.map(id => String(id))];
30
30
 
31
31
  const { rows } = await pg.query(q, values);
32
- Object.assign(arr, rows);
32
+ Object.assign(arr, rows);
33
33
  }
34
34
  if (!arr.length) return idsArray;
35
35
 
36
36
  const results = idsArray.map(id => {
37
- const result = arr.find(el => String(el.id) == String(id));
37
+ const result = arr.find(el => String(el.id) === String(id));
38
38
  return result ? result.text : '';
39
39
  });
40
40
 
41
41
  return results.filter(Boolean).join(', ');
42
- }
43
- catch (err) {
42
+ }
43
+ catch (err) {
44
44
  return `Сталася помилка.<!-- err: ${err.toString()} -->`;
45
45
  }
46
46
  }
@@ -1,3 +1,4 @@
1
+ /* eslint-disable prefer-rest-params */
1
2
  import handlebarsSync from 'handlebars';
2
3
  import promisedHandlebars from 'promised-handlebars';
3
4
 
@@ -54,14 +55,14 @@ function getKeysRecursive(obj, prefix = '') {
54
55
  const fullKey = prefix ? `${prefix}.${curr}` : curr;
55
56
  acc.push(curr);
56
57
  if (obj1[curr] && typeof obj1[curr] === 'object' && curr !== 'coordinates') {
57
- acc = acc.concat(getKeysRecursive(obj1[curr], fullKey));
58
+ acc.push(...(getKeysRecursive(obj1[curr], fullKey)));
58
59
  }
59
60
  return acc;
60
61
  }, []);
61
62
  }
62
63
 
63
64
  // avoid unhandled exception if helper not registered
64
- handlebars.registerHelper('helperMissing', function () {
65
+ handlebars.registerHelper('helperMissing', function hm() {
65
66
  const options = arguments[arguments.length - 1];
66
67
  const args = Array.prototype.slice.call(arguments, 0, arguments.length - 1);
67
68
  const keys = getKeysRecursive(options.data?.root);
@@ -1,3 +1,5 @@
1
+ /* eslint-disable no-console */
2
+
1
3
  import setToken from '../../plugins/crud/funcs/setToken.js';
2
4
 
3
5
  import { handlebars } from '../index.js';
@@ -4,9 +4,9 @@
4
4
  // }
5
5
 
6
6
  const newColor = 'red';
7
- export default function button(token, title) {
7
+ export default function button(token) {
8
8
  return `<button onclick="window.v3plugin.$api({ api: '/api/table/${token}', method:'delete',confirm: { title:'Підтвердити операцію', text: 'Ви впевнені що хочете вилучити запис?', cancel: 'Скасувати', confirm : 'Виконати'} })"
9
9
  class="group px-2 py-1 inline-flex border-solid justify-center items-center gap-2 rounded-md font-semibold focus:outline-none text-sm transition-all border border-transparent hover:text-white ring-offset-white bg-${newColor}-100 text-${newColor}-100 hover:bg-${newColor}-500 focus:ring-${newColor}-500">
10
10
  <svg class="group-hover:fill-white" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" width="13" height="13" fill="#ef4444"><path d="M135.2 17.7L128 32 32 32C14.3 32 0 46.3 0 64S14.3 96 32 96l384 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-96 0-7.2-14.3C307.4 6.8 296.3 0 284.2 0L163.8 0c-12.1 0-23.2 6.8-28.6 17.7zM416 128L32 128 53.2 467c1.6 25.3 22.6 45 47.9 45l245.8 0c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg>
11
11
  </button>`;
12
- }
12
+ }
@@ -4,9 +4,9 @@
4
4
  // }
5
5
 
6
6
  const newColor = 'blue';
7
- export default function button(token, title) {
7
+ export default function button(token) {
8
8
  return `<button onclick="window.v3plugin.$form({ token: '${token}' })"
9
9
  class="group px-2 py-1 inline-flex border-solid justify-center items-center gap-2 rounded-md font-semibold focus:outline-none text-sm transition-all border border-transparent hover:text-white ring-offset-white bg-${newColor}-100 text-${newColor}-100 hover:bg-${newColor}-500 focus:ring-${newColor}-500">
10
10
  <svg class="group-hover:fill-white" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="13" height="13" fill="#3b82f6"><path d="M471.6 21.7c-21.9-21.9-57.3-21.9-79.2 0L362.3 51.7l97.9 97.9 30.1-30.1c21.9-21.9 21.9-57.3 0-79.2L471.6 21.7zm-299.2 220c-6.1 6.1-10.8 13.6-13.5 21.9l-29.6 88.8c-2.9 8.6-.6 18.1 5.8 24.6s15.9 8.7 24.6 5.8l88.8-29.6c8.2-2.7 15.7-7.4 21.9-13.5L437.7 172.3 339.7 74.3 172.4 241.7zM96 64C43 64 0 107 0 160L0 416c0 53 43 96 96 96l256 0c53 0 96-43 96-96l0-96c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 96c0 17.7-14.3 32-32 32L96 448c-17.7 0-32-14.3-32-32l0-256c0-17.7 14.3-32 32-32l96 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L96 64z"/></svg>
11
11
  </button>`;
12
- }
12
+ }
@@ -21,11 +21,19 @@
21
21
  export default function coalesce(...args) {
22
22
  const options = args.pop();
23
23
 
24
- for (const arg of args) {
25
- if (arg != null && arg !== '') {
26
- return arg;
27
- }
24
+ const value = args.find(arg => arg != null && arg !== '');
25
+
26
+ if (value !== undefined) {
27
+ return value;
28
+ }
29
+
30
+ if (options.fn) {
31
+ return options.fn(this);
32
+ }
33
+
34
+ if (options.inverse) {
35
+ return options.inverse(this);
28
36
  }
29
37
 
30
- return options.fn ? options.fn(this) : (options.inverse ? options.inverse(this) : '');
38
+ return '';
31
39
  }
@@ -1,4 +1,5 @@
1
- export default function (num) {
1
+ /* eslint-disable prefer-rest-params */
2
+ export default function paddingNumber(num) {
2
3
  const padding = arguments.length === 3 ? arguments[1] : 6;
3
4
  return num.toLocaleString('en', { minimumIntegerDigits: padding, useGrouping: false });
4
- }
5
+ }
@@ -1,5 +1,6 @@
1
1
  import config from '../../../../config.js';
2
-
2
+ /* eslint-disable no-console */
3
+ // eslint-disable-next-line no-control-regex
3
4
  const emailReg = /(?:[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-zA-Z0-9-]*[a-zA-Z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/g;
4
5
 
5
6
  function checkField(key, val, options, idx, body) {
@@ -57,7 +58,7 @@ function checkBody({ body = {}, arr = [], idx }) {
57
58
  return acc;
58
59
  }, []);
59
60
  // acc1.push(result);
60
- acc1 = acc1.concat(result);
61
+ acc1.push(...result);
61
62
  return acc1;
62
63
  }
63
64
 
@@ -109,6 +109,7 @@ const wrapGrpcCall = (methodName) => async (data) => new Promise((res, rej) => {
109
109
 
110
110
  return res(response);
111
111
  });
112
+ return null;
112
113
  });
113
114
 
114
115
  const grpcMethods = methodNames.reduce((acc, name) => {
@@ -78,8 +78,9 @@ const officeToPdf = async (data) => new Promise((res, rej) => {
78
78
  }
79
79
  return rej(err);
80
80
  }
81
- res(data1);
81
+ return res(data1);
82
82
  });
83
+ return null;
83
84
  });
84
85
 
85
86
  const getOffice = () => ({
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-script-url */
1
2
  const sqlInjection = [
2
3
  '()',
3
4
  '^',
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-script-url */
1
2
  const xssInjection = [
2
3
  'onkeypress=',
3
4
  'onkeyup=',
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-restricted-globals */
1
2
  const dateTypeList = ['date', 'timestamp', 'timestamp without time zone', 'timestamp with time zone'];
2
3
  const numberTypeList = ['float8', 'int4', 'int8', 'numeric', 'double precision', 'integer', 'bigint'];
3
4
 
@@ -1,3 +1,5 @@
1
+ /* eslint-disable no-console */
2
+ /* eslint-disable no-restricted-globals */
1
3
  /* eslint-disable no-param-reassign */
2
4
  // import config from '../../../../config.js';
3
5
 
@@ -65,11 +65,6 @@ export default async function update(req, reply) {
65
65
  Object.keys(body || {}).filter(key => !Object.keys(schema || {}).includes(key)).forEach(key => delete body[key]);
66
66
  }
67
67
 
68
- if (tokenData?.obj) {
69
- const objData = tokenData.obj?.split('#').reduce((p, el) => ({ ...p, [el.split('=')[0]]: el.split('=')[1] }), {}) || {};
70
- Object.assign(body, objData);
71
- }
72
-
73
68
  const xssCheck = checkXSS({ body, schema });
74
69
 
75
70
  if (xssCheck.error && formData?.xssCheck !== false) {
@@ -89,6 +84,11 @@ export default async function update(req, reply) {
89
84
  return reply.status(409).send('Дані не пройшли валідацію. Приберіть некоректні дані та спробуйте ще раз');
90
85
  }
91
86
 
87
+ if (tokenData?.obj) {
88
+ const objData = tokenData.obj?.split('#').reduce((p, el) => ({ ...p, [el.split('=')[0]]: el.split('=')[1] }), {}) || {};
89
+ Object.assign(body, objData);
90
+ }
91
+
92
92
  const res = await dataUpdate({
93
93
  pg,
94
94
  table: loadTemplate?.table || table,