@opengis/fastify-table 1.3.71 → 1.3.73

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 (93) hide show
  1. package/README.md +86 -86
  2. package/index.js +9 -0
  3. package/package.json +1 -1
  4. package/server/helpers/format/formatAuto.js +13 -13
  5. package/server/helpers/format/formatDate.js +258 -258
  6. package/server/helpers/format/formatDigit.js +20 -20
  7. package/server/helpers/format/formatNum.js +361 -361
  8. package/server/helpers/format/formatNumber.js +54 -54
  9. package/server/helpers/format/formatRelative.js +106 -106
  10. package/server/helpers/format/formatUnit.js +38 -38
  11. package/server/helpers/format/num_format.js +41 -41
  12. package/server/helpers/funcs/_math.js +49 -49
  13. package/server/helpers/funcs/empty.js +21 -21
  14. package/server/helpers/funcs/ifCond.js +106 -106
  15. package/server/helpers/funcs/ifCondAnd.js +96 -96
  16. package/server/helpers/funcs/ifCondOr.js +98 -98
  17. package/server/helpers/funcs/inc.js +20 -20
  18. package/server/helpers/funcs/json.js +2 -2
  19. package/server/helpers/funcs/round.js +27 -27
  20. package/server/helpers/string/coalesce.js +31 -31
  21. package/server/helpers/string/concat.js +28 -28
  22. package/server/helpers/string/split.js +19 -19
  23. package/server/helpers/string/str_replace.js +60 -60
  24. package/server/helpers/string/substr.js +31 -31
  25. package/server/helpers/string/translit.js +23 -23
  26. package/server/helpers/string/utils/alphabet.js +75 -75
  27. package/server/plugins/cron/funcs/addCron.js +52 -52
  28. package/server/plugins/cron/index.js +76 -76
  29. package/server/plugins/crud/funcs/getOpt.js +14 -14
  30. package/server/plugins/crud/funcs/setOpt.js +21 -21
  31. package/server/plugins/crud/funcs/setToken.js +43 -43
  32. package/server/plugins/crud/funcs/utils/getFolder.js +11 -11
  33. package/server/plugins/crud/index.js +23 -23
  34. package/server/plugins/hook/index.js +8 -8
  35. package/server/plugins/logger/errorStatus.js +19 -19
  36. package/server/plugins/logger/index.js +26 -26
  37. package/server/plugins/migration/index.js +7 -7
  38. package/server/plugins/pg/index.js +11 -2
  39. package/server/plugins/policy/sqlInjection.js +33 -33
  40. package/server/plugins/redis/client.js +8 -8
  41. package/server/plugins/redis/funcs/redisClients.js +3 -3
  42. package/server/plugins/redis/index.js +17 -17
  43. package/server/plugins/table/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  44. package/server/plugins/table/funcs/getFilterSQL/util/getTableSql.js +34 -34
  45. package/server/plugins/table/funcs/getTemplates.js +19 -19
  46. package/server/plugins/table/funcs/gisIRColumn.js +82 -82
  47. package/server/plugins/table/funcs/loadTemplate.js +1 -1
  48. package/server/plugins/table/funcs/loadTemplatePath.js +1 -1
  49. package/server/plugins/table/funcs/userTemplateDir.js +1 -1
  50. package/server/plugins/table/index.js +13 -13
  51. package/server/plugins/util/index.js +7 -7
  52. package/server/routes/cron/index.js +16 -14
  53. package/server/routes/crud/index.js +8 -7
  54. package/server/routes/data/controllers/cardData.js +144 -0
  55. package/server/routes/data/controllers/cardTabData.js +58 -0
  56. package/server/routes/data/controllers/funcs/getFilterSQL/index.js +92 -0
  57. package/server/routes/data/controllers/funcs/getFilterSQL/util/formatValue.js +170 -0
  58. package/server/routes/data/controllers/funcs/getFilterSQL/util/getCustomQuery.js +13 -0
  59. package/server/routes/data/controllers/funcs/getFilterSQL/util/getFilterQuery.js +64 -0
  60. package/server/routes/data/controllers/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -0
  61. package/server/routes/data/controllers/funcs/getFilterSQL/util/getTableSql.js +34 -0
  62. package/server/routes/data/controllers/tableData.js +55 -0
  63. package/server/routes/data/controllers/tableFilter.js +16 -0
  64. package/server/routes/data/controllers/tableInfo.js +110 -0
  65. package/server/routes/data/controllers/tokenInfo.js +12 -0
  66. package/server/routes/data/controllers/utils/assignTokens.js +31 -0
  67. package/server/routes/data/controllers/utils/conditions.js +19 -0
  68. package/server/routes/data/controllers/utils/getColumns.js +9 -0
  69. package/server/routes/data/index.mjs +22 -0
  70. package/server/routes/data/schema.js +54 -0
  71. package/server/routes/dblist/index.mjs +9 -7
  72. package/server/routes/logger/controllers/logger.file.js +93 -93
  73. package/server/routes/logger/controllers/utils/checkUserAccess.js +19 -19
  74. package/server/routes/logger/controllers/utils/getRootDir.js +26 -26
  75. package/server/routes/logger/index.js +17 -17
  76. package/server/routes/menu/controllers/getMenu.js +97 -0
  77. package/server/routes/menu/controllers/interfaces.js +21 -0
  78. package/server/routes/menu/index.mjs +8 -0
  79. package/server/routes/menu/schema.js +0 -0
  80. package/server/routes/properties/controllers/properties.add.js +55 -55
  81. package/server/routes/properties/controllers/properties.get.js +17 -17
  82. package/server/routes/properties/index.js +16 -16
  83. package/server/routes/table/controllers/form.js +42 -42
  84. package/server/routes/table/controllers/search.js +74 -74
  85. package/server/routes/table/controllers/suggest.js +28 -14
  86. package/server/routes/table/index.js +10 -10
  87. package/server/routes/table/schema.js +65 -64
  88. package/server/routes/templates/controllers/getTemplate.js +51 -0
  89. package/server/routes/templates/index.mjs +10 -0
  90. package/server/routes/templates/schema.js +9 -0
  91. package/server/routes/util/controllers/status.monitor.js +8 -8
  92. package/server/routes/util/index.js +2 -2
  93. package/utils.js +2 -0
