@blazedpath/commons 0.0.4

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 (224) hide show
  1. package/README.md +3 -0
  2. package/blz-base/health/index.js +215 -0
  3. package/blz-base/index.js +1466 -0
  4. package/blz-cache/LruCache.js +44 -0
  5. package/blz-cache/index.js +29 -0
  6. package/blz-config/index.js +434 -0
  7. package/blz-core/index.js +364 -0
  8. package/blz-cryptography/index.js +54 -0
  9. package/blz-datetimes/index.js +356 -0
  10. package/blz-file/example.dat +2545 -0
  11. package/blz-file/fileService.js +205 -0
  12. package/blz-file/index.js +94 -0
  13. package/blz-file/index.test.js +31 -0
  14. package/blz-file/lab.js +33 -0
  15. package/blz-hazelcast/index.js +189 -0
  16. package/blz-hazelcast/lib/credentials.js +25 -0
  17. package/blz-hazelcast/lib/credentialsFactory.js +12 -0
  18. package/blz-hazelcast/lib/hazelcastCache.js +234 -0
  19. package/blz-iterable/index.js +446 -0
  20. package/blz-json-schema/index.js +11 -0
  21. package/blz-jwt/index.js +121 -0
  22. package/blz-kafka/index.js +522 -0
  23. package/blz-math/index.js +131 -0
  24. package/blz-mongodb/index.js +326 -0
  25. package/blz-rds/__test__/scape.test.js +58 -0
  26. package/blz-rds/blz-rds-executor.js +578 -0
  27. package/blz-rds/blz-rds-helper.js +310 -0
  28. package/blz-rds/commands/core/add.js +13 -0
  29. package/blz-rds/commands/core/and.js +18 -0
  30. package/blz-rds/commands/core/asc.js +10 -0
  31. package/blz-rds/commands/core/avg.js +10 -0
  32. package/blz-rds/commands/core/column-ref.js +8 -0
  33. package/blz-rds/commands/core/count-distinct.js +10 -0
  34. package/blz-rds/commands/core/count.js +10 -0
  35. package/blz-rds/commands/core/decimal.js +8 -0
  36. package/blz-rds/commands/core/desc.js +10 -0
  37. package/blz-rds/commands/core/distinct.js +10 -0
  38. package/blz-rds/commands/core/divide.js +11 -0
  39. package/blz-rds/commands/core/embedded-exists.js +17 -0
  40. package/blz-rds/commands/core/embedded-select.js +17 -0
  41. package/blz-rds/commands/core/equals.js +9 -0
  42. package/blz-rds/commands/core/false.js +8 -0
  43. package/blz-rds/commands/core/greater-or-equal.js +9 -0
  44. package/blz-rds/commands/core/greater.js +9 -0
  45. package/blz-rds/commands/core/in.js +9 -0
  46. package/blz-rds/commands/core/integer.js +8 -0
  47. package/blz-rds/commands/core/is-not-null.js +11 -0
  48. package/blz-rds/commands/core/is-null-or-value.js +10 -0
  49. package/blz-rds/commands/core/is-null.js +11 -0
  50. package/blz-rds/commands/core/less-or-equal.js +9 -0
  51. package/blz-rds/commands/core/less-unary.js +12 -0
  52. package/blz-rds/commands/core/less.js +9 -0
  53. package/blz-rds/commands/core/like.js +12 -0
  54. package/blz-rds/commands/core/max.js +10 -0
  55. package/blz-rds/commands/core/min.js +10 -0
  56. package/blz-rds/commands/core/multiply.js +13 -0
  57. package/blz-rds/commands/core/not-equals.js +9 -0
  58. package/blz-rds/commands/core/not-in.js +9 -0
  59. package/blz-rds/commands/core/not.js +13 -0
  60. package/blz-rds/commands/core/null.js +8 -0
  61. package/blz-rds/commands/core/nvl.js +11 -0
  62. package/blz-rds/commands/core/or.js +13 -0
  63. package/blz-rds/commands/core/parameter.js +34 -0
  64. package/blz-rds/commands/core/remainder.js +16 -0
  65. package/blz-rds/commands/core/string.js +8 -0
  66. package/blz-rds/commands/core/subtract.js +13 -0
  67. package/blz-rds/commands/core/sum.js +10 -0
  68. package/blz-rds/commands/core/true.js +8 -0
  69. package/blz-rds/commands/core/tuple.js +13 -0
  70. package/blz-rds/commands/datetimes/add-days.js +11 -0
  71. package/blz-rds/commands/datetimes/add-hours.js +11 -0
  72. package/blz-rds/commands/datetimes/add-milliseconds.js +11 -0
  73. package/blz-rds/commands/datetimes/add-minutes.js +11 -0
  74. package/blz-rds/commands/datetimes/add-months.js +11 -0
  75. package/blz-rds/commands/datetimes/add-seconds.js +11 -0
  76. package/blz-rds/commands/datetimes/add-years.js +11 -0
  77. package/blz-rds/commands/datetimes/date-diff.js +11 -0
  78. package/blz-rds/commands/datetimes/date.js +12 -0
  79. package/blz-rds/commands/datetimes/datetime-diff.js +11 -0
  80. package/blz-rds/commands/datetimes/datetime.js +15 -0
  81. package/blz-rds/commands/datetimes/day.js +10 -0
  82. package/blz-rds/commands/datetimes/hour.js +10 -0
  83. package/blz-rds/commands/datetimes/millisecond.js +10 -0
  84. package/blz-rds/commands/datetimes/minute.js +10 -0
  85. package/blz-rds/commands/datetimes/month-text.js +10 -0
  86. package/blz-rds/commands/datetimes/month.js +10 -0
  87. package/blz-rds/commands/datetimes/now.js +9 -0
  88. package/blz-rds/commands/datetimes/second.js +10 -0
  89. package/blz-rds/commands/datetimes/subtract-days.js +11 -0
  90. package/blz-rds/commands/datetimes/subtract-hours.js +11 -0
  91. package/blz-rds/commands/datetimes/subtract-milliseconds.js +11 -0
  92. package/blz-rds/commands/datetimes/subtract-minutes.js +11 -0
  93. package/blz-rds/commands/datetimes/subtract-seconds.js +11 -0
  94. package/blz-rds/commands/datetimes/time-diff.js +11 -0
  95. package/blz-rds/commands/datetimes/time.js +13 -0
  96. package/blz-rds/commands/datetimes/today.js +9 -0
  97. package/blz-rds/commands/datetimes/week-day-text.js +10 -0
  98. package/blz-rds/commands/datetimes/week-day.js +10 -0
  99. package/blz-rds/commands/datetimes/week.js +10 -0
  100. package/blz-rds/commands/datetimes/year.js +10 -0
  101. package/blz-rds/commands/math/abs.js +10 -0
  102. package/blz-rds/commands/math/acos.js +10 -0
  103. package/blz-rds/commands/math/asin.js +10 -0
  104. package/blz-rds/commands/math/atan.js +10 -0
  105. package/blz-rds/commands/math/atan2.js +11 -0
  106. package/blz-rds/commands/math/ceil.js +10 -0
  107. package/blz-rds/commands/math/cos.js +10 -0
  108. package/blz-rds/commands/math/cosh.js +10 -0
  109. package/blz-rds/commands/math/exp.js +10 -0
  110. package/blz-rds/commands/math/floor.js +10 -0
  111. package/blz-rds/commands/math/log.js +18 -0
  112. package/blz-rds/commands/math/log10.js +10 -0
  113. package/blz-rds/commands/math/pow.js +11 -0
  114. package/blz-rds/commands/math/random.js +9 -0
  115. package/blz-rds/commands/math/round.js +18 -0
  116. package/blz-rds/commands/math/sign.js +10 -0
  117. package/blz-rds/commands/math/sin.js +10 -0
  118. package/blz-rds/commands/math/sinh.js +10 -0
  119. package/blz-rds/commands/math/sqrt.js +10 -0
  120. package/blz-rds/commands/math/tan.js +10 -0
  121. package/blz-rds/commands/math/tanh.js +10 -0
  122. package/blz-rds/commands/math/trunc.js +18 -0
  123. package/blz-rds/commands/strings/concat.js +20 -0
  124. package/blz-rds/commands/strings/contains.js +12 -0
  125. package/blz-rds/commands/strings/ends-with.js +12 -0
  126. package/blz-rds/commands/strings/index-of.js +11 -0
  127. package/blz-rds/commands/strings/is-null-or-empty.js +11 -0
  128. package/blz-rds/commands/strings/is-null-or-white-space.js +11 -0
  129. package/blz-rds/commands/strings/join.js +22 -0
  130. package/blz-rds/commands/strings/last-index-of.js +11 -0
  131. package/blz-rds/commands/strings/length.js +10 -0
  132. package/blz-rds/commands/strings/pad-left.js +20 -0
  133. package/blz-rds/commands/strings/pad-right.js +20 -0
  134. package/blz-rds/commands/strings/replace.js +12 -0
  135. package/blz-rds/commands/strings/starts-with.js +12 -0
  136. package/blz-rds/commands/strings/substring.js +12 -0
  137. package/blz-rds/commands/strings/to-lower.js +10 -0
  138. package/blz-rds/commands/strings/to-upper.js +10 -0
  139. package/blz-rds/commands/strings/trim-end.js +10 -0
  140. package/blz-rds/commands/strings/trim-start.js +10 -0
  141. package/blz-rds/commands/strings/trim.js +10 -0
  142. package/blz-rds/index.js +744 -0
  143. package/blz-rds-mysql/base.js +857 -0
  144. package/blz-rds-mysql/connection-manager.js +129 -0
  145. package/blz-rds-mysql/execute-bulk-insert.js +35 -0
  146. package/blz-rds-mysql/execute-bulk-merge.js +45 -0
  147. package/blz-rds-mysql/execute-non-query.js +34 -0
  148. package/blz-rds-mysql/execute-query.js +50 -0
  149. package/blz-rds-mysql/index.js +41 -0
  150. package/blz-rds-mysql/stored-procedure.js +207 -0
  151. package/blz-rds-mysql/syntaxis.json +114 -0
  152. package/blz-rds-mysqlx/base.js +846 -0
  153. package/blz-rds-mysqlx/connection-manager.js +141 -0
  154. package/blz-rds-mysqlx/execute-bulk-insert.js +35 -0
  155. package/blz-rds-mysqlx/execute-bulk-merge.js +45 -0
  156. package/blz-rds-mysqlx/execute-non-query.js +29 -0
  157. package/blz-rds-mysqlx/execute-query.js +39 -0
  158. package/blz-rds-mysqlx/index.js +41 -0
  159. package/blz-rds-mysqlx/stored-procedure.js +179 -0
  160. package/blz-rds-mysqlx/syntaxis.json +105 -0
  161. package/blz-rds-oracle/index.js +540 -0
  162. package/blz-rds-oracle/syntaxis.json +112 -0
  163. package/blz-rds-postgres/base.js +861 -0
  164. package/blz-rds-postgres/connection-manager.js +225 -0
  165. package/blz-rds-postgres/execute-bulk-insert.js +81 -0
  166. package/blz-rds-postgres/execute-bulk-merge.js +93 -0
  167. package/blz-rds-postgres/execute-non-query.js +23 -0
  168. package/blz-rds-postgres/execute-query.js +37 -0
  169. package/blz-rds-postgres/index.js +41 -0
  170. package/blz-rds-postgres/result-set.js +51 -0
  171. package/blz-rds-postgres/stored-procedure.js +116 -0
  172. package/blz-rds-postgres/syntaxis.json +114 -0
  173. package/blz-redis/index.js +217 -0
  174. package/blz-redis/lib/redisCache.js +265 -0
  175. package/blz-regex/index.js +25 -0
  176. package/blz-security/.eslintrc.js +15 -0
  177. package/blz-security/__test__/AuthorizationKpn.yaml +1043 -0
  178. package/blz-security/__test__/FinancingSetting.yaml +177 -0
  179. package/blz-security/__test__/KpnConfigPortal.yaml +330 -0
  180. package/blz-security/__test__/OrderManagement.yaml +5190 -0
  181. package/blz-security/__test__/Security.yaml +128 -0
  182. package/blz-security/__test__/autorization.test.js +105 -0
  183. package/blz-security/__test__/orderManagement.test.js +26 -0
  184. package/blz-security/__test__/secureUrl.test.js +79 -0
  185. package/blz-security/__test__/solveMergeRule.test.js +109 -0
  186. package/blz-security/__test__/sqlInjectionGuard.test.js +203 -0
  187. package/blz-security/__test__/xssGuard.test.js +204 -0
  188. package/blz-security/authorizationService.js +536 -0
  189. package/blz-security/config/global.js +8 -0
  190. package/blz-security/config/welcome +8 -0
  191. package/blz-security/doc/README.md +75 -0
  192. package/blz-security/filescanner/index.js +46 -0
  193. package/blz-security/helpers/consts.js +229 -0
  194. package/blz-security/helpers/utils.js +267 -0
  195. package/blz-security/implementations/cache.js +90 -0
  196. package/blz-security/implementations/oidc.js +404 -0
  197. package/blz-security/implementations/pkceCacheStore.js +23 -0
  198. package/blz-security/implementations/saml.js +10 -0
  199. package/blz-security/implementations/uma.js +63 -0
  200. package/blz-security/implementations/webAuthn.js +9 -0
  201. package/blz-security/implementations/wstg.js +72 -0
  202. package/blz-security/index.js +77 -0
  203. package/blz-security/lab/index.js +27 -0
  204. package/blz-security/middleware/HapiServerAzureAd.js +641 -0
  205. package/blz-security/middleware/HapiServerKeycloak.js +840 -0
  206. package/blz-security/middleware/HapiServerSimToken.js +247 -0
  207. package/blz-security/middleware/hapi.js +515 -0
  208. package/blz-security/middleware/hapiServer.js +974 -0
  209. package/blz-security/navigationMemoryRepository.js +15 -0
  210. package/blz-security/navigationMongoDbRepository.js +73 -0
  211. package/blz-security/secureUrlService.js +47 -0
  212. package/blz-security/securityService.js +409 -0
  213. package/blz-security/sqlInjectionGuard.js +162 -0
  214. package/blz-security/templates/forbidden.html +0 -0
  215. package/blz-security/templates/session-iframe-azure-ad.html +7 -0
  216. package/blz-security/templates/session-iframe.html +73 -0
  217. package/blz-security/templates/unauthorized.html +1 -0
  218. package/blz-security/xssGuard.js +87 -0
  219. package/blz-strings/index.js +167 -0
  220. package/blz-uuid/index.js +7 -0
  221. package/blz-yaml/index.js +19 -0
  222. package/index.js +84 -0
  223. package/package.json +97 -0
  224. package/process-managers/index.js +422 -0
