@opengis/fastify-table 1.0.26 → 1.0.27

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 (86) hide show
  1. package/.eslintrc.cjs +42 -42
  2. package/Changelog.md +81 -81
  3. package/README.md +26 -26
  4. package/config.js +11 -11
  5. package/crud/controllers/deleteCrud.js +14 -14
  6. package/crud/controllers/insert.js +29 -29
  7. package/crud/controllers/update.js +31 -31
  8. package/crud/controllers/utils/checkXSS.js +45 -45
  9. package/crud/controllers/utils/xssInjection.js +72 -72
  10. package/crud/funcs/dataDelete.js +15 -15
  11. package/crud/funcs/dataInsert.js +24 -24
  12. package/crud/funcs/dataUpdate.js +24 -20
  13. package/crud/funcs/getOpt.js +10 -10
  14. package/crud/funcs/getToken.js +27 -27
  15. package/crud/funcs/isFileExists.js +13 -13
  16. package/crud/funcs/setOpt.js +16 -16
  17. package/crud/funcs/setToken.js +53 -53
  18. package/crud/index.js +29 -29
  19. package/dblist/controllers/createItem.js +17 -17
  20. package/dblist/controllers/deleteItem.js +12 -12
  21. package/dblist/controllers/readItems.js +8 -8
  22. package/dblist/controllers/updateItem.js +22 -22
  23. package/dblist/controllers/utils/checkItem.js +9 -9
  24. package/dblist/index.js +40 -40
  25. package/helper.js +28 -28
  26. package/index.js +41 -41
  27. package/notification/controllers/userNotifications.js +19 -19
  28. package/notification/funcs/addNotification.js +8 -8
  29. package/notification/index.js +19 -19
  30. package/package.json +22 -22
  31. package/pg/funcs/getPG.js +29 -29
  32. package/pg/pgClients.js +20 -20
  33. package/policy/funcs/checkPolicy.js +74 -74
  34. package/policy/funcs/sqlInjection.js +33 -33
  35. package/policy/index.js +14 -14
  36. package/redis/client.js +8 -8
  37. package/redis/funcs/getRedis.js +23 -23
  38. package/redis/funcs/redisClients.js +2 -2
  39. package/redis/index.js +19 -19
  40. package/server/migrations/crm.sql +57 -57
  41. package/server/migrations/log.sql +41 -41
  42. package/server/migrations/notifications.sql +14 -14
  43. package/server/templates/form/test.dataset.form.json +411 -411
  44. package/server/templates/select/test.storage.data.json +2 -2
  45. package/server/templates/table/test.dataset.table.json +24 -24
  46. package/server.js +14 -14
  47. package/table/controllers/data.js +57 -57
  48. package/table/controllers/filter.js +32 -32
  49. package/table/controllers/form.js +10 -10
  50. package/table/controllers/search.js +41 -41
  51. package/table/controllers/suggest.js +60 -60
  52. package/table/controllers/utils/getSelect.js +20 -20
  53. package/table/controllers/utils/getSelectMeta.js +66 -66
  54. package/table/controllers/utils/getTemplate.js +28 -28
  55. package/table/funcs/getFilterSQL/index.js +75 -75
  56. package/table/funcs/getFilterSQL/util/formatValue.js +142 -142
  57. package/table/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  58. package/table/funcs/getFilterSQL/util/getFilterQuery.js +73 -73
  59. package/table/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
  60. package/table/funcs/getFilterSQL/util/getTableSql.js +34 -34
  61. package/table/funcs/metaFormat/getSelectVal.js +20 -20
  62. package/table/funcs/metaFormat/index.js +26 -26
  63. package/table/index.js +42 -42
  64. package/test/api/crud.test.js +56 -56
  65. package/test/api/crud.xss.test.js +71 -71
  66. package/test/api/dblist.test.js +47 -47
  67. package/test/api/notification.test.js +37 -37
  68. package/test/api/table.test.js +57 -57
  69. package/test/api/widget.test.js +39 -39
  70. package/test/config.example +18 -18
  71. package/test/funcs/crud.test.js +76 -76
  72. package/test/funcs/notification.test.js +31 -31
  73. package/test/funcs/pg.test.js +34 -34
  74. package/test/funcs/redis.test.js +19 -19
  75. package/test/templates/cls/test.json +9 -9
  76. package/test/templates/form/cp_building.form.json +32 -32
  77. package/test/templates/select/account_id.json +3 -3
  78. package/test/templates/select/storage.data.json +2 -2
  79. package/test/templates/table/gis.dataset.table.json +20 -20
  80. package/test/widget.test.js +39 -39
  81. package/widget/controllers/utils/historyFormat.js +76 -76
  82. package/widget/controllers/utils/obj2db.js +13 -13
  83. package/widget/controllers/widget.del.js +40 -40
  84. package/widget/controllers/widget.get.js +74 -74
  85. package/widget/controllers/widget.set.js +45 -45
  86. package/widget/index.js +29 -29