@@ -1,106 +1,106 @@
1
- /**
2
- * Перетинає два масиви
3
- *
4
- * @example
5
- * // returns [1, 4, 5, 6]
6
- * intersect([1,2,3,4,5,6],[1,4,5,6,7,8,9,11])
7
- * @param {Array} a
8
- * @param {Array} b
9
- * @returns {Array} Returns new intersect array
10
- */
11
- function intersect(a, b) {
12
- let aN = a; let bN = b;
13
- if (b.length > a.length) {
14
- [aN, bN] = [bN, aN];
15
- }
16
- return aN.filter((e) => bN.includes(e));
17
- }
18
-
19
- /**
20
- * Створення шаблона або його частини внаслідок перевірки значення із веб-запиту та заздалегідь прописаного значення.
21
- * Дозволяє змінювати наповнення сторінки через ряд перевірок. Є можливість внесення додаткової умови - що робити, коли умова не виконується.
22
- *
23
- * @summary Перевірка двох значень та виконання коду при виконанні умови, а також у всіх інших випадках.
24
- * @priority 5
25
- * @alias ifCond
26
- * @type helper
27
- * @tag condition
28
- * @example
29
- * {{#ifCond @root.req.domain 'in' 'help.softpro.ua,123'}} {{select user.uid data="get_full_uid"}} {{^}} Умова не виконана {{/ifCond}}
30
- * @example
31
- * {{#ifCond "1234567890" 'in' @root.user.group_list}} 1=1 {{^}} uid='{{uid}}' {{/ifCond}}
32
- * @example
33
- * {{#ifCond 'debug' 'in' @root.setting.core.setting}}Умова виконана{{^}}Не виконана умова{{/ifCond}}
34
- * @param {Array} args Параметри для значень і умов
35
- * @param {Array} args[0]] Перше значення
36
- * @param {Array} args[1]] Оператор
37
- * @param {Array} args[2]] Друге значення
38
- * @returns {String} Returns HTML
39
- */
40
- export default function ifCond(v1, operator, v2, options) {
41
- const __obj = this;
42
-
43
- const isEmpty = (val) => val === null || val === undefined || (Array.isArray(val) && val.length === 0) || val === '';
44
-
45
- switch (operator) {
46
- case '==':
47
- return (v1 == v2) ? options.fn(__obj) : options.inverse(__obj);
48
- case '!=':
49
- return (v1 != v2) ? options.fn(__obj) : options.inverse(__obj);
50
- case '===':
51
- return (v1 === v2) ? options.fn(__obj) : options.inverse(__obj);
52
- case '!==':
53
- return (v1 !== v2) ? options.fn(__obj) : options.inverse(__obj);
54
- case '&&':
55
- return (v1 && v2) ? options.fn(__obj) : options.inverse(__obj);
56
- case '||':
57
- return (v1 || v2) ? options.fn(__obj) : options.inverse(__obj);
58
- case '<':
59
- return (v1 < v2) ? options.fn(__obj) : options.inverse(__obj);
60
- case '<=':
61
- return (v1 <= v2) ? options.fn(__obj) : options.inverse(__obj);
62
- case '>':
63
- return (v1 > v2) ? options.fn(__obj) : options.inverse(__obj);
64
- case '>=':
65
- return (v1 >= v2) ? options.fn(__obj) : options.inverse(__obj);
66
- case '&':
67
- return (!isEmpty(v1) && !isEmpty(v2) && intersect(v1, v2).length !== 0)
68
- ? options.fn(__obj)
69
- : options.inverse(__obj);
70
- case '!~':
71
- return (v1 || '').indexOf(v2) === -1
72
- ? options.fn(__obj)
73
- : options.inverse(__obj);
74
- case '~':
75
- return (v1 || '').indexOf(v2) !== -1
76
- ? options.fn(__obj)
77
- : options.inverse(__obj);
78
- case 'period':
79
- return (!isEmpty(v1) && !isEmpty(v2) && new Date(v1) < new Date() && new Date(v2) > new Date())
80
- ? options.fn(__obj)
81
- : options.inverse(__obj);
82
- case 'in': {
83
- if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
84
- if (isEmpty(v1) || isEmpty(v2)) return options.inverse(__obj);
85
-
86
- if (Array.isArray(v1)) {
87
- return v1.some((value) => v2.includes(value.toString()))
88
- ? options.fn(__obj)
89
- : options.inverse(__obj);
90
- }
91
- return v2.includes(v1.toString())
92
- ? options.fn(__obj)
93
- : options.inverse(__obj);
94
- }
95
- case 'not in': {
96
- if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
97
- if (isEmpty(v1) || isEmpty(v2)) return options.inverse(__obj);
98
-
99
- return !v2.includes(v1.toString())
100
- ? options.fn(__obj)
101
- : options.inverse(__obj);
102
- }
103
- default:
104
- return options.inverse(__obj);
105
- }
106
- }
1
+ /**
2
+ * Перетинає два масиви
3
+ *
4
+ * @example
5
+ * // returns [1, 4, 5, 6]
6
+ * intersect([1,2,3,4,5,6],[1,4,5,6,7,8,9,11])
7
+ * @param {Array} a
8
+ * @param {Array} b
9
+ * @returns {Array} Returns new intersect array
10
+ */
11
+ function intersect(a, b) {
12
+ let aN = a; let bN = b;
13
+ if (b.length > a.length) {
14
+ [aN, bN] = [bN, aN];
15
+ }
16
+ return aN.filter((e) => bN.includes(e));
17
+ }
18
+
19
+ /**
20
+ * Створення шаблона або його частини внаслідок перевірки значення із веб-запиту та заздалегідь прописаного значення.
21
+ * Дозволяє змінювати наповнення сторінки через ряд перевірок. Є можливість внесення додаткової умови - що робити, коли умова не виконується.
22
+ *
23
+ * @summary Перевірка двох значень та виконання коду при виконанні умови, а також у всіх інших випадках.
24
+ * @priority 5
25
+ * @alias ifCond
26
+ * @type helper
27
+ * @tag condition
28
+ * @example
29
+ * {{#ifCond @root.req.domain 'in' 'help.softpro.ua,123'}} {{select user.uid data="get_full_uid"}} {{^}} Умова не виконана {{/ifCond}}
30
+ * @example
31
+ * {{#ifCond "1234567890" 'in' @root.user.group_list}} 1=1 {{^}} uid='{{uid}}' {{/ifCond}}
32
+ * @example
33
+ * {{#ifCond 'debug' 'in' @root.setting.core.setting}}Умова виконана{{^}}Не виконана умова{{/ifCond}}
34
+ * @param {Array} args Параметри для значень і умов
35
+ * @param {Array} args[0]] Перше значення
36
+ * @param {Array} args[1]] Оператор
37
+ * @param {Array} args[2]] Друге значення
38
+ * @returns {String} Returns HTML
39
+ */
40
+ export default function ifCond(v1, operator, v2, options) {
41
+ const __obj = this;
42
+
43
+ const isEmpty = (val) => val === null || val === undefined || (Array.isArray(val) && val.length === 0) || val === '';
44
+
45
+ switch (operator) {
46
+ case '==':
47
+ return (v1 == v2) ? options.fn(__obj) : options.inverse(__obj);
48
+ case '!=':
49
+ return (v1 != v2) ? options.fn(__obj) : options.inverse(__obj);
50
+ case '===':
51
+ return (v1 === v2) ? options.fn(__obj) : options.inverse(__obj);
52
+ case '!==':
53
+ return (v1 !== v2) ? options.fn(__obj) : options.inverse(__obj);
54
+ case '&&':
55
+ return (v1 && v2) ? options.fn(__obj) : options.inverse(__obj);
56
+ case '||':
57
+ return (v1 || v2) ? options.fn(__obj) : options.inverse(__obj);
58
+ case '<':
59
+ return (v1 < v2) ? options.fn(__obj) : options.inverse(__obj);
60
+ case '<=':
61
+ return (v1 <= v2) ? options.fn(__obj) : options.inverse(__obj);
62
+ case '>':
63
+ return (v1 > v2) ? options.fn(__obj) : options.inverse(__obj);
64
+ case '>=':
65
+ return (v1 >= v2) ? options.fn(__obj) : options.inverse(__obj);
66
+ case '&':
67
+ return (!isEmpty(v1) && !isEmpty(v2) && intersect(v1, v2).length !== 0)
68
+ ? options.fn(__obj)
69
+ : options.inverse(__obj);
70
+ case '!~':
71
+ return (v1 || '').indexOf(v2) === -1
72
+ ? options.fn(__obj)
73
+ : options.inverse(__obj);
74
+ case '~':
75
+ return (v1 || '').indexOf(v2) !== -1
76
+ ? options.fn(__obj)
77
+ : options.inverse(__obj);
78
+ case 'period':
79
+ return (!isEmpty(v1) && !isEmpty(v2) && new Date(v1) < new Date() && new Date(v2) > new Date())
80
+ ? options.fn(__obj)
81
+ : options.inverse(__obj);
82
+ case 'in': {
83
+ if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
84
+ if (isEmpty(v1) || isEmpty(v2)) return options.inverse(__obj);
85
+
86
+ if (Array.isArray(v1)) {
87
+ return v1.some((value) => v2.includes(value.toString()))
88
+ ? options.fn(__obj)
89
+ : options.inverse(__obj);
90
+ }
91
+ return v2.includes(v1.toString())
92
+ ? options.fn(__obj)
93
+ : options.inverse(__obj);
94
+ }
95
+ case 'not in': {
96
+ if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
97
+ if (isEmpty(v1) || isEmpty(v2)) return options.inverse(__obj);
98
+
99
+ return !v2.includes(v1.toString())
100
+ ? options.fn(__obj)
101
+ : options.inverse(__obj);
102
+ }
103
+ default:
104
+ return options.inverse(__obj);
105
+ }
106
+ }
@@ -1,96 +1,96 @@
1
- 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(',') : [];
4
-
5
- return aN.filter((e) => bN.includes(e));
6
- }
7
-
8
- /**
9
- * Створення шаблона або його частини внаслідок виконання одразу декількох перевірок, кожна з яких повинна повернути true.
10
- * Якщо хоча б одна умова не виконується, код у межах хелпера також не виконується.
11
- *
12
- * @summary Створення шаблона за перевіркою виконання декількох умов.
13
- * @priority 4
14
- * @type helper
15
- * @tag condition
16
- * @alias ifCondAnd
17
- * @example
18
- * {{#ifCondAnd 1 '==' 1 2 'in' '2,3' 2 'in' '1,2' }}1{{^}}2{{/ifCondAnd}}
19
- * @descr Виконання перевірки порівняння параметрів та їх входження до певного масиву (множини)
20
- * @example
21
- */
22
- export default function ifCondAnd() {
23
- const args = Array.from(arguments);
24
- const options = args.pop();
25
-
26
- const conditions = [];
27
- for (let i = 0; i < args.length; i += 3) {
28
- const v1 = args[i];
29
- const operator = args[i + 1];
30
- let v2 = args[i + 2];
31
-
32
- switch (operator) {
33
- case '==':
34
- conditions.push(v1 == v2);
35
- break;
36
- case '!=':
37
- conditions.push(v1 != v2);
38
- break;
39
- case '===':
40
- conditions.push(v1 === v2);
41
- break;
42
- case '!==':
43
- conditions.push(v1 !== v2);
44
- break;
45
- case '&&':
46
- conditions.push(v1 && v2);
47
- break;
48
- case '||':
49
- conditions.push(v1 || v2);
50
- break;
51
- case '<':
52
- conditions.push(v1 < v2);
53
- break;
54
- case '<=':
55
- conditions.push(v1 <= v2);
56
- break;
57
- case '>':
58
- conditions.push(v1 > v2);
59
- break;
60
- case '>=':
61
- conditions.push(v1 >= v2);
62
- break;
63
- case '&':
64
- conditions.push(intersect(v1, v2).length > 0);
65
- break;
66
- case '!~':
67
- conditions.push((v1 || '').indexOf(v2) === -1);
68
- break;
69
- case '~':
70
- conditions.push((v1 || '').indexOf(v2) !== -1);
71
- break;
72
- case 'period':
73
- conditions.push(new Date(v1) < new Date() && new Date(v2) > new Date());
74
- break;
75
- case 'in': {
76
- if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
77
- if (Array.isArray(v1)) {
78
- conditions.push(v1.some((value) => v2.includes(value.toString())));
79
- } else {
80
- conditions.push(v2.includes(v1.toString()));
81
- }
82
- break;
83
- }
84
- case 'not in': {
85
- if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
86
- conditions.push(!v2.includes(v1.toString()));
87
- break;
88
- }
89
- default:
90
- conditions.push(false);
91
- break;
92
- }
93
- }
94
-
95
- return conditions.every(Boolean) ? options.fn(this) : options.inverse(this);
96
- }
1
+ 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(',') : [];
4
+
5
+ return aN.filter((e) => bN.includes(e));
6
+ }
7
+
8
+ /**
9
+ * Створення шаблона або його частини внаслідок виконання одразу декількох перевірок, кожна з яких повинна повернути true.
10
+ * Якщо хоча б одна умова не виконується, код у межах хелпера також не виконується.
11
+ *
12
+ * @summary Створення шаблона за перевіркою виконання декількох умов.
13
+ * @priority 4
14
+ * @type helper
15
+ * @tag condition
16
+ * @alias ifCondAnd
17
+ * @example
18
+ * {{#ifCondAnd 1 '==' 1 2 'in' '2,3' 2 'in' '1,2' }}1{{^}}2{{/ifCondAnd}}
19
+ * @descr Виконання перевірки порівняння параметрів та їх входження до певного масиву (множини)
20
+ * @example
21
+ */
22
+ export default function ifCondAnd() {
23
+ const args = Array.from(arguments);
24
+ const options = args.pop();
25
+
26
+ const conditions = [];
27
+ for (let i = 0; i < args.length; i += 3) {
28
+ const v1 = args[i];
29
+ const operator = args[i + 1];
30
+ let v2 = args[i + 2];
31
+
32
+ switch (operator) {
33
+ case '==':
34
+ conditions.push(v1 == v2);
35
+ break;
36
+ case '!=':
37
+ conditions.push(v1 != v2);
38
+ break;
39
+ case '===':
40
+ conditions.push(v1 === v2);
41
+ break;
42
+ case '!==':
43
+ conditions.push(v1 !== v2);
44
+ break;
45
+ case '&&':
46
+ conditions.push(v1 && v2);
47
+ break;
48
+ case '||':
49
+ conditions.push(v1 || v2);
50
+ break;
51
+ case '<':
52
+ conditions.push(v1 < v2);
53
+ break;
54
+ case '<=':
55
+ conditions.push(v1 <= v2);
56
+ break;
57
+ case '>':
58
+ conditions.push(v1 > v2);
59
+ break;
60
+ case '>=':
61
+ conditions.push(v1 >= v2);
62
+ break;
63
+ case '&':
64
+ conditions.push(intersect(v1, v2).length > 0);
65
+ break;
66
+ case '!~':
67
+ conditions.push((v1 || '').indexOf(v2) === -1);
68
+ break;
69
+ case '~':
70
+ conditions.push((v1 || '').indexOf(v2) !== -1);
71
+ break;
72
+ case 'period':
73
+ conditions.push(new Date(v1) < new Date() && new Date(v2) > new Date());
74
+ break;
75
+ case 'in': {
76
+ if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
77
+ if (Array.isArray(v1)) {
78
+ conditions.push(v1.some((value) => v2.includes(value.toString())));
79
+ } else {
80
+ conditions.push(v2.includes(v1.toString()));
81
+ }
82
+ break;
83
+ }
84
+ case 'not in': {
85
+ if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
86
+ conditions.push(!v2.includes(v1.toString()));
87
+ break;
88
+ }
89
+ default:
90
+ conditions.push(false);
91
+ break;
92
+ }
93
+ }
94
+
95
+ return conditions.every(Boolean) ? options.fn(this) : options.inverse(this);
96
+ }
@@ -1,98 +1,98 @@
1
- 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(',') : [];
4
-
5
- return aN.filter((e) => bN.includes(e));
6
- }
7
-
8
-
9
- /**
10
- * Створення шаблона або його частини внаслідок виконання одразу декількох перевірок, хоча б одна з яких повинна повернути true
11
- *
12
- * @summary Створення шаблона за перевіркою "АБО". Повинна виконатись хоча б одна умова.
13
- * @priority 4
14
- * @type helper
15
- * @tag condition
16
- * @alias ifCondOr
17
- * @example
18
- * {{#ifCondOr 1 '==' 1 2 'in' '2,3' 2 'in' '1,2' }}Хоча б одна умова виконана{{^}}Жодна умова не була виконана{{/ifCondOr}}
19
- * @descr Виконання перевірки порівняння параметрів та їх входження до певного масиву (множини)
20
- * @example
21
- * @param {Array} args Параметри для значень і умов
22
- * @returns {String} Returns HTML
23
- */
24
- export default function ifCondOr() {
25
- const args = Array.from(arguments);
26
- const options = args.pop();
27
-
28
- const conditions = [];
29
- for (let i = 0; i < args.length; i += 3) {
30
- const v1 = args[i];
31
- const operator = args[i + 1];
32
- let v2 = args[i + 2];
33
-
34
- switch (operator) {
35
- case '==':
36
- conditions.push(v1 == v2);
37
- break;
38
- case '!=':
39
- conditions.push(v1 != v2);
40
- break;
41
- case '===':
42
- conditions.push(v1 === v2);
43
- break;
44
- case '!==':
45
- conditions.push(v1 !== v2);
46
- break;
47
- case '&&':
48
- conditions.push(v1 && v2);
49
- break;
50
- case '||':
51
- conditions.push(v1 || v2);
52
- break;
53
- case '<':
54
- conditions.push(v1 < v2);
55
- break;
56
- case '<=':
57
- conditions.push(v1 <= v2);
58
- break;
59
- case '>':
60
- conditions.push(v1 > v2);
61
- break;
62
- case '>=':
63
- conditions.push(v1 >= v2);
64
- break;
65
- case '&':
66
- conditions.push(intersect(v1, v2).length > 0);
67
- break;
68
- case '!~':
69
- conditions.push((v1 || '').indexOf(v2) === -1);
70
- break;
71
- case '~':
72
- conditions.push((v1 || '').indexOf(v2) !== -1);
73
- break;
74
- case 'period':
75
- conditions.push(new Date(v1) < new Date() && new Date(v2) > new Date());
76
- break;
77
- case 'in': {
78
- if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
79
- if (Array.isArray(v1)) {
80
- conditions.push(v1.some((value) => v2.includes(value.toString())));
81
- } else {
82
- conditions.push(v2.includes(v1.toString()));
83
- }
84
- break;
85
- }
86
- case 'not in': {
87
- if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
88
- conditions.push(!v2.includes(v1.toString()));
89
- break;
90
- }
91
- default:
92
- conditions.push(false);
93
- break;
94
- }
95
- }
96
-
97
- return conditions.some(Boolean) ? options.fn(this) : options.inverse(this);
98
- }
1
+ 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(',') : [];
4
+
5
+ return aN.filter((e) => bN.includes(e));
6
+ }
7
+
8
+
9
+ /**
10
+ * Створення шаблона або його частини внаслідок виконання одразу декількох перевірок, хоча б одна з яких повинна повернути true
11
+ *
12
+ * @summary Створення шаблона за перевіркою "АБО". Повинна виконатись хоча б одна умова.
13
+ * @priority 4
14
+ * @type helper
15
+ * @tag condition
16
+ * @alias ifCondOr
17
+ * @example
18
+ * {{#ifCondOr 1 '==' 1 2 'in' '2,3' 2 'in' '1,2' }}Хоча б одна умова виконана{{^}}Жодна умова не була виконана{{/ifCondOr}}
19
+ * @descr Виконання перевірки порівняння параметрів та їх входження до певного масиву (множини)
20
+ * @example
21
+ * @param {Array} args Параметри для значень і умов
22
+ * @returns {String} Returns HTML
23
+ */
24
+ export default function ifCondOr() {
25
+ const args = Array.from(arguments);
26
+ const options = args.pop();
27
+
28
+ const conditions = [];
29
+ for (let i = 0; i < args.length; i += 3) {
30
+ const v1 = args[i];
31
+ const operator = args[i + 1];
32
+ let v2 = args[i + 2];
33
+
34
+ switch (operator) {
35
+ case '==':
36
+ conditions.push(v1 == v2);
37
+ break;
38
+ case '!=':
39
+ conditions.push(v1 != v2);
40
+ break;
41
+ case '===':
42
+ conditions.push(v1 === v2);
43
+ break;
44
+ case '!==':
45
+ conditions.push(v1 !== v2);
46
+ break;
47
+ case '&&':
48
+ conditions.push(v1 && v2);
49
+ break;
50
+ case '||':
51
+ conditions.push(v1 || v2);
52
+ break;
53
+ case '<':
54
+ conditions.push(v1 < v2);
55
+ break;
56
+ case '<=':
57
+ conditions.push(v1 <= v2);
58
+ break;
59
+ case '>':
60
+ conditions.push(v1 > v2);
61
+ break;
62
+ case '>=':
63
+ conditions.push(v1 >= v2);
64
+ break;
65
+ case '&':
66
+ conditions.push(intersect(v1, v2).length > 0);
67
+ break;
68
+ case '!~':
69
+ conditions.push((v1 || '').indexOf(v2) === -1);
70
+ break;
71
+ case '~':
72
+ conditions.push((v1 || '').indexOf(v2) !== -1);
73
+ break;
74
+ case 'period':
75
+ conditions.push(new Date(v1) < new Date() && new Date(v2) > new Date());
76
+ break;
77
+ case 'in': {
78
+ if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
79
+ if (Array.isArray(v1)) {
80
+ conditions.push(v1.some((value) => v2.includes(value.toString())));
81
+ } else {
82
+ conditions.push(v2.includes(v1.toString()));
83
+ }
84
+ break;
85
+ }
86
+ case 'not in': {
87
+ if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
88
+ conditions.push(!v2.includes(v1.toString()));
89
+ break;
90
+ }
91
+ default:
92
+ conditions.push(false);
93
+ break;
94
+ }
95
+ }
96
+
97
+ return conditions.some(Boolean) ? options.fn(this) : options.inverse(this);
98
+ }
@@ -1,21 +1,21 @@
1
- /**
2
- * Складення двох значень з масива
3
- *
4
- * @summary Складення двох значень з масива. Є можливість використання у якості порядокового номеру
5
- * @priority 3
6
- * @type helper
7
- * @alias inc
8
- * @tag math
9
- * @example
10
- * {{{inc (coalesce @index 0)}}}
11
- * @descr При використанні в межах циклу, дозволяє відображати віртуальний індекс
12
- * @param {Array} args Масив чисел для складання
13
- * @returns {String} Returns HTML
14
- */
15
- export default function inc(...args) {
16
- const firstValue = args[0] || 0;
17
- const secondValue = typeof args[1] === 'number' ? args[1] : 1;
18
-
19
- return firstValue + secondValue;
20
- }
1
+ /**
2
+ * Складення двох значень з масива
3
+ *
4
+ * @summary Складення двох значень з масива. Є можливість використання у якості порядокового номеру
5
+ * @priority 3
6
+ * @type helper
7
+ * @alias inc
8
+ * @tag math
9
+ * @example
10
+ * {{{inc (coalesce @index 0)}}}
11
+ * @descr При використанні в межах циклу, дозволяє відображати віртуальний індекс
12
+ * @param {Array} args Масив чисел для складання
13
+ * @returns {String} Returns HTML
14
+ */
15
+ export default function inc(...args) {
16
+ const firstValue = args[0] || 0;
17
+ const secondValue = typeof args[1] === 'number' ? args[1] : 1;
18
+
19
+ return firstValue + secondValue;
20
+ }
21
21
 
@@ -1,3 +1,3 @@
1
- export default function (data) {
2
- return JSON.stringify(data, null, 2)
1
+ export default function (data) {
2
+ return JSON.stringify(data, null, 2)
3
3
  }