@@ -0,0 +1,44 @@
1
+ const { LRUCache } = require('lru-cache')
2
+ class LruCache {
3
+ constructor () {
4
+ this._cache = new LRUCache({ max: 500, maxSize: 5000, ttl: 1000 * 60 * 60 * 3, sizeCalculation: (value, key) => { return 1 } })
5
+ }
6
+
7
+ /**
8
+ * @name set
9
+ * @api private
10
+ * @description Maximum age in ms.
11
+ * @param {*} key key to be cached.
12
+ * @param {*} value value to be cached.
13
+ * @param {*} expire Maximum age in ms.
14
+ */
15
+ async set (key, value, expire) {
16
+ this._cache.set(key, value, expire)
17
+ }
18
+
19
+ /**
20
+ * @name get
21
+ * @api private
22
+ * @description Get the value that was cached.
23
+ * @param {*} key
24
+ * @returns
25
+ */
26
+ async get (key) {
27
+ return this._cache.get(key)
28
+ }
29
+
30
+ /**
31
+ * @name del
32
+ * @api private
33
+ * @description It was removing the value that was in the cache.
34
+ * @param {*} key
35
+ * @returns
36
+ */
37
+ async del (key) {
38
+ this._cache.delete(key)
39
+ }
40
+ }
41
+ const lruCache = new LruCache()
42
+ module.exports = {
43
+ lruCache
44
+ }
@@ -0,0 +1,29 @@
1
+ const { lruCache } = require('./LruCache')
2
+
3
+ module.exports = typeof module.exports === "undefined" ? {} : module.exports;
4
+ /**
5
+ * Get cache item
6
+ * @param {string} key - key cache item
7
+ * @return {any}
8
+ */
9
+ module.exports.localCacheGet = function( key ) {
10
+ return lruCache.get(key)
11
+ }
12
+ /**
13
+ * Remove cache item
14
+ * @param {string} key - key cache item
15
+ * @return {any}
16
+ */
17
+ module.exports.localCacheRemove = function( key ) {
18
+ lruCache.del(key)
19
+ }
20
+ /**
21
+ * Set cache item
22
+ * @param {string} key - key cache item
23
+ * @param {any} value - value of cache
24
+ * @param {integer} [expire] - expire time in milliseconds
25
+ * @return {any}
26
+ */
27
+ module.exports.localCacheSet = function( key, value, expire ) {
28
+ lruCache.set(key, value, expire || 0)
29
+ }
@@ -0,0 +1,434 @@
1
+ const Path = require('path');
2
+ const Fs = require('fs-extra');
3
+ const {h3lp } = require('h3lp');
4
+
5
+
6
+ class BlzConfig {
7
+
8
+ constructor() {
9
+ this._config = null
10
+ }
11
+
12
+ async initialize(configToOverride = {}) {
13
+ if (this._config != null) {
14
+ console.warn('You are call BlzConfig.initialize multiple times. We will override the config')
15
+ }
16
+ this._config = await this.loadConfig(configToOverride)
17
+ this.normalizeConfig(this._config)
18
+ this.validateConfig(this._config)
19
+ }
20
+
21
+ async loadConfig(configToOverride) {
22
+
23
+ // It starts from the system configuration and the properties are added by environment variables
24
+ const configPath = Path.join(__dirname, '../config.json')
25
+ if (!Fs.existsSync(configPath)) {
26
+ throw new Error(`${configPath} config file not exists`)
27
+ }
28
+
29
+ let config = JSON.parse(Fs.readFileSync(configPath), 'utf8');
30
+ config = { ...config, ...configToOverride }
31
+ let connectionsName = config.connections ? Object.keys(config.connections) : [];
32
+
33
+ // look for the .env file within the system or at the solution level.
34
+ let environmentPath = null
35
+ if (Fs.existsSync(Path.join(__dirname, '../.env'))) {
36
+ environmentPath = Path.join(__dirname, '../.env');
37
+ }
38
+ else if (Fs.existsSync(Path.join(__dirname, '../../.env'))) {
39
+ environmentPath = Path.join(__dirname, '../../.env');
40
+ }
41
+
42
+ // Check duplicate keys in .env
43
+ if (environmentPath) {
44
+ this.checkDuplicateKeysInEnv(environmentPath)
45
+ }
46
+
47
+ // if the .env file exists raise the environment variables from this file
48
+ if (Fs.existsSync(environmentPath)) {
49
+ require('dotenv').config({ path: environmentPath });
50
+ }
51
+ for (let p in process.env) {
52
+ if (p.startsWith('blz_')) {
53
+ if (p.startsWith('blz_' + config.name + '_param_') && p.endsWith('_user') && p !== 'blz_' + config.name + '_param_user') {
54
+ let name = p.replace('blz_' + config.name + '_param_', '');
55
+ name = name.substring(0, name.length - 5);
56
+ if (!config.parameters) config.parameters = {};
57
+ if (!config.parameters[name]) config.parameters[name] = {};
58
+ config.parameters[name].user = this.getValue(process.env[p]);
59
+ }
60
+ else if (p.startsWith('blz_' + config.name + '_param_') && p.endsWith('_password') && p !== 'blz_' + config.name + '_param_password') {
61
+ let name = p.replace('blz_' + config.name + '_param_', '');
62
+ name = name.substring(0, name.length - 9);
63
+ if (!config.parameters) config.parameters = {};
64
+ if (!config.parameters[name]) config.parameters[name] = {};
65
+ config.parameters[name].password = this.getValue(process.env[p]);
66
+ }
67
+ else if (p.startsWith('blz_' + config.name + '_param_')) {
68
+ let name = p.replace('blz_' + config.name + '_param_', '');
69
+ if (!config.parameters) config.parameters = {};
70
+ if (!config.visibleParameters) config.visibleParameters = {};
71
+ const format = config.configParameters && config.configParameters[name] ? config.configParameters[name].format : null;
72
+ const hidden = config.configParameters && config.configParameters[name] ? config.configParameters[name].hidden : false;
73
+ try {
74
+ const value = this.getFormatValue(process.env[p], format);
75
+ config.parameters[name] = value;
76
+ if (hidden!== true) {
77
+ config.visibleParameters[name] = value;
78
+ }
79
+ }
80
+ catch (error) {
81
+ throw new Error(`Error: Bad value for parameter "${p}" defined in the environment.\n- ${error.message}`)
82
+ }
83
+ }
84
+ else if (p.startsWith('blz_' + config.name + '_auth_')) {
85
+ let name = p.replace('blz_' + config.name + '_auth_', '');
86
+ if (!config.authServer) config.authServer = {};
87
+ config.authServer[name] = this.getValue(process.env[p]);
88
+ }
89
+ else if (p === 'blz_' + config.name + '_enableKafkaConsumers') {
90
+ const enableKafkaConsumersValue = this.getValue(process.env[p]) || ''
91
+ const enableKafkaConsumers = enableKafkaConsumersValue
92
+ .trim()
93
+ .split(',')
94
+ .filter(Boolean)
95
+ .map(consumerName => consumerName.trim())
96
+ const enableKafkaConsumersUniq = [... new Set(enableKafkaConsumers)]
97
+ config.enableKafkaConsumers = enableKafkaConsumersUniq
98
+ }
99
+ else if (p.startsWith('blz_' + config.name + '_')) {
100
+ let name = p.replace('blz_' + config.name + '_', '');
101
+ config[name] = this.getValue(process.env[p]);
102
+ }
103
+ else {
104
+ let str = p.replace('blz_', '');
105
+ let index = str.indexOf('_');
106
+ let name = str.substring(0, index);
107
+ if (connectionsName.includes(name)) {
108
+ let paramName = str.replace(name + '_', '');
109
+ config.connections[name][paramName] = this.getValue(process.env[p]);
110
+ } else {
111
+ config[p] = this.getValue(process.env[p]);
112
+ }
113
+ }
114
+ }
115
+ }
116
+ // set internal parameters
117
+ this.setAliasParams(config)
118
+ return config;
119
+ }
120
+
121
+ setAliasParams(config){
122
+ if (config.parameters?.SecurityApiSanitizeSqlInjection) {
123
+ config.blz_securityApiSanitizeSqlInjection = config.parameters.SecurityApiSanitizeSqlInjection
124
+ process.env.blz_securityApiSanitizeSqlInjection = config.parameters.SecurityApiSanitizeSqlInjection
125
+ }
126
+ if (config.parameters?.SecurityApiSanitizeOnlyLog) {
127
+ process.env.blz_securityApiSanitizeOnlyLog = config.parameters.SecurityApiSanitizeOnlyLog
128
+ }
129
+ if (config.parameters?.SecurityExcludeSanitizePaths) {
130
+ process.env.blz_securityExcludeSanitizePaths = config.parameters.SecurityExcludeSanitizePaths
131
+ }
132
+ if (config.parameters?.SecurityApiSanitizeDangerousParamPatterns) {
133
+ process.env.blz_securityApiSanitizeDangerousParamPatterns = config.parameters.SecurityApiSanitizeDangerousParamPatterns
134
+ }
135
+ if (config.parameters?.SecurityApiSanitizeDangerousSqlPatterns) {
136
+ process.env.blz_securityApiSanitizeDangerousSqlPatterns = config.parameters.SecurityApiSanitizeDangerousSqlPatterns
137
+ }
138
+ if (config.parameters?.SecurityApiSanitizeAllowedSqlInputPatterns ) {
139
+ process.env.blz_securityApiSanitizeAllowedSqlInputPatterns = config.parameters.SecurityApiSanitizeAllowedSqlInputPatterns
140
+ }
141
+ if (config.parameters?.SecurityApiSanitizeAllowedInputPatterns ) {
142
+ process.env.blz_securityApiSanitizeAllowedInputPatterns = config.parameters.SecurityApiSanitizeAllowedInputPatterns
143
+ }
144
+ if (config.parameters?.HttpRequestLimiterTimeframe) {
145
+ config.httpRequestLimiterTimeframe= config.parameters.HttpRequestLimiterTimeframe
146
+ }
147
+ if (config.parameters?.HttpRequestLimiterCount) {
148
+ config.httpRequestLimiterCount = config.parameters.HttpRequestLimiterCount
149
+ }
150
+ if (config.parameters?.HttpRequestLimiterAddressOnly !== undefined) {
151
+ config.httpRequestLimiterAddressOnly = config.parameters.HttpRequestLimiterAddressOnly;
152
+ }
153
+ if (config.parameters?.HttpRequestLimiterTrustProxy !== undefined) {
154
+ config.httpRequestLimiterTrustProxy = config.parameters.HttpRequestLimiterTrustProxy;
155
+ }
156
+ if (process.env.blz_secureUrlCookieKey ) {
157
+ config.parameters.SecureUrlCookieKey = process.env.blz_secureUrlCookieKey
158
+ }
159
+ if (process.env.blz_secureUrlTimeoutMs ) {
160
+ config.parameters.SecureUrlTimeoutMs = process.env.blz_secureUrlTimeoutMs
161
+ }
162
+ }
163
+
164
+ checkDuplicateKeysInEnv(environmentPath) {
165
+ const env = Fs.readFileSync(environmentPath, 'utf8');
166
+ const lines = env.split('\n');
167
+ const keys = [];
168
+ const duplicateKeys = [];
169
+ lines.forEach((line) => {
170
+ line = line.trim();
171
+ if (line === '' || line.startsWith('#'))
172
+ return;
173
+ const [key] = line.split('=');
174
+ if (keys.includes(key)) {
175
+ duplicateKeys.push(key);
176
+ }
177
+ keys.push(key);
178
+ });
179
+ if (duplicateKeys.length > 0) {
180
+ throw new Error(`Error. Duplicate keys in .env file: ${JSON.stringify([...new Set(duplicateKeys)])}`);
181
+ }
182
+ }
183
+
184
+ getValue(value) {
185
+ if (value === null) {
186
+ return null;
187
+ }
188
+ if (typeof value === 'string') {
189
+ if (value.toLocaleLowerCase().trim() === 'false') {
190
+ return false;
191
+ }
192
+ if (value.toLocaleLowerCase().trim() === 'true') {
193
+ return true;
194
+ }
195
+ let resultValue = value;
196
+ let indexStart = resultValue.indexOf('${');
197
+ let indexEnd = -1;
198
+ if (indexStart > -1) {
199
+ indexEnd = resultValue.indexOf('}', indexStart);
200
+ }
201
+ while (indexStart > -1 && indexEnd > indexStart) {
202
+ resultValue =
203
+ resultValue.substring(0, indexStart) +
204
+ process.env[resultValue.substring(indexStart + 2, indexEnd)] +
205
+ resultValue.substring(indexEnd + 1, resultValue.length);
206
+ indexStart = resultValue.indexOf('${');
207
+ indexEnd = -1;
208
+ if (indexStart > -1) {
209
+ indexEnd = resultValue.indexOf('}', indexStart);
210
+ }
211
+ }
212
+ return resultValue;
213
+ }
214
+ return value;
215
+ }
216
+
217
+ getFormatValue(value, format) {
218
+ if (value == null) {
219
+ return null;
220
+ }
221
+ if (!format) {
222
+ return this.getValue(value);
223
+ }
224
+ switch (format) {
225
+ case 'String': {
226
+ return this.getValue(value);
227
+ }
228
+ case 'Numeric': {
229
+ const numericValue = Number(value);
230
+ if (isNaN(numericValue)) {
231
+ throw new Error(`Invalid Numeric value. Detected: "${value}"`);
232
+ }
233
+ return parseFloat(value);
234
+ }
235
+ case 'Boolean': {
236
+ const boolValue = value.toLocaleLowerCase().trim();
237
+ if (!['true', 'false'].includes(boolValue)) {
238
+ throw new Error(`Invalid Boolean value (only allowed "true" or "false"). Detected: "${value}"`);
239
+ }
240
+ return boolValue === 'true';
241
+ }
242
+ default: {
243
+ return value;
244
+ }
245
+ }
246
+ }
247
+
248
+ normalizeConfig(config = {}) {
249
+ for (const p in config.connections) {
250
+ const connection = config.connections[p];
251
+ if (connection.type === "Mongodb") {
252
+ const hasOldFormat = Boolean(connection.database && connection.database.trim());
253
+ const hasNewFormat = Boolean(connection.databaseName && connection.databaseName.trim());
254
+ const hasToWarnAboutConfusion = hasOldFormat && hasNewFormat;
255
+ const hasToUpdate = hasOldFormat && !hasNewFormat;
256
+
257
+ if (hasToWarnAboutConfusion) {
258
+ console.warn(`Warning: Your are using the old format ("blz_${p}_database") and the new format ("blz_${p}_databaseName"). We will use the new one ("blz_${p}_databaseName"). Please, consider to remove the old format to avoid confusion.`);
259
+ delete connection.database;
260
+ }
261
+ if (hasToUpdate) {
262
+ console.warn(`Warning: Your are using the "blz_${p}_database" variable, but you need to use "blz_${p}_databaseName" instead. Environment variables for MongoDb databases with "blz_xxx_database" format may will disappear in the future. Please, update it.`);
263
+ connection.databaseName = connection.database;
264
+ delete connection.database;
265
+ }
266
+ } else if(connection.type === "Kafka") {
267
+ connection.requestTimeout = this.validateOrConvertToNumber(connection.requestTimeout, 'requestTimeout', 30000);
268
+ connection.connectionTimeout = this.validateOrConvertToNumber(connection.connectionTimeout, 'connectionTimeout', 3000);
269
+ connection.connectionRetries = this.validateOrConvertToNumber(connection.connectionRetries, 'connectionRetries', 3);
270
+ connection.connectionInitialRetryTime = this.validateOrConvertToNumber(connection.connectionInitialRetryTime, 'connectionInitialRetryTime', 3000);
271
+ connection.connectionMaxRetryTime = this.validateOrConvertToNumber(connection.connectionMaxRetryTime, 'connectionMaxRetryTime', 60000);
272
+ connection.connectionRetryFactor = this.validateOrConvertToNumber(connection.connectionRetryFactor, 'connectionRetryFactor', 1.5);
273
+ }
274
+ }
275
+ }
276
+
277
+ validateOrConvertToNumber(value,name, defaultValue) {
278
+ if (value === undefined || value === null) {
279
+ return defaultValue;
280
+ }
281
+ if (typeof value === 'string' && h3lp.val.isNumber(value)){
282
+ return h3lp.val.isDecimal(value)?parseFloat(value): Path.parse(value);
283
+ } else if (typeof value === 'number'){
284
+ return connection.requestTimeout;
285
+ } else {
286
+ throw new Error(`Error: ${name} ${value} not supported`);
287
+ }
288
+ }
289
+
290
+ validateConfig(config) {
291
+ if (config === undefined) {
292
+ throw new Error(`Error: config not found`);
293
+ }
294
+ if (config.type === undefined) {
295
+ throw new Error(`Error: config type undefined`);
296
+ }
297
+ if (config.name === undefined) {
298
+ throw new Error(`Error: config name undefined`);
299
+ }
300
+ //validate application config
301
+ switch (config.type) {
302
+ case "Microservice":
303
+ case "ProcessEngine":
304
+ case "RestApi":
305
+ if (config.port === undefined) {
306
+ throw new Error(`Error: Environment variable blz_${config.name}_port is required`);
307
+ }
308
+ break;
309
+ case "Mongodb":
310
+ case "RelationalDatabase":
311
+ case "BeeAuthServer":
312
+ case "SmtpServer":
313
+ case "WebFrontend":
314
+ case "MobileApp":
315
+ case "Custom":
316
+ break;
317
+ default:
318
+ throw new Error(`Error: type ${config.type} not supported`);
319
+ }
320
+ //validate connections config
321
+ if (config.connections !== undefined) {
322
+ for (const p in config.connections) {
323
+ const connection = config.connections[p];
324
+ switch (connection.type) {
325
+ case "Microservice":
326
+ case "ProcessEngine":
327
+ case "RestApi":
328
+ if (connection.url === undefined || connection.url.trim() === "") {
329
+ throw new Error(`Error: Environment variable blz_${p}_url is required`);
330
+ }
331
+ break;
332
+ case "Mongodb":
333
+ if (connection.url === undefined || connection.url.trim() === "") {
334
+ throw new Error(`Error: Environment variable blz_${p}url is required`);
335
+ }
336
+ if (connection.databaseName === undefined || connection.databaseName.trim() === "") {
337
+ throw new Error(`Error: Environment variable blz_${p}_databaseName is required`);
338
+ }
339
+ break;
340
+ case "RelationalDatabase":
341
+ if (connection.providerName === undefined || connection.providerName.trim() === "") {
342
+ throw new Error(`Error: Environment variable blz_${p}_providerName is required`);
343
+ }
344
+ if (connection.customUrl) {
345
+ if (connection.protocol === undefined || connection.protocol.trim() === "") {
346
+ throw new Error(`Error: Environment variable blz_${p}_protocol is required`);
347
+ }
348
+ if (connection.url === undefined || connection.url.trim() === "") {
349
+ throw new Error(`Error: Environment variable blz_${p}_url is required`);
350
+ }
351
+ } else {
352
+ if (connection.providerName === 'Oracle') {
353
+ if (connection.dataSource === undefined || connection.dataSource.trim() === "") {
354
+ throw new Error(`Error: Environment variable blz_${p}_dataSource is required`);
355
+ }
356
+ } else {
357
+ if (connection.host === undefined || connection.host.trim() === "") {
358
+ throw new Error(`Error: Environment variable blz_${p}_host is required`);
359
+ }
360
+ if (connection.port === undefined || connection.port.trim() === "") {
361
+ throw new Error(`Error: Environment variable blz_${p}_port is required`);
362
+ }
363
+ if (connection.database === undefined || connection.database.trim() === "") {
364
+ throw new Error(`Error: Environment variable blz_${p}_database is required`);
365
+ }
366
+ }
367
+ if (connection.user === undefined || connection.user.trim() === "") {
368
+ throw new Error(`Error: Environment variable blz_${p}_user is required`);
369
+ }
370
+ if (connection.password === undefined || connection.password.trim() === "") {
371
+ throw new Error(`Error: Environment variable blz_${p}_password is required`);
372
+ }
373
+ }
374
+ break;
375
+ case "Redis":
376
+ case "Hazelcast":
377
+ if (connection.providerName === undefined || connection.providerName.trim() === "") {
378
+ throw new Error(`Error: Environment variable blz_${p}_providerName is required`);
379
+ }
380
+ if (connection.host === undefined || connection.host.trim() === "") {
381
+ throw new Error(`Error: Environment variable blz_${p}_host is required`);
382
+ }
383
+ if (connection.port === undefined || connection.port.trim() === "") {
384
+ throw new Error(`Error: Environment variable blz_${p}_port is required`);
385
+ }
386
+ if (connection.database === undefined || connection.database.trim() === "") {
387
+ throw new Error(`Error: Environment variable blz_${p}_database is required`);
388
+ }
389
+ if (connection.password === undefined || connection.password.trim() === "") {
390
+ throw new Error(`Error: Environment variable blz_${p}_password is required`);
391
+ }
392
+ break;
393
+ }
394
+ }
395
+ }
396
+ //validate configParameters config
397
+ if (config.configParameters !== undefined) {
398
+ for (const p in config.configParameters) {
399
+ const configParameter = config.configParameters[p];
400
+ switch (configParameter.format) {
401
+ case "String":
402
+ case "Numeric":
403
+ case "Json":
404
+ case "Boolean":
405
+ if (config.parameters[p] === undefined) {
406
+ throw new Error(`Error: Environment variable blz_${config.name}_param_${p} is required`);
407
+ }
408
+ break;
409
+ case "Credentials":
410
+ if (config.parameters[p + '_user'] === undefined) {
411
+ throw new Error(`Error: Environment variable blz_${config.name}_param_${p}_user is required`);
412
+ }
413
+ if (config.parameters[p + '_password'] === undefined) {
414
+ throw new Error(`Error: Environment variable blz_${config.name}_param_${p}_password is required`);
415
+ }
416
+ break;
417
+ default:
418
+ throw new Error(`Error: parameter ${p} format ${configParameter.format} not supported`);
419
+ }
420
+ }
421
+ }
422
+ }
423
+
424
+ getConfig() {
425
+ return this._config
426
+ }
427
+
428
+ setConfig(config = {}) {
429
+ this.setAliasParams(config)
430
+ this._config = { ...config }
431
+ }
432
+ }
433
+ const blzConfig = new BlzConfig()
434
+ module.exports = blzConfig