package/.eslintrc.cjs CHANGED
@@ -1,42 +1,42 @@
1
- /* eslint-env node */
2
-
3
- module.exports = {
4
- env: {
5
- node: true,
6
- },
7
- root: true,
8
- extends: [
9
- 'eslint:recommended',
10
- 'airbnb-base',
11
-
12
- ],
13
- rules: {
14
- 'brace-style': [2, 'stroustrup', { allowSingleLine: true }],
15
- 'vue/max-attributes-per-line': 0,
16
- 'vue/valid-v-for': 0,
17
-
18
- // allow async-await
19
- 'generator-star-spacing': 'off',
20
-
21
- // allow paren-less arrow functions
22
- 'arrow-parens': 0,
23
- 'one-var': 0,
24
- 'max-len': 0,
25
- 'import/first': 0,
26
- 'import/named': 2,
27
- 'import/namespace': 2,
28
- 'import/default': 2,
29
- 'import/export': 2,
30
- 'import/extensions': 0,
31
- 'no-console': ['warn', { allow: ['warn', 'error'] }],
32
- 'import/no-unresolved': 0,
33
- 'import/no-extraneous-dependencies': 0,
34
- 'linebreak-style': ['error', 'unix'],
35
- // allow debugger during development
36
- 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
37
- },
38
-
39
- parserOptions: {
40
- ecmaVersion: 'latest',
41
- },
42
- };
1
+ /* eslint-env node */
2
+
3
+ module.exports = {
4
+ env: {
5
+ node: true,
6
+ },
7
+ root: true,
8
+ extends: [
9
+ 'eslint:recommended',
10
+ 'airbnb-base',
11
+
12
+ ],
13
+ rules: {
14
+ 'brace-style': [2, 'stroustrup', { allowSingleLine: true }],
15
+ 'vue/max-attributes-per-line': 0,
16
+ 'vue/valid-v-for': 0,
17
+
18
+ // allow async-await
19
+ 'generator-star-spacing': 'off',
20
+
21
+ // allow paren-less arrow functions
22
+ 'arrow-parens': 0,
23
+ 'one-var': 0,
24
+ 'max-len': 0,
25
+ 'import/first': 0,
26
+ 'import/named': 2,
27
+ 'import/namespace': 2,
28
+ 'import/default': 2,
29
+ 'import/export': 2,
30
+ 'import/extensions': 0,
31
+ 'no-console': ['warn', { allow: ['warn', 'error'] }],
32
+ 'import/no-unresolved': 0,
33
+ 'import/no-extraneous-dependencies': 0,
34
+ 'linebreak-style': ['error', 'unix'],
35
+ // allow debugger during development
36
+ 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
37
+ },
38
+
39
+ parserOptions: {
40
+ ecmaVersion: 'latest',
41
+ },
42
+ };
package/Changelog.md CHANGED
@@ -1,81 +1,81 @@
1
- # fastify-table
2
-
3
- ## 1.0.26 - 09.05.2024
4
-
5
- - fix getTableSql
6
-
7
- ## 1.0.25 - 08.05.2024
8
-
9
- - decorator to hook
10
-
11
- ## 1.0.24 - 07.05.2024
12
-
13
- - getTemplate page
14
-
15
- ## 1.0.23 - 07.05.2024
16
-
17
- - getTemplate funcs
18
- - dblist api
19
-
20
- ## 1.0.22 - 03.05.2024
21
-
22
- - getFilterSQL funcs
23
-
24
- ## 1.0.21 - 03.05.2024
25
-
26
- - fix widget db structure
27
-
28
- ## 1.0.20 - 03.05.2024
29
-
30
- - fix filter separator
31
-
32
- ## 1.0.19 - 02.05.2024
33
-
34
- - widget plugin
35
- - notification plugin
36
-
37
- ## 1.0.9 - 29.04.2024
38
-
39
- - crud token support
40
- - security - xss restriction
41
-
42
- ## 1.0.8 - 29.04.2024
43
-
44
- - filter fix
45
-
46
- ## 1.0.7 - 26.04.2024
47
-
48
- - code optimization
49
-
50
- ## 1.0.6 - 25.04.2024
51
-
52
- - code optimization
53
-
54
- ## 1.0.5 - 24.04.2024
55
-
56
- - code optimization
57
-
58
- ## 1.0.4 - 20.04.2024
59
-
60
- - data api - order
61
- - suggest api - db support
62
- - del api fix
63
-
64
- ## 1.0.3 - 17.04.2024
65
-
66
- - fix unit test
67
-
68
- ## 1.0.2 - 14.04.2024
69
-
70
- - fix redis
71
-
72
- ## 1.0.1 - 14.04.2024
73
-
74
- - fix redis
75
-
76
- ## 1.0.0 - 14.04.2024
77
-
78
- - crud
79
- - pg
80
- - redis
81
- - table
1
+ # fastify-table
2
+
3
+ ## 1.0.26 - 09.05.2024
4
+
5
+ - fix getTableSql
6
+
7
+ ## 1.0.25 - 08.05.2024
8
+
9
+ - decorator to hook
10
+
11
+ ## 1.0.24 - 07.05.2024
12
+
13
+ - getTemplate page
14
+
15
+ ## 1.0.23 - 07.05.2024
16
+
17
+ - getTemplate funcs
18
+ - dblist api
19
+
20
+ ## 1.0.22 - 03.05.2024
21
+
22
+ - getFilterSQL funcs
23
+
24
+ ## 1.0.21 - 03.05.2024
25
+
26
+ - fix widget db structure
27
+
28
+ ## 1.0.20 - 03.05.2024
29
+
30
+ - fix filter separator
31
+
32
+ ## 1.0.19 - 02.05.2024
33
+
34
+ - widget plugin
35
+ - notification plugin
36
+
37
+ ## 1.0.9 - 29.04.2024
38
+
39
+ - crud token support
40
+ - security - xss restriction
41
+
42
+ ## 1.0.8 - 29.04.2024
43
+
44
+ - filter fix
45
+
46
+ ## 1.0.7 - 26.04.2024
47
+
48
+ - code optimization
49
+
50
+ ## 1.0.6 - 25.04.2024
51
+
52
+ - code optimization
53
+
54
+ ## 1.0.5 - 24.04.2024
55
+
56
+ - code optimization
57
+
58
+ ## 1.0.4 - 20.04.2024
59
+
60
+ - data api - order
61
+ - suggest api - db support
62
+ - del api fix
63
+
64
+ ## 1.0.3 - 17.04.2024
65
+
66
+ - fix unit test
67
+
68
+ ## 1.0.2 - 14.04.2024
69
+
70
+ - fix redis
71
+
72
+ ## 1.0.1 - 14.04.2024
73
+
74
+ - fix redis
75
+
76
+ ## 1.0.0 - 14.04.2024
77
+
78
+ - crud
79
+ - pg
80
+ - redis
81
+ - table
package/README.md CHANGED
@@ -1,26 +1,26 @@
1
- # fastify-table
2
-
3
- [![NPM version](https://img.shields.io/npm/v/@opengis/fastify-table)](https://www.npmjs.com/package/@opengis/fastify-table)
4
- [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](http://standardjs.com/)
5
-
6
- It standardizes the entire form building process, while taking care of everything from rendering to validation and processing:
7
-
8
- - pg
9
- - redis
10
- - crud
11
-
12
- ## Install
13
-
14
- ```bash
15
- npm i @opengis/fastify-table
16
- ```
17
-
18
- ## Usage
19
-
20
- ```js
21
- fastify.register(import('@opengis/fastify-table'), config);
22
- ```
23
-
24
- ## Documenation
25
-
26
- For a detailed understanding fastify-table, its features, and how to use them, refer to our [Documentation](https://apidocs.softpro.ua/gis.storage/).
1
+ # fastify-table
2
+
3
+ [![NPM version](https://img.shields.io/npm/v/@opengis/fastify-table)](https://www.npmjs.com/package/@opengis/fastify-table)
4
+ [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](http://standardjs.com/)
5
+
6
+ It standardizes the entire form building process, while taking care of everything from rendering to validation and processing:
7
+
8
+ - pg
9
+ - redis
10
+ - crud
11
+
12
+ ## Install
13
+
14
+ ```bash
15
+ npm i @opengis/fastify-table
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ ```js
21
+ fastify.register(import('@opengis/fastify-table'), config);
22
+ ```
23
+
24
+ ## Documenation
25
+
26
+ For a detailed understanding fastify-table, its features, and how to use them, refer to our [Documentation](https://apidocs.softpro.ua/gis.storage/).
package/config.js CHANGED
@@ -1,11 +1,11 @@
1
- import fs from 'fs';
2
-
3
- const config = fs.existsSync('config.json')
4
- ? JSON.parse(fs.readFileSync('config.json'))
5
- : {};
6
-
7
- Object.assign(config, {
8
- allTemplates: config?.allTemplates || {},
9
- });
10
-
11
- export default config;
1
+ import fs from 'fs';
2
+
3
+ const config = fs.existsSync('config.json')
4
+ ? JSON.parse(fs.readFileSync('config.json'))
5
+ : {};
6
+
7
+ Object.assign(config, {
8
+ allTemplates: config?.allTemplates || {},
9
+ });
10
+
11
+ export default config;
@@ -1,14 +1,14 @@
1
- import dataDelete from '../funcs/dataDelete.js';
2
- import getTemplate from '../../table/controllers/utils/getTemplate.js';
3
-
4
- export default async function deleteCrud(req) {
5
- const loadTemplate = await getTemplate('table', req.params.table);
6
- const { table } = loadTemplate || req.params || {};
7
- const { id } = req.params || {};
8
-
9
- if (!table) return { status: 404, message: 'table is required' };
10
-
11
- const data = await dataDelete({ table, id });
12
-
13
- return { rowCount: data.rowCount, msg: !data.rowCount ? data : null };
14
- }
1
+ import dataDelete from '../funcs/dataDelete.js';
2
+ import getTemplate from '../../table/controllers/utils/getTemplate.js';
3
+
4
+ export default async function deleteCrud(req) {
5
+ const loadTemplate = await getTemplate('table', req.params.table);
6
+ const { table } = loadTemplate || req.params || {};
7
+ const { id } = req.params || {};
8
+
9
+ if (!table) return { status: 404, message: 'table is required' };
10
+
11
+ const data = await dataDelete({ table, id });
12
+
13
+ return { rowCount: data.rowCount, msg: !data.rowCount ? data : null };
14
+ }
@@ -1,29 +1,29 @@
1
- import dataInsert from '../funcs/dataInsert.js';
2
- import getToken from '../funcs/getToken.js';
3
- import checkXSS from './utils/checkXSS.js';
4
- import getTemplate from '../../table/controllers/utils/getTemplate.js';
5
-
6
- export default async function insert(req) {
7
- const loadTemplate = await getTemplate('table', req.params.table);
8
- const { table } = loadTemplate || req.params || {};
9
- if (!table) return { status: 404, message: 'table is required' };
10
-
11
- const { funcs, session, params } = req;
12
- const tokenDataString = await getToken({
13
- funcs, session, token: params.table, mode: 'a', json: 0,
14
- });
15
-
16
- const { form, add } = JSON.parse(tokenDataString || '{}');
17
-
18
- const formData = form ? await getTemplate('form', form) : {};
19
-
20
- const xssCheck = checkXSS({ body: req.body, schema: formData?.schema });
21
-
22
- if (xssCheck.error && formData?.xssCheck !== false) {
23
- req.log.warn({ name: 'injection/xss', msg: xssCheck.error, table }, req);
24
- return { message: 'Дані містять заборонені символи. Приберіть їх та спробуйте ще раз', status: 409 };
25
- }
26
-
27
- const res = await dataInsert({ table: add || table, data: req.body });
28
- return { rows: res.rows };
29
- }
1
+ import dataInsert from '../funcs/dataInsert.js';
2
+ import getToken from '../funcs/getToken.js';
3
+ import checkXSS from './utils/checkXSS.js';
4
+ import getTemplate from '../../table/controllers/utils/getTemplate.js';
5
+
6
+ export default async function insert(req) {
7
+ const loadTemplate = await getTemplate('table', req.params.table);
8
+ const { table } = loadTemplate || req.params || {};
9
+ if (!table) return { status: 404, message: 'table is required' };
10
+
11
+ const { funcs, session, params } = req;
12
+ const tokenDataString = await getToken({
13
+ funcs, session, token: params.table, mode: 'a', json: 0,
14
+ });
15
+
16
+ const { form, add } = JSON.parse(tokenDataString || '{}');
17
+
18
+ const formData = form ? await getTemplate('form', form) : {};
19
+
20
+ const xssCheck = checkXSS({ body: req.body, schema: formData?.schema });
21
+
22
+ if (xssCheck.error && formData?.xssCheck !== false) {
23
+ req.log.warn({ name: 'injection/xss', msg: xssCheck.error, table }, req);
24
+ return { message: 'Дані містять заборонені символи. Приберіть їх та спробуйте ще раз', status: 409 };
25
+ }
26
+
27
+ const res = await dataInsert({ table: add || table, data: req.body });
28
+ return { rows: res.rows };
29
+ }
@@ -1,31 +1,31 @@
1
- import dataUpdate from '../funcs/dataUpdate.js';
2
- import getToken from '../funcs/getToken.js';
3
- import checkXSS from './utils/checkXSS.js';
4
- import getTemplate from '../../table/controllers/utils/getTemplate.js';
5
-
6
- export default async function update(req) {
7
- const loadTemplate = await getTemplate('table', req.params.table);
8
- const { table } = loadTemplate || req.params || {};
9
- const { id } = req.params || {};
10
- if (!req.params?.table) return { message: 'table is required', status: 404 };
11
- if (!id) return { message: 'id is required', status: 404 };
12
-
13
- const { funcs, session, params } = req;
14
- const tokenDataString = await getToken({
15
- funcs, session, token: params.table, mode: 'w', json: 0,
16
- });
17
-
18
- const tokenData = JSON.parse(tokenDataString || '{}');
19
-
20
- const formData = tokenData?.form ? await getTemplate('form', tokenData.form) : {};
21
-
22
- const xssCheck = checkXSS({ body: req.body, schema: formData?.schema });
23
-
24
- if (xssCheck.error && formData?.xssCheck !== false) {
25
- req.log.warn({ name: 'injection/xss', msg: xssCheck.error, table }, req);
26
- return { message: 'Дані містять заборонені символи. Приберіть їх та спробуйте ще раз', status: 409 };
27
- }
28
-
29
- const res = await dataUpdate({ table: tokenData?.table || table, id: tokenData?.id || id, data: req.body });
30
- return res;
31
- }
1
+ import dataUpdate from '../funcs/dataUpdate.js';
2
+ import getToken from '../funcs/getToken.js';
3
+ import checkXSS from './utils/checkXSS.js';
4
+ import getTemplate from '../../table/controllers/utils/getTemplate.js';
5
+
6
+ export default async function update(req) {
7
+ const loadTemplate = await getTemplate('table', req.params.table);
8
+ const { table } = loadTemplate || req.params || {};
9
+ const { id } = req.params || {};
10
+ if (!req.params?.table) return { message: 'table is required', status: 404 };
11
+ if (!id) return { message: 'id is required', status: 404 };
12
+
13
+ const { funcs, session, params } = req;
14
+ const tokenDataString = await getToken({
15
+ funcs, session, token: params.table, mode: 'w', json: 0,
16
+ });
17
+
18
+ const tokenData = JSON.parse(tokenDataString || '{}');
19
+
20
+ const formData = tokenData?.form ? await getTemplate('form', tokenData.form) : {};
21
+
22
+ const xssCheck = checkXSS({ body: req.body, schema: formData?.schema });
23
+
24
+ if (xssCheck.error && formData?.xssCheck !== false) {
25
+ req.log.warn({ name: 'injection/xss', msg: xssCheck.error, table }, req);
26
+ return { message: 'Дані містять заборонені символи. Приберіть їх та спробуйте ще раз', status: 409 };
27
+ }
28
+
29
+ const res = await dataUpdate({ table: tokenData?.table || table, id: tokenData?.id || id, data: req.body });
30
+ return res;
31
+ }
@@ -1,45 +1,45 @@
1
- /* import sqlInjection from '../../../policy/funcs/sqlInjection.js'; */
2
- import xssInjection from './xssInjection.js';
3
-
4
- /* const checkList = xssInjection.concat(sqlInjection); */
5
-
6
- // RTE - rich text editor
7
-
8
- function checkXSS({ body, schema = {} }) {
9
- const data = typeof body === 'string' ? body : JSON.stringify(body);
10
- const stopWords = xssInjection.filter((el) => data.toLowerCase().includes(el));
11
-
12
- // check sql injection
13
- const stopSpecialSymbols = data.match(/\p{S}OR\p{S}|\p{P}OR\p{P}| OR |\+OR\+/gi);
14
- if (stopSpecialSymbols?.length) stopSpecialSymbols?.forEach((el) => stopWords.push(el));
15
-
16
- // escape arrows on non-RTE
17
- Object.keys(body)
18
- .filter((key) => ['<', '>'].find((el) => body[key]?.includes?.(el))
19
- && !['Summernote', 'Tiny', 'Ace'].includes(schema[key]?.type))
20
- ?.forEach((key) => {
21
- Object.assign(body, { [key]: body[key].replace(/</g, '&lt;').replace(/>/g, '&gt;') });
22
- });
23
- // try { } catch (err) { return { error: err.toString() }; }
24
-
25
- if (!stopWords.length) return { body };
26
-
27
- const disabledCheckFields = Object.keys(schema)?.filter((el) => schema[el]?.xssCheck === false); // exclude specific columns
28
-
29
- // check RTE
30
- /* const richTextFields = Object.keys(schema).filter((el) => ['Summernote', 'Tiny', 'Ace'].includes(schema[el]?.type));
31
- richTextFields.filter((key) => !checkList.find((el) => body[key].includes(el)))?.forEach((key) => {
32
- disabledCheckFields.push(key);
33
- }); */
34
-
35
- const field = Object.keys(body)
36
- ?.find((key) => body[key]
37
- && !disabledCheckFields.includes(key)
38
- && body[key].toLowerCase().includes(stopWords[0]));
39
- if (field) {
40
- return { error: `rule: ${stopWords[0]} | attr: ${field} | val: ${body[field]}`, body };
41
- }
42
- return { body };
43
- }
44
-
45
- export default checkXSS;
1
+ /* import sqlInjection from '../../../policy/funcs/sqlInjection.js'; */
2
+ import xssInjection from './xssInjection.js';
3
+
4
+ /* const checkList = xssInjection.concat(sqlInjection); */
5
+
6
+ // RTE - rich text editor
7
+
8
+ function checkXSS({ body, schema = {} }) {
9
+ const data = typeof body === 'string' ? body : JSON.stringify(body);
10
+ const stopWords = xssInjection.filter((el) => data.toLowerCase().includes(el));
11
+
12
+ // check sql injection
13
+ const stopSpecialSymbols = data.match(/\p{S}OR\p{S}|\p{P}OR\p{P}| OR |\+OR\+/gi);
14
+ if (stopSpecialSymbols?.length) stopSpecialSymbols?.forEach((el) => stopWords.push(el));
15
+
16
+ // escape arrows on non-RTE
17
+ Object.keys(body)
18
+ .filter((key) => ['<', '>'].find((el) => body[key]?.includes?.(el))
19
+ && !['Summernote', 'Tiny', 'Ace'].includes(schema[key]?.type))
20
+ ?.forEach((key) => {
21
+ Object.assign(body, { [key]: body[key].replace(/</g, '&lt;').replace(/>/g, '&gt;') });
22
+ });
23
+ // try { } catch (err) { return { error: err.toString() }; }
24
+
25
+ if (!stopWords.length) return { body };
26
+
27
+ const disabledCheckFields = Object.keys(schema)?.filter((el) => schema[el]?.xssCheck === false); // exclude specific columns
28
+
29
+ // check RTE
30
+ /* const richTextFields = Object.keys(schema).filter((el) => ['Summernote', 'Tiny', 'Ace'].includes(schema[el]?.type));
31
+ richTextFields.filter((key) => !checkList.find((el) => body[key].includes(el)))?.forEach((key) => {
32
+ disabledCheckFields.push(key);
33
+ }); */
34
+
35
+ const field = Object.keys(body)
36
+ ?.find((key) => body[key]
37
+ && !disabledCheckFields.includes(key)
38
+ && body[key].toLowerCase().includes(stopWords[0]));
39
+ if (field) {
40
+ return { error: `rule: ${stopWords[0]} | attr: ${field} | val: ${body[field]}`, body };
41
+ }
42
+ return { body };
43
+ }
44
+
45
+ export default checkXSS;