@futdevpro/fsm-dynamo 1.16.38 → 1.16.40

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 (707) hide show
  1. package/.c8rc.json +26 -26
  2. package/.cursor/rules/__assistant_guide.mdc +30 -30
  3. package/.cursor/rules/__main.mdc +64 -64
  4. package/.cursor/rules/_ag_backend-structure.mdc +85 -85
  5. package/.cursor/rules/_ag_backend.mdc +16 -16
  6. package/.cursor/rules/_ag_debug.mdc +7 -7
  7. package/.cursor/rules/_ag_documentation_writing_rules.mdc +372 -372
  8. package/.cursor/rules/_ag_file-refactoring.mdc +113 -113
  9. package/.cursor/rules/_ag_fixes_rules.mdc +5 -5
  10. package/.cursor/rules/_ag_frontend-structure.mdc +86 -86
  11. package/.cursor/rules/_ag_frontend.mdc +39 -39
  12. package/.cursor/rules/_ag_import-rules.mdc +44 -44
  13. package/.cursor/rules/_ag_naming.mdc +115 -115
  14. package/.cursor/rules/_ag_running_commands.mdc +4 -4
  15. package/.cursor/rules/_ag_server-controller.mdc +5 -5
  16. package/.cursor/rules/_ag_should-be.mdc +6 -6
  17. package/.cursor/rules/_ag_swearing.mdc +47 -47
  18. package/.cursor/rules/ai_development_guide.md +60 -60
  19. package/.cursor/rules/ai_directives.md +114 -114
  20. package/.cursor/rules/cursor-rules.md +160 -160
  21. package/.cursor/rules/default-command.mdc +464 -464
  22. package/.cursor/rules/error_code_pattern.md +39 -39
  23. package/.cursor/rules/saved rule mcp server use.md +15 -15
  24. package/.dynamo/pipeline.cicd.config.json +157 -157
  25. package/.dynamo/version-bump.config.json +5 -5
  26. package/.github/workflows/main.yml +439 -439
  27. package/.husky/pre-commit +2 -2
  28. package/.vscode/settings.json +11 -11
  29. package/LICENSE +21 -21
  30. package/README.md +701 -693
  31. package/__documentations/2026-05-17-oai-compatible-providers-howto.md +282 -282
  32. package/__documentations/2026-06-01-fr047-fc-foundation.md +48 -48
  33. package/__documentations/2026-06-01-fr047-fr048-code-review.md +153 -153
  34. package/__documentations/2026-06-01-fr047-p1-function-calling-vocabulary.md +75 -75
  35. package/__documentations/2026-06-05-secret-mask-url-cred-any-scheme.md +37 -37
  36. package/__documentations/2026-06-06-ngx-models-merge-completion.md +100 -100
  37. package/__documentations/2026-06-22-dyfm-error-extends-error.md +109 -109
  38. package/__documentations/plans/00-MASTER-ngx-models-fsm-merge.md +75 -75
  39. package/__documentations/plans/01-naming-convention-DyNM-to-DyFM.md +103 -103
  40. package/__documentations/plans/02-consumer-rollout.md +84 -84
  41. package/_specifications/BACKLOG.md +43 -43
  42. package/build/_modules/crypto/_models/artifact-signature.interface.d.ts +37 -0
  43. package/build/_modules/crypto/_models/artifact-signature.interface.d.ts.map +1 -0
  44. package/build/_modules/crypto/_models/artifact-signature.interface.js +3 -0
  45. package/build/_modules/crypto/_models/artifact-signature.interface.js.map +1 -0
  46. package/build/_modules/crypto/_services/artifact-signature.control-service.d.ts +24 -0
  47. package/build/_modules/crypto/_services/artifact-signature.control-service.d.ts.map +1 -0
  48. package/build/_modules/crypto/_services/artifact-signature.control-service.js +281 -0
  49. package/build/_modules/crypto/_services/artifact-signature.control-service.js.map +1 -0
  50. package/build/_modules/crypto/index.d.ts +2 -0
  51. package/build/_modules/crypto/index.d.ts.map +1 -1
  52. package/build/_modules/crypto/index.js +2 -0
  53. package/build/_modules/crypto/index.js.map +1 -1
  54. package/build/_modules/socket/_models/sck-socket-event.control-model.d.ts +4 -6
  55. package/build/_modules/socket/_models/sck-socket-event.control-model.d.ts.map +1 -1
  56. package/build/_modules/socket/_models/sck-socket-event.control-model.js +9 -7
  57. package/build/_modules/socket/_models/sck-socket-event.control-model.js.map +1 -1
  58. package/eslint.config.js +4 -4
  59. package/nodemon.json +22 -22
  60. package/package.json +306 -306
  61. package/pnpm-workspace.yaml +2 -2
  62. package/scripts/_capture-out/ai-error-capture.json +398 -398
  63. package/scripts/ai-error-capture.js +171 -171
  64. package/scripts/ai-model-registry-check.js +132 -132
  65. package/scripts/crypto/CRYPTO-STABILITY-SOLUTION.md +196 -196
  66. package/scripts/crypto/README.md +113 -113
  67. package/scripts/crypto/demo-crypto-stability.js +120 -120
  68. package/scripts/crypto/stress-test-crypto.js +379 -379
  69. package/scripts/run-coverage-tests.js +24 -24
  70. package/scripts/verify-build-completeness.js +62 -62
  71. package/spec/support/helpers/ts-node-helper.js +9 -9
  72. package/spec/support/jasmine.coverage.json +23 -23
  73. package/spec/support/jasmine.json +24 -24
  74. package/src/_collections/constants/data-sizes.const.ts +40 -40
  75. package/src/_collections/constants/error-defaults.const.ts +20 -20
  76. package/src/_collections/constants/global-settings.const.spec.ts +32 -32
  77. package/src/_collections/constants/global-settings.const.ts +29 -29
  78. package/src/_collections/constants/numbers.const.ts +40 -40
  79. package/src/_collections/constants/times.const.ts +45 -45
  80. package/src/_collections/utils/array.util.spec.ts +306 -306
  81. package/src/_collections/utils/array.util.ts +813 -813
  82. package/src/_collections/utils/async.util.spec.ts +398 -398
  83. package/src/_collections/utils/async.util.ts +208 -208
  84. package/src/_collections/utils/data.util.spec.ts +345 -345
  85. package/src/_collections/utils/data.util.ts +226 -226
  86. package/src/_collections/utils/extract-error-message.util.spec.ts +204 -204
  87. package/src/_collections/utils/extract-error-message.util.ts +223 -223
  88. package/src/_collections/utils/json-error-helper.util.spec.ts +521 -521
  89. package/src/_collections/utils/json-error-helper.util.ts +301 -301
  90. package/src/_collections/utils/log.util.spec.ts +975 -975
  91. package/src/_collections/utils/log.util.ts +667 -667
  92. package/src/_collections/utils/math/box-bounds.spec.ts +73 -73
  93. package/src/_collections/utils/math/box-bounds.util.ts +183 -183
  94. package/src/_collections/utils/math/math.util.spec.ts +94 -94
  95. package/src/_collections/utils/math/math.util.ts +141 -141
  96. package/src/_collections/utils/math/random.util.spec.ts +82 -82
  97. package/src/_collections/utils/math/random.util.ts +139 -139
  98. package/src/_collections/utils/math/trigonometry.util.spec.ts +57 -57
  99. package/src/_collections/utils/math/trigonometry.util.ts +102 -102
  100. package/src/_collections/utils/math/vector2.util.spec.ts +94 -94
  101. package/src/_collections/utils/math/vector2.util.ts +653 -653
  102. package/src/_collections/utils/object.util.spec.ts +646 -646
  103. package/src/_collections/utils/object.util.ts +739 -739
  104. package/src/_collections/utils/regex/password-regex.util.spec.ts +51 -51
  105. package/src/_collections/utils/regex/password-regex.util.ts +65 -65
  106. package/src/_collections/utils/regex/regex.util.spec.ts +42 -42
  107. package/src/_collections/utils/regex/regex.util.ts +6 -6
  108. package/src/_collections/utils/regex/username-regex.util.spec.ts +61 -61
  109. package/src/_collections/utils/regex/username-regex.util.ts +35 -35
  110. package/src/_collections/utils/require-env.util.spec.ts +231 -231
  111. package/src/_collections/utils/require-env.util.ts +138 -138
  112. package/src/_collections/utils/round-list.util.spec.ts +79 -79
  113. package/src/_collections/utils/round-list.util.ts +162 -162
  114. package/src/_collections/utils/secret-mask.util.spec.ts +66 -66
  115. package/src/_collections/utils/secret-mask.util.ts +262 -262
  116. package/src/_collections/utils/stack.util.spec.ts +372 -372
  117. package/src/_collections/utils/stack.util.ts +164 -164
  118. package/src/_collections/utils/string-case.util.spec.ts +441 -441
  119. package/src/_collections/utils/string-case.util.ts +362 -362
  120. package/src/_collections/utils/string.util.spec.ts +975 -975
  121. package/src/_collections/utils/string.util.ts +449 -449
  122. package/src/_collections/utils/time.util.spec.ts +50 -50
  123. package/src/_collections/utils/time.util.ts +481 -481
  124. package/src/_collections/utils/type-cloning-facility.util.spec.ts +51 -51
  125. package/src/_collections/utils/type-cloning-facility.util.ts +168 -168
  126. package/src/_collections/utils/utilities.util.spec.ts +201 -201
  127. package/src/_collections/utils/utilities.util.ts +68 -68
  128. package/src/_collections/utils/uuid.util.spec.ts +30 -30
  129. package/src/_collections/utils/uuid.util.ts +50 -50
  130. package/src/_enums/basic-property-type.enum.ts +20 -20
  131. package/src/_enums/data-model-type.enum.ts +29 -29
  132. package/src/_enums/environment-flag.enum.ts +28 -28
  133. package/src/_enums/error-level.enum.ts +43 -43
  134. package/src/_enums/error-status.enum.ts +30 -30
  135. package/src/_enums/http/http-call-type.enum.ts +43 -43
  136. package/src/_enums/http/http-event-type.enum.ts +40 -40
  137. package/src/_enums/http/http-response-type.enum.ts +18 -18
  138. package/src/_enums/log-style.enum.ts +44 -44
  139. package/src/_enums/server-connection-status.enum.ts +6 -6
  140. package/src/_enums/time/day-of-week.enum.ts +55 -55
  141. package/src/_enums/time/month.enum.ts +25 -25
  142. package/src/_enums/time/relative-date.enum.ts +24 -24
  143. package/src/_models/control-models/data-model-params.control-model.spec.ts +156 -156
  144. package/src/_models/control-models/data-model-params.control-model.ts +362 -362
  145. package/src/_models/control-models/data-property-params.control-model.spec.ts +93 -93
  146. package/src/_models/control-models/data-property-params.control-model.ts +210 -210
  147. package/src/_models/control-models/error.control-model.spec.ts +975 -975
  148. package/src/_models/control-models/error.control-model.ts +1280 -1280
  149. package/src/_models/control-models/http/http-error-response.control-model.spec.ts +116 -116
  150. package/src/_models/control-models/http/http-error-response.control-model.ts +52 -52
  151. package/src/_models/control-models/http/http-headers.control-model.spec.ts +25 -25
  152. package/src/_models/control-models/http/http-headers.control-model.ts +124 -124
  153. package/src/_models/control-models/http/http-response.model-base.spec.ts +46 -46
  154. package/src/_models/control-models/http/http-response.model-base.ts +57 -57
  155. package/src/_models/control-models/poll.control-model.spec.ts +63 -63
  156. package/src/_models/control-models/poll.control-model.ts +151 -151
  157. package/src/_models/control-models/range-value.control-model.spec.ts +187 -187
  158. package/src/_models/control-models/range-value.control-model.ts +289 -289
  159. package/src/_models/control-models/server-status.control-model.spec.ts +66 -66
  160. package/src/_models/control-models/server-status.control-model.ts +94 -94
  161. package/src/_models/control-models/service-endpoint-settings-base.control-model.spec.ts +145 -145
  162. package/src/_models/control-models/service-endpoint-settings-base.control-model.ts +186 -186
  163. package/src/_models/data-models/errors.data-model.spec.ts +71 -71
  164. package/src/_models/data-models/errors.data-model.ts +200 -200
  165. package/src/_models/data-models/metadata.data-model.spec.ts +184 -184
  166. package/src/_models/data-models/metadata.data-model.ts +153 -153
  167. package/src/_models/interfaces/box-bounds.interface.ts +7 -7
  168. package/src/_models/interfaces/environment/global-log-settings.interface.ts +86 -86
  169. package/src/_models/interfaces/environment/global-settings.interface.ts +69 -69
  170. package/src/_models/interfaces/error-defaults.interface.ts +18 -18
  171. package/src/_models/interfaces/paged.interface.ts +12 -12
  172. package/src/_models/interfaces/random-weight.interface.ts +7 -7
  173. package/src/_models/interfaces/route-settings.interface.ts +15 -15
  174. package/src/_models/interfaces/search-query.interface.ts +23 -23
  175. package/src/_models/interfaces/search-result.interface.ts +5 -5
  176. package/src/_models/interfaces/server-error-statistics.interface.ts +24 -24
  177. package/src/_models/interfaces/vector2.interface.ts +20 -20
  178. package/src/_models/types/db-filter.type.ts +110 -110
  179. package/src/_models/types/db-sort.type.ts +4 -4
  180. package/src/_models/types/ds-filter.type.ts +68 -68
  181. package/src/_models/types/ds-sort.type.ts +21 -21
  182. package/src/_modules/ai/_collections/ai-model-ref.util.ts +88 -88
  183. package/src/_modules/ai/_collections/ai-model-registry.util.spec.ts +37 -37
  184. package/src/_modules/ai/_collections/ai-model-registry.util.ts +30 -30
  185. package/src/_modules/ai/_enums/ai-message-role.enum.ts +7 -7
  186. package/src/_modules/ai/_enums/ai-model-type.enum.ts +7 -7
  187. package/src/_modules/ai/_enums/ai-provider.enum.ts +7 -7
  188. package/src/_modules/ai/_models/ai-call-settings.interface.ts +84 -84
  189. package/src/_modules/ai/_models/ai-config.interface.ts +14 -14
  190. package/src/_modules/ai/_models/ai-embedding-request.interface.ts +20 -20
  191. package/src/_modules/ai/_models/ai-embedding-response.interface.ts +26 -26
  192. package/src/_modules/ai/_models/ai-llm-request.interface.ts +24 -24
  193. package/src/_modules/ai/_models/ai-llm-response.interface.ts +30 -30
  194. package/src/_modules/ai/_models/ai-message.interface.ts +12 -12
  195. package/src/_modules/ai/_models/ai-model-capabilities.interface.ts +35 -35
  196. package/src/_modules/ai/_models/ai-model-info.interface.ts +63 -63
  197. package/src/_modules/ai/_models/ai-model-settings-schema.interface.ts +52 -52
  198. package/src/_modules/ai/_models/ai-provider-capabilities.interface.ts +28 -28
  199. package/src/_modules/ai/_models/ai-settings.interface.ts +17 -17
  200. package/src/_modules/ai/_models/ai-tool-call.interface.ts +18 -18
  201. package/src/_modules/ai/_models/ai-tool-handler.type.ts +11 -11
  202. package/src/_modules/ai/_models/ai-tool-result.interface.ts +16 -16
  203. package/src/_modules/ai/_models/ai-tool.interface.ts +16 -16
  204. package/src/_modules/ai/_models/ai-user-provider-config.control-model.ts +29 -29
  205. package/src/_modules/ai/_modules/anthropic/_collections/aai-models.const.ts +135 -135
  206. package/src/_modules/ai/_modules/anthropic/_enums/aai-model.enum.ts +19 -19
  207. package/src/_modules/ai/_modules/anthropic/_models/aai-call-settings.control-model.spec.ts +28 -28
  208. package/src/_modules/ai/_modules/anthropic/_models/aai-call-settings.control-model.ts +23 -23
  209. package/src/_modules/ai/_modules/anthropic/_models/aai-client-options.interface.ts +10 -10
  210. package/src/_modules/ai/_modules/anthropic/_models/aai-settings.control-model.spec.ts +22 -22
  211. package/src/_modules/ai/_modules/anthropic/_models/aai-settings.control-model.ts +27 -27
  212. package/src/_modules/ai/_modules/anthropic/_models/aai-user-provider-config.control-model.ts +20 -20
  213. package/src/_modules/ai/_modules/anthropic/index.ts +14 -14
  214. package/src/_modules/ai/_modules/document-ai/_models/dai-embedding-info.interface.ts +12 -12
  215. package/src/_modules/ai/_modules/document-ai/_models/dai-vector-search-params.interface.ts +22 -22
  216. package/src/_modules/ai/_modules/document-ai/index.ts +4 -4
  217. package/src/_modules/ai/_modules/fdp-ai/_collections/fdpai-models.const.ts +40 -40
  218. package/src/_modules/ai/_modules/fdp-ai/_enums/fdpai-model.enum.ts +6 -6
  219. package/src/_modules/ai/_modules/fdp-ai/_models/fdpai-call-settings.control-model.ts +19 -19
  220. package/src/_modules/ai/_modules/fdp-ai/_models/fdpai-client-options.interface.ts +11 -11
  221. package/src/_modules/ai/_modules/fdp-ai/_models/fdpai-settings.control-model.ts +24 -24
  222. package/src/_modules/ai/_modules/fdp-ai/_models/fdpai-user-provider-config.control-model.ts +20 -20
  223. package/src/_modules/ai/_modules/fdp-ai/index.ts +11 -11
  224. package/src/_modules/ai/_modules/google-ai/_collections/gai-models.const.ts +161 -161
  225. package/src/_modules/ai/_modules/google-ai/_enums/gai-model.enum.ts +16 -16
  226. package/src/_modules/ai/_modules/google-ai/_models/gai-call-settings.control-model.spec.ts +28 -28
  227. package/src/_modules/ai/_modules/google-ai/_models/gai-call-settings.control-model.ts +21 -21
  228. package/src/_modules/ai/_modules/google-ai/_models/gai-client-options.interface.ts +8 -8
  229. package/src/_modules/ai/_modules/google-ai/_models/gai-settings.control-model.spec.ts +22 -22
  230. package/src/_modules/ai/_modules/google-ai/_models/gai-settings.control-model.ts +25 -25
  231. package/src/_modules/ai/_modules/google-ai/_models/gai-user-provider-config.control-model.ts +20 -20
  232. package/src/_modules/ai/_modules/google-ai/index.ts +14 -14
  233. package/src/_modules/ai/_modules/local-ai/_collections/lai-models.const.ts +59 -59
  234. package/src/_modules/ai/_modules/local-ai/_enums/lai-model.enum.ts +6 -6
  235. package/src/_modules/ai/_modules/local-ai/_models/lai-call-settings.control-model.spec.ts +28 -28
  236. package/src/_modules/ai/_modules/local-ai/_models/lai-call-settings.control-model.ts +18 -18
  237. package/src/_modules/ai/_modules/local-ai/_models/lai-client-options.interface.ts +9 -9
  238. package/src/_modules/ai/_modules/local-ai/_models/lai-settings.control-model.spec.ts +22 -22
  239. package/src/_modules/ai/_modules/local-ai/_models/lai-settings.control-model.ts +23 -23
  240. package/src/_modules/ai/_modules/local-ai/index.ts +14 -14
  241. package/src/_modules/ai/_modules/open-ai/_collections/oai-embedding-model-dimensions.const.ts +7 -7
  242. package/src/_modules/ai/_modules/open-ai/_collections/oai-models.const.ts +404 -404
  243. package/src/_modules/ai/_modules/open-ai/_enums/oai-model.enum.ts +179 -179
  244. package/src/_modules/ai/_modules/open-ai/_models/oai-call-settings.control-model.spec.ts +28 -28
  245. package/src/_modules/ai/_modules/open-ai/_models/oai-call-settings.control-model.ts +21 -21
  246. package/src/_modules/ai/_modules/open-ai/_models/oai-client-options.interface.ts +81 -81
  247. package/src/_modules/ai/_modules/open-ai/_models/oai-embedding-info.interface.ts +13 -13
  248. package/src/_modules/ai/_modules/open-ai/_models/oai-settings.control-model.spec.ts +22 -22
  249. package/src/_modules/ai/_modules/open-ai/_models/oai-settings.control-model.ts +25 -25
  250. package/src/_modules/ai/_modules/open-ai/_models/oai-user-provider-config.control-model.ts +21 -21
  251. package/src/_modules/ai/_modules/open-ai/index.ts +28 -28
  252. package/src/_modules/ai/index.ts +27 -27
  253. package/src/_modules/ci-tools/_enums/cit-ci-result-code.enum.ts +11 -11
  254. package/src/_modules/ci-tools/_enums/cit-ci-step-result-code.enum.ts +9 -9
  255. package/src/_modules/ci-tools/_models/cit-ci-result-info.data-models.spec.ts +58 -58
  256. package/src/_modules/ci-tools/_models/cit-ci-result-info.data-models.ts +77 -77
  257. package/src/_modules/ci-tools/_models/cit-ci-step-result.interface.ts +12 -12
  258. package/src/_modules/ci-tools/index.ts +8 -8
  259. package/src/_modules/crypto/_collections/crypto-v1.util.ts +225 -225
  260. package/src/_modules/crypto/_collections/crypto-v2.util.ts +331 -331
  261. package/src/_modules/crypto/_collections/crypto-v4.util.ts +702 -702
  262. package/src/_modules/crypto/_collections/crypto.util.db-envelope.spec.ts +51 -51
  263. package/src/_modules/crypto/_collections/crypto.util.edge.spec.ts +605 -605
  264. package/src/_modules/crypto/_collections/crypto.util.extra.spec.ts +642 -642
  265. package/src/_modules/crypto/_collections/crypto.util.simple.spec.ts +512 -512
  266. package/src/_modules/crypto/_collections/crypto.util.ts +748 -748
  267. package/src/_modules/crypto/_models/artifact-signature.interface.ts +39 -0
  268. package/src/_modules/crypto/_services/artifact-signature.control-service.spec.ts +223 -0
  269. package/src/_modules/crypto/_services/artifact-signature.control-service.ts +395 -0
  270. package/src/_modules/crypto/index.ts +16 -14
  271. package/src/_modules/custom-data/_collections/cud-module-settings.const.ts +21 -21
  272. package/src/_modules/custom-data/_models/cud.data-model.spec.ts +38 -38
  273. package/src/_modules/custom-data/_models/cud.data-model.ts +39 -39
  274. package/src/_modules/custom-data/index.ts +10 -10
  275. package/src/_modules/data-handler/_models/data-handler-settings.control-model.spec.ts +110 -110
  276. package/src/_modules/data-handler/_models/data-handler-settings.control-model.ts +110 -110
  277. package/src/_modules/data-handler/_models/data-handler.control-model.spec.ts +473 -473
  278. package/src/_modules/data-handler/_models/data-handler.control-model.ts +486 -486
  279. package/src/_modules/data-handler/_models/data-list-handler.control-model.spec.ts +263 -263
  280. package/src/_modules/data-handler/_models/data-list-handler.control-model.ts +252 -252
  281. package/src/_modules/data-handler/_models/data-search-handler.control-model.spec.ts +417 -417
  282. package/src/_modules/data-handler/_models/data-search-handler.control-model.ts +390 -390
  283. package/src/_modules/data-handler/_models/list-collector-data-handler.control-model.spec.ts +374 -374
  284. package/src/_modules/data-handler/_models/list-collector-data-handler.control-model.ts +274 -274
  285. package/src/_modules/data-handler/index.ts +6 -6
  286. package/src/_modules/game/_collections/audio-mixer.util.spec.ts +198 -198
  287. package/src/_modules/game/_collections/audio-mixer.util.ts +143 -143
  288. package/src/_modules/game/_collections/audio-scale.util.spec.ts +140 -140
  289. package/src/_modules/game/_collections/audio-scale.util.ts +129 -129
  290. package/src/_modules/game/_enums/audio-channel.enum.ts +22 -22
  291. package/src/_modules/game/_models/audio-mixer-config.interface.ts +53 -53
  292. package/src/_modules/game/_models/audio-mixer-settings.interface.ts +38 -38
  293. package/src/_modules/game/_models/audio-mixer-state.interface.ts +36 -36
  294. package/src/_modules/game/_models/audio-mixer.control-model.spec.ts +376 -376
  295. package/src/_modules/game/_models/audio-mixer.control-model.ts +419 -419
  296. package/src/_modules/game/_models/audio-scale.interface.ts +21 -21
  297. package/src/_modules/game/_models/seeded-random-state.interface.ts +21 -21
  298. package/src/_modules/game/_models/seeded-random.control-model.spec.ts +290 -290
  299. package/src/_modules/game/_models/seeded-random.control-model.ts +311 -311
  300. package/src/_modules/game/index.ts +15 -15
  301. package/src/_modules/location/_collections/assets/country-codes-ISO-3166.json +3239 -3239
  302. package/src/_modules/location/_collections/assets/country-divisions-ISO-3166-all-list.json +19035 -19035
  303. package/src/_modules/location/_collections/assets/country-divisions-ISO-3166.json +4993 -4993
  304. package/src/_modules/location/_collections/assets/country-phone-codes.json +1203 -1203
  305. package/src/_modules/location/_collections/assets/country-subdivisions/afghanistan.json +137 -137
  306. package/src/_modules/location/_collections/assets/country-subdivisions/albania.json +49 -49
  307. package/src/_modules/location/_collections/assets/country-subdivisions/algeria.json +193 -193
  308. package/src/_modules/location/_collections/assets/country-subdivisions/andorra.json +29 -29
  309. package/src/_modules/location/_collections/assets/country-subdivisions/angola.json +73 -73
  310. package/src/_modules/location/_collections/assets/country-subdivisions/antigua-and-barbuda.json +33 -33
  311. package/src/_modules/location/_collections/assets/country-subdivisions/argentina.json +97 -97
  312. package/src/_modules/location/_collections/assets/country-subdivisions/armenia.json +45 -45
  313. package/src/_modules/location/_collections/assets/country-subdivisions/australia.json +33 -33
  314. package/src/_modules/location/_collections/assets/country-subdivisions/austria.json +37 -37
  315. package/src/_modules/location/_collections/assets/country-subdivisions/azerbaijan.json +5 -5
  316. package/src/_modules/location/_collections/assets/country-subdivisions/bahamas.json +125 -125
  317. package/src/_modules/location/_collections/assets/country-subdivisions/bahrain.json +21 -21
  318. package/src/_modules/location/_collections/assets/country-subdivisions/bangladesh.json +29 -29
  319. package/src/_modules/location/_collections/assets/country-subdivisions/barbados.json +45 -45
  320. package/src/_modules/location/_collections/assets/country-subdivisions/belarus.json +29 -29
  321. package/src/_modules/location/_collections/assets/country-subdivisions/belgium.json +13 -13
  322. package/src/_modules/location/_collections/assets/country-subdivisions/belize.json +25 -25
  323. package/src/_modules/location/_collections/assets/country-subdivisions/benin.json +49 -49
  324. package/src/_modules/location/_collections/assets/country-subdivisions/bhutan.json +81 -81
  325. package/src/_modules/location/_collections/assets/country-subdivisions/bolivia.json +37 -37
  326. package/src/_modules/location/_collections/assets/country-subdivisions/bosnia-and-herzegovina.json +13 -13
  327. package/src/_modules/location/_collections/assets/country-subdivisions/botswana.json +65 -65
  328. package/src/_modules/location/_collections/assets/country-subdivisions/brazil.json +109 -109
  329. package/src/_modules/location/_collections/assets/country-subdivisions/brunei-darussalam.json +17 -17
  330. package/src/_modules/location/_collections/assets/country-subdivisions/bulgaria.json +113 -113
  331. package/src/_modules/location/_collections/assets/country-subdivisions/burkina-faso.json +53 -53
  332. package/src/_modules/location/_collections/assets/country-subdivisions/burundi.json +69 -69
  333. package/src/_modules/location/_collections/assets/country-subdivisions/cambodia.json +97 -97
  334. package/src/_modules/location/_collections/assets/country-subdivisions/cameroon.json +41 -41
  335. package/src/_modules/location/_collections/assets/country-subdivisions/canada.json +79 -79
  336. package/src/_modules/location/_collections/assets/country-subdivisions/cape-verde.json +9 -9
  337. package/src/_modules/location/_collections/assets/country-subdivisions/central-african-republic.json +69 -69
  338. package/src/_modules/location/_collections/assets/country-subdivisions/chad.json +89 -89
  339. package/src/_modules/location/_collections/assets/country-subdivisions/chile.json +61 -61
  340. package/src/_modules/location/_collections/assets/country-subdivisions/china.json +205 -205
  341. package/src/_modules/location/_collections/assets/country-subdivisions/colombia.json +133 -133
  342. package/src/_modules/location/_collections/assets/country-subdivisions/comoros.json +13 -13
  343. package/src/_modules/location/_collections/assets/country-subdivisions/congo-the-democratic-republic-of-the.json +45 -45
  344. package/src/_modules/location/_collections/assets/country-subdivisions/congo.json +49 -49
  345. package/src/_modules/location/_collections/assets/country-subdivisions/costa-rica.json +29 -29
  346. package/src/_modules/location/_collections/assets/country-subdivisions/cote-d-ivoire-republic-of.json +77 -77
  347. package/src/_modules/location/_collections/assets/country-subdivisions/croatia.json +85 -85
  348. package/src/_modules/location/_collections/assets/country-subdivisions/cuba.json +65 -65
  349. package/src/_modules/location/_collections/assets/country-subdivisions/cyprus.json +25 -25
  350. package/src/_modules/location/_collections/assets/country-subdivisions/czech-republic.json +57 -57
  351. package/src/_modules/location/_collections/assets/country-subdivisions/denmark.json +21 -21
  352. package/src/_modules/location/_collections/assets/country-subdivisions/djibouti.json +25 -25
  353. package/src/_modules/location/_collections/assets/country-subdivisions/dominica.json +41 -41
  354. package/src/_modules/location/_collections/assets/country-subdivisions/dominican-republic.json +41 -41
  355. package/src/_modules/location/_collections/assets/country-subdivisions/ecuador.json +97 -97
  356. package/src/_modules/location/_collections/assets/country-subdivisions/egypt.json +117 -117
  357. package/src/_modules/location/_collections/assets/country-subdivisions/el-salvador.json +57 -57
  358. package/src/_modules/location/_collections/assets/country-subdivisions/equatorial-guinea.json +9 -9
  359. package/src/_modules/location/_collections/assets/country-subdivisions/eritrea.json +25 -25
  360. package/src/_modules/location/_collections/assets/country-subdivisions/estonia.json +61 -61
  361. package/src/_modules/location/_collections/assets/country-subdivisions/ethiopia.json +45 -45
  362. package/src/_modules/location/_collections/assets/country-subdivisions/fiji.json +21 -21
  363. package/src/_modules/location/_collections/assets/country-subdivisions/finland.json +77 -77
  364. package/src/_modules/location/_collections/assets/country-subdivisions/france.json +133 -133
  365. package/src/_modules/location/_collections/assets/country-subdivisions/gabon.json +37 -37
  366. package/src/_modules/location/_collections/assets/country-subdivisions/gambia.json +25 -25
  367. package/src/_modules/location/_collections/assets/country-subdivisions/georgia.json +49 -49
  368. package/src/_modules/location/_collections/assets/country-subdivisions/germany.json +65 -65
  369. package/src/_modules/location/_collections/assets/country-subdivisions/ghana.json +41 -41
  370. package/src/_modules/location/_collections/assets/country-subdivisions/greece.json +53 -53
  371. package/src/_modules/location/_collections/assets/country-subdivisions/greenland.json +17 -17
  372. package/src/_modules/location/_collections/assets/country-subdivisions/grenada.json +29 -29
  373. package/src/_modules/location/_collections/assets/country-subdivisions/guatemala.json +89 -89
  374. package/src/_modules/location/_collections/assets/country-subdivisions/guinea-bissau.json +13 -13
  375. package/src/_modules/location/_collections/assets/country-subdivisions/guinea.json +33 -33
  376. package/src/_modules/location/_collections/assets/country-subdivisions/guyana.json +41 -41
  377. package/src/_modules/location/_collections/assets/country-subdivisions/haiti.json +41 -41
  378. package/src/_modules/location/_collections/assets/country-subdivisions/honduras.json +73 -73
  379. package/src/_modules/location/_collections/assets/country-subdivisions/hong-kong.json +4 -4
  380. package/src/_modules/location/_collections/assets/country-subdivisions/hungary.json +173 -173
  381. package/src/_modules/location/_collections/assets/country-subdivisions/iceland.json +37 -37
  382. package/src/_modules/location/_collections/assets/country-subdivisions/india.json +181 -181
  383. package/src/_modules/location/_collections/assets/country-subdivisions/indonesia.json +29 -29
  384. package/src/_modules/location/_collections/assets/country-subdivisions/iran-islamic-republic-of.json +125 -125
  385. package/src/_modules/location/_collections/assets/country-subdivisions/iraq.json +73 -73
  386. package/src/_modules/location/_collections/assets/country-subdivisions/ireland.json +17 -17
  387. package/src/_modules/location/_collections/assets/country-subdivisions/israel.json +25 -25
  388. package/src/_modules/location/_collections/assets/country-subdivisions/italy.json +81 -81
  389. package/src/_modules/location/_collections/assets/country-subdivisions/jamaica.json +57 -57
  390. package/src/_modules/location/_collections/assets/country-subdivisions/japan.json +189 -189
  391. package/src/_modules/location/_collections/assets/country-subdivisions/jordan.json +49 -49
  392. package/src/_modules/location/_collections/assets/country-subdivisions/kazakhstan.json +65 -65
  393. package/src/_modules/location/_collections/assets/country-subdivisions/kenya.json +33 -33
  394. package/src/_modules/location/_collections/assets/country-subdivisions/kiribati.json +13 -13
  395. package/src/_modules/location/_collections/assets/country-subdivisions/korea-democratic-people-s-republic-of.json +45 -45
  396. package/src/_modules/location/_collections/assets/country-subdivisions/korea-republic-of.json +69 -69
  397. package/src/_modules/location/_collections/assets/country-subdivisions/kuwait.json +25 -25
  398. package/src/_modules/location/_collections/assets/country-subdivisions/kyrgyzstan.json +33 -33
  399. package/src/_modules/location/_collections/assets/country-subdivisions/lao-people-s-democratic-republic.json +73 -73
  400. package/src/_modules/location/_collections/assets/country-subdivisions/latvia.json +477 -477
  401. package/src/_modules/location/_collections/assets/country-subdivisions/lebanon.json +33 -33
  402. package/src/_modules/location/_collections/assets/country-subdivisions/lesotho.json +41 -41
  403. package/src/_modules/location/_collections/assets/country-subdivisions/liberia.json +61 -61
  404. package/src/_modules/location/_collections/assets/country-subdivisions/libyan-arab-jamahiriya.json +89 -89
  405. package/src/_modules/location/_collections/assets/country-subdivisions/liechtenstein.json +45 -45
  406. package/src/_modules/location/_collections/assets/country-subdivisions/lithuania.json +41 -41
  407. package/src/_modules/location/_collections/assets/country-subdivisions/luxembourg.json +13 -13
  408. package/src/_modules/location/_collections/assets/country-subdivisions/macedonia-the-former-yugoslav-republic-of.json +337 -337
  409. package/src/_modules/location/_collections/assets/country-subdivisions/madagascar.json +25 -25
  410. package/src/_modules/location/_collections/assets/country-subdivisions/malawi.json +13 -13
  411. package/src/_modules/location/_collections/assets/country-subdivisions/malaysia.json +81 -81
  412. package/src/_modules/location/_collections/assets/country-subdivisions/maldives.json +33 -33
  413. package/src/_modules/location/_collections/assets/country-subdivisions/mali.json +37 -37
  414. package/src/_modules/location/_collections/assets/country-subdivisions/malta.json +273 -273
  415. package/src/_modules/location/_collections/assets/country-subdivisions/marshall-islands.json +9 -9
  416. package/src/_modules/location/_collections/assets/country-subdivisions/mauritania.json +53 -53
  417. package/src/_modules/location/_collections/assets/country-subdivisions/mauritius.json +69 -69
  418. package/src/_modules/location/_collections/assets/country-subdivisions/mexico.json +161 -161
  419. package/src/_modules/location/_collections/assets/country-subdivisions/micronesia-federated-states-of.json +17 -17
  420. package/src/_modules/location/_collections/assets/country-subdivisions/moldova-republic-of.json +149 -149
  421. package/src/_modules/location/_collections/assets/country-subdivisions/monaco.json +69 -69
  422. package/src/_modules/location/_collections/assets/country-subdivisions/mongolia.json +89 -89
  423. package/src/_modules/location/_collections/assets/country-subdivisions/montenegro.json +93 -93
  424. package/src/_modules/location/_collections/assets/country-subdivisions/morocco.json +65 -65
  425. package/src/_modules/location/_collections/assets/country-subdivisions/mozambique.json +45 -45
  426. package/src/_modules/location/_collections/assets/country-subdivisions/myanmar.json +57 -57
  427. package/src/_modules/location/_collections/assets/country-subdivisions/namibia.json +57 -57
  428. package/src/_modules/location/_collections/assets/country-subdivisions/nauru.json +57 -57
  429. package/src/_modules/location/_collections/assets/country-subdivisions/nepal.json +21 -21
  430. package/src/_modules/location/_collections/assets/country-subdivisions/netherlands.json +91 -91
  431. package/src/_modules/location/_collections/assets/country-subdivisions/new-zealand.json +111 -111
  432. package/src/_modules/location/_collections/assets/country-subdivisions/nicaragua.json +69 -69
  433. package/src/_modules/location/_collections/assets/country-subdivisions/niger.json +33 -33
  434. package/src/_modules/location/_collections/assets/country-subdivisions/nigeria.json +149 -149
  435. package/src/_modules/location/_collections/assets/country-subdivisions/norway.json +85 -85
  436. package/src/_modules/location/_collections/assets/country-subdivisions/oman.json +37 -37
  437. package/src/_modules/location/_collections/assets/country-subdivisions/pakistan.json +33 -33
  438. package/src/_modules/location/_collections/assets/country-subdivisions/palau.json +65 -65
  439. package/src/_modules/location/_collections/assets/country-subdivisions/palestinian-territory-occupied.json +65 -65
  440. package/src/_modules/location/_collections/assets/country-subdivisions/panama.json +53 -53
  441. package/src/_modules/location/_collections/assets/country-subdivisions/papua-new-guinea.json +81 -81
  442. package/src/_modules/location/_collections/assets/country-subdivisions/paraguay.json +73 -73
  443. package/src/_modules/location/_collections/assets/country-subdivisions/peru.json +105 -105
  444. package/src/_modules/location/_collections/assets/country-subdivisions/philippines.json +69 -69
  445. package/src/_modules/location/_collections/assets/country-subdivisions/poland.json +65 -65
  446. package/src/_modules/location/_collections/assets/country-subdivisions/portugal.json +81 -81
  447. package/src/_modules/location/_collections/assets/country-subdivisions/qatar.json +29 -29
  448. package/src/_modules/location/_collections/assets/country-subdivisions/romania.json +169 -169
  449. package/src/_modules/location/_collections/assets/country-subdivisions/russian-federation.json +499 -499
  450. package/src/_modules/location/_collections/assets/country-subdivisions/rwanda.json +21 -21
  451. package/src/_modules/location/_collections/assets/country-subdivisions/saint-helena-ascension-and-tristan-da-cunha.json +13 -13
  452. package/src/_modules/location/_collections/assets/country-subdivisions/saint-kitts-and-nevis.json +9 -9
  453. package/src/_modules/location/_collections/assets/country-subdivisions/saint-lucia.json +45 -45
  454. package/src/_modules/location/_collections/assets/country-subdivisions/saint-vincent-and-the-grenadines.json +25 -25
  455. package/src/_modules/location/_collections/assets/country-subdivisions/samoa.json +45 -45
  456. package/src/_modules/location/_collections/assets/country-subdivisions/san-marino.json +37 -37
  457. package/src/_modules/location/_collections/assets/country-subdivisions/sao-tome-and-principe.json +9 -9
  458. package/src/_modules/location/_collections/assets/country-subdivisions/saudi-arabia.json +53 -53
  459. package/src/_modules/location/_collections/assets/country-subdivisions/senegal.json +57 -57
  460. package/src/_modules/location/_collections/assets/country-subdivisions/serbia.json +9 -9
  461. package/src/_modules/location/_collections/assets/country-subdivisions/seychelles.json +101 -101
  462. package/src/_modules/location/_collections/assets/country-subdivisions/sierra-leone.json +17 -17
  463. package/src/_modules/location/_collections/assets/country-subdivisions/singapore.json +21 -21
  464. package/src/_modules/location/_collections/assets/country-subdivisions/slovakia.json +33 -33
  465. package/src/_modules/location/_collections/assets/country-subdivisions/slovenia.json +841 -841
  466. package/src/_modules/location/_collections/assets/country-subdivisions/solomon-islands.json +41 -41
  467. package/src/_modules/location/_collections/assets/country-subdivisions/somalia.json +73 -73
  468. package/src/_modules/location/_collections/assets/country-subdivisions/south-africa.json +37 -37
  469. package/src/_modules/location/_collections/assets/country-subdivisions/south-sudan.json +41 -41
  470. package/src/_modules/location/_collections/assets/country-subdivisions/spain.json +346 -346
  471. package/src/_modules/location/_collections/assets/country-subdivisions/sri-lanka.json +37 -37
  472. package/src/_modules/location/_collections/assets/country-subdivisions/sudan.json +69 -69
  473. package/src/_modules/location/_collections/assets/country-subdivisions/suriname.json +41 -41
  474. package/src/_modules/location/_collections/assets/country-subdivisions/swaziland.json +17 -17
  475. package/src/_modules/location/_collections/assets/country-subdivisions/sweden.json +85 -85
  476. package/src/_modules/location/_collections/assets/country-subdivisions/switzerland.json +105 -105
  477. package/src/_modules/location/_collections/assets/country-subdivisions/syrian-arab-republic.json +57 -57
  478. package/src/_modules/location/_collections/assets/country-subdivisions/taiwan-province-of-china.json +93 -93
  479. package/src/_modules/location/_collections/assets/country-subdivisions/tajikistan.json +17 -17
  480. package/src/_modules/location/_collections/assets/country-subdivisions/tanzania-united-republic-of.json +105 -105
  481. package/src/_modules/location/_collections/assets/country-subdivisions/thailand.json +313 -313
  482. package/src/_modules/location/_collections/assets/country-subdivisions/timor-leste.json +53 -53
  483. package/src/_modules/location/_collections/assets/country-subdivisions/togo.json +21 -21
  484. package/src/_modules/location/_collections/assets/country-subdivisions/tonga.json +21 -21
  485. package/src/_modules/location/_collections/assets/country-subdivisions/trinidad-and-tobago.json +65 -65
  486. package/src/_modules/location/_collections/assets/country-subdivisions/tunisia.json +97 -97
  487. package/src/_modules/location/_collections/assets/country-subdivisions/turkey.json +325 -325
  488. package/src/_modules/location/_collections/assets/country-subdivisions/turkmenistan.json +25 -25
  489. package/src/_modules/location/_collections/assets/country-subdivisions/tuvalu.json +33 -33
  490. package/src/_modules/location/_collections/assets/country-subdivisions/uganda.json +17 -17
  491. package/src/_modules/location/_collections/assets/country-subdivisions/ukraine.json +109 -109
  492. package/src/_modules/location/_collections/assets/country-subdivisions/united-arab-emirates.json +29 -29
  493. package/src/_modules/location/_collections/assets/country-subdivisions/united-kingdom.json +1196 -1196
  494. package/src/_modules/location/_collections/assets/country-subdivisions/united-states-minor-outlying-islands.json +37 -37
  495. package/src/_modules/location/_collections/assets/country-subdivisions/united-states.json +286 -286
  496. package/src/_modules/location/_collections/assets/country-subdivisions/uruguay.json +77 -77
  497. package/src/_modules/location/_collections/assets/country-subdivisions/uzbekistan.json +57 -57
  498. package/src/_modules/location/_collections/assets/country-subdivisions/vanuatu.json +25 -25
  499. package/src/_modules/location/_collections/assets/country-subdivisions/venezuela.json +101 -101
  500. package/src/_modules/location/_collections/assets/country-subdivisions/viet-nam.json +257 -257
  501. package/src/_modules/location/_collections/assets/country-subdivisions/yemen.json +85 -85
  502. package/src/_modules/location/_collections/assets/country-subdivisions/zambia.json +37 -37
  503. package/src/_modules/location/_collections/assets/country-subdivisions/zimbabwe.json +41 -41
  504. package/src/_modules/location/_collections/loc-country-divisions.const.ts +10 -10
  505. package/src/_modules/location/_collections/loc-country-isos.const.ts +8 -8
  506. package/src/_modules/location/_collections/loc-regions.util.spec.ts +61 -61
  507. package/src/_modules/location/_collections/loc-regions.util.ts +137 -137
  508. package/src/_modules/location/_collections/loc.util.spec.ts +52 -52
  509. package/src/_modules/location/_collections/loc.util.ts +74 -74
  510. package/src/_modules/location/_enums/loc-region.enum.ts +14 -14
  511. package/src/_modules/location/_enums/loc-sub-region.enum.ts +31 -31
  512. package/src/_modules/location/_enums/loc-subdivision-region-type.enum.ts +47 -47
  513. package/src/_modules/location/_models/loc-coordinates.interface.ts +7 -7
  514. package/src/_modules/location/_models/loc-country-division.interface.ts +8 -8
  515. package/src/_modules/location/_models/loc-country-iso.interface.ts +23 -23
  516. package/src/_modules/location/_models/loc-country-phone-code.interface.ts +9 -9
  517. package/src/_modules/location/_models/loc-division-collection.interface.ts +12 -12
  518. package/src/_modules/location/_models/loc-division-region-data.interface.ts +9 -9
  519. package/src/_modules/location/_models/loc-geo-ip-location.interface.ts +27 -27
  520. package/src/_modules/location/index.ts +22 -22
  521. package/src/_modules/messaging/README.md +279 -279
  522. package/src/_modules/messaging/_collections/msg-module-settings.const.ts +46 -46
  523. package/src/_modules/messaging/_enums/msg-attachment-type.enum.ts +26 -26
  524. package/src/_modules/messaging/_enums/msg-conversation-type.enum.ts +20 -20
  525. package/src/_modules/messaging/_enums/msg-delivery-status.enum.ts +17 -17
  526. package/src/_modules/messaging/_enums/msg-event-key.enum.ts +31 -31
  527. package/src/_modules/messaging/_enums/msg-participant-role.enum.ts +20 -20
  528. package/src/_modules/messaging/_enums/msg-provider-type.enum.ts +7 -7
  529. package/src/_modules/messaging/_enums/msg-status.enum.ts +26 -26
  530. package/src/_modules/messaging/_enums/msg-type.enum.ts +23 -23
  531. package/src/_modules/messaging/_models/msg-attachment.interface.ts +46 -46
  532. package/src/_modules/messaging/_models/msg-conversation.data-model.spec.ts +69 -69
  533. package/src/_modules/messaging/_models/msg-conversation.data-model.ts +96 -96
  534. package/src/_modules/messaging/_models/msg-mention.interface.ts +29 -29
  535. package/src/_modules/messaging/_models/msg-message.data-model.spec.ts +79 -79
  536. package/src/_modules/messaging/_models/msg-message.data-model.ts +127 -127
  537. package/src/_modules/messaging/_models/msg-participant.interface.ts +46 -46
  538. package/src/_modules/messaging/_models/msg-reaction.interface.ts +20 -20
  539. package/src/_modules/messaging/_models/msg-thread-info.interface.ts +35 -35
  540. package/src/_modules/messaging/_modules/agent/_enums/agt-process-step-type.enum.ts +35 -35
  541. package/src/_modules/messaging/_modules/agent/_enums/agt-tool-status.enum.ts +23 -23
  542. package/src/_modules/messaging/_modules/agent/_models/agt-process-step.interface.ts +55 -55
  543. package/src/_modules/messaging/_modules/agent/_models/agt-reasoning-info.interface.ts +26 -26
  544. package/src/_modules/messaging/_modules/agent/_models/agt-tool-usage.interface.ts +37 -37
  545. package/src/_modules/messaging/_modules/agent/index.ts +8 -8
  546. package/src/_modules/messaging/index.ts +28 -28
  547. package/src/_modules/ngx-models/_collections/angular-placeholders.ts +34 -34
  548. package/src/_modules/ngx-models/_collections/button-new-style-settings-presets.const.ts +181 -181
  549. package/src/_modules/ngx-models/_collections/dynamo-global.settings.spec.ts +74 -74
  550. package/src/_modules/ngx-models/_collections/dynamo-global.settings.ts +103 -103
  551. package/src/_modules/ngx-models/_enums/button-new/button-new-border-radius.enum.ts +16 -16
  552. package/src/_modules/ngx-models/_enums/button-new/button-new-icon-style-type.enum.ts +14 -14
  553. package/src/_modules/ngx-models/_enums/button-new/button-new-size.enum.ts +16 -16
  554. package/src/_modules/ngx-models/_enums/button-new/button-new-style-type.enum.ts +18 -18
  555. package/src/_modules/ngx-models/_enums/button-type.enum.ts +36 -36
  556. package/src/_modules/ngx-models/_enums/checkbox-label-position.enum.ts +8 -8
  557. package/src/_modules/ngx-models/_enums/container-type.enum.ts +11 -11
  558. package/src/_modules/ngx-models/_enums/errors/error-level.enum.ts +13 -13
  559. package/src/_modules/ngx-models/_enums/errors/error-notification-color.enum.ts +13 -13
  560. package/src/_modules/ngx-models/_enums/errors/error-ui-mode.enum.ts +13 -13
  561. package/src/_modules/ngx-models/_enums/field-appearance.enum.ts +14 -14
  562. package/src/_modules/ngx-models/_enums/field-type.enum.ts +52 -52
  563. package/src/_modules/ngx-models/_enums/file-type.enum.ts +12 -12
  564. package/src/_modules/ngx-models/_enums/flex/flex-layout-align.enum.ts +21 -21
  565. package/src/_modules/ngx-models/_enums/flex/flex-layout.enum.ts +5 -5
  566. package/src/_modules/ngx-models/_enums/form-access.enum.ts +9 -9
  567. package/src/_modules/ngx-models/_enums/form-reset-data.enum.ts +12 -12
  568. package/src/_modules/ngx-models/_enums/form-store-on.enum.ts +9 -9
  569. package/src/_modules/ngx-models/_enums/forms-new/field-new-validator-type.enum.ts +20 -20
  570. package/src/_modules/ngx-models/_enums/frames/header-item-type.enum.ts +15 -15
  571. package/src/_modules/ngx-models/_enums/frames/header-position.enum.ts +10 -10
  572. package/src/_modules/ngx-models/_enums/frames/side-nav-badge-color.enum.ts +13 -13
  573. package/src/_modules/ngx-models/_enums/html/input-types.enum.ts +27 -27
  574. package/src/_modules/ngx-models/_enums/material-color.enum.ts +16 -16
  575. package/src/_modules/ngx-models/_enums/material-tooltip-position.enum.ts +16 -16
  576. package/src/_modules/ngx-models/_enums/preconfigured-field-type.enum.ts +8 -8
  577. package/src/_modules/ngx-models/_enums/storage-type.enum.ts +15 -15
  578. package/src/_modules/ngx-models/_enums/validator-type.enum.ts +9 -9
  579. package/src/_modules/ngx-models/_enums/voice/audio-mime-type.enum.ts +14 -14
  580. package/src/_modules/ngx-models/_enums/voice/voice-provider-type.enum.ts +26 -26
  581. package/src/_modules/ngx-models/_enums/voice/voice-recorder-state.enum.ts +20 -20
  582. package/src/_modules/ngx-models/_models/control-models/button-new-style-settings.control-model.ts +37 -37
  583. package/src/_modules/ngx-models/_models/control-models/button-params.control-model.spec.ts +70 -70
  584. package/src/_modules/ngx-models/_models/control-models/button-params.control-model.ts +332 -332
  585. package/src/_modules/ngx-models/_models/control-models/chat/chat-column-layout-settings.control-model.ts +28 -28
  586. package/src/_modules/ngx-models/_models/control-models/data-handler-settings.control-model.spec.ts +90 -90
  587. package/src/_modules/ngx-models/_models/control-models/data-handler-settings.control-model.ts +134 -134
  588. package/src/_modules/ngx-models/_models/control-models/data-handler.control-model.ts +529 -529
  589. package/src/_modules/ngx-models/_models/control-models/errors/error-notification.control-model.ts +52 -52
  590. package/src/_modules/ngx-models/_models/control-models/errors/error-settings.control-model.ts +34 -34
  591. package/src/_modules/ngx-models/_models/control-models/errors/errors-pojo.spec.ts +86 -86
  592. package/src/_modules/ngx-models/_models/control-models/errors/errors-settings.control-model.ts +52 -52
  593. package/src/_modules/ngx-models/_models/control-models/field-settings.control-model.spec.ts +109 -109
  594. package/src/_modules/ngx-models/_models/control-models/field-settings.control-model.ts +133 -133
  595. package/src/_modules/ngx-models/_models/control-models/form-settings.control-model.spec.ts +109 -109
  596. package/src/_modules/ngx-models/_models/control-models/form-settings.control-model.ts +160 -160
  597. package/src/_modules/ngx-models/_models/control-models/forms-new/checkbox-field-new-settings.control-model.ts +25 -25
  598. package/src/_modules/ngx-models/_models/control-models/forms-new/date-field-new-settings.control-model.ts +26 -26
  599. package/src/_modules/ngx-models/_models/control-models/forms-new/date-range-field-new-settings.control-model.ts +42 -42
  600. package/src/_modules/ngx-models/_models/control-models/forms-new/datetime-field-new-settings.control-model.ts +35 -35
  601. package/src/_modules/ngx-models/_models/control-models/forms-new/datetime-range-field-new-settings.control-model.ts +35 -35
  602. package/src/_modules/ngx-models/_models/control-models/forms-new/field-new-settings.control-model.ts +85 -85
  603. package/src/_modules/ngx-models/_models/control-models/forms-new/field-new-types.ts +42 -42
  604. package/src/_modules/ngx-models/_models/control-models/forms-new/form-new-settings.control-model.ts +40 -40
  605. package/src/_modules/ngx-models/_models/control-models/forms-new/forms-new.spec.ts +179 -179
  606. package/src/_modules/ngx-models/_models/control-models/forms-new/index.ts +20 -20
  607. package/src/_modules/ngx-models/_models/control-models/forms-new/multiselect-field-new-settings.control-model.ts +27 -27
  608. package/src/_modules/ngx-models/_models/control-models/forms-new/number-field-new-settings.control-model.ts +24 -24
  609. package/src/_modules/ngx-models/_models/control-models/forms-new/password-field-new-settings.control-model.ts +35 -35
  610. package/src/_modules/ngx-models/_models/control-models/forms-new/radio-select-field-new-settings.control-model.ts +35 -35
  611. package/src/_modules/ngx-models/_models/control-models/forms-new/select-field-new-settings.control-model.ts +46 -46
  612. package/src/_modules/ngx-models/_models/control-models/forms-new/slider-field-new-settings.control-model.ts +37 -37
  613. package/src/_modules/ngx-models/_models/control-models/forms-new/slider-range-field-new-settings.control-model.ts +45 -45
  614. package/src/_modules/ngx-models/_models/control-models/forms-new/text-field-new-settings.control-model.ts +30 -30
  615. package/src/_modules/ngx-models/_models/control-models/forms-new/textarea-field-new-settings.control-model.ts +22 -22
  616. package/src/_modules/ngx-models/_models/control-models/frames/frames-pojo.spec.ts +108 -108
  617. package/src/_modules/ngx-models/_models/control-models/frames/header-item-settings.control-model.ts +52 -52
  618. package/src/_modules/ngx-models/_models/control-models/frames/main-frame-settings.control-model.ts +40 -40
  619. package/src/_modules/ngx-models/_models/control-models/frames/side-nav-item-settings.control-model.ts +55 -55
  620. package/src/_modules/ngx-models/_models/control-models/frames/side-nav-settings.control-model.ts +30 -30
  621. package/src/_modules/ngx-models/_models/control-models/select.control-model.spec.ts +45 -45
  622. package/src/_modules/ngx-models/_models/control-models/select.control-model.ts +28 -28
  623. package/src/_modules/ngx-models/_models/control-models/voice/voice-pojo.spec.ts +111 -111
  624. package/src/_modules/ngx-models/_models/control-models/voice/voice-providers-settings.control-model.ts +74 -74
  625. package/src/_modules/ngx-models/_models/control-models/voice/voice-record-button-settings.control-model.ts +42 -42
  626. package/src/_modules/ngx-models/_models/control-models/voice/voice-recorder-settings.control-model.ts +37 -37
  627. package/src/_modules/ngx-models/_models/interfaces/button-new-settings.interface.ts +74 -74
  628. package/src/_modules/ngx-models/_models/interfaces/confirm-settings.interface.ts +20 -20
  629. package/src/_modules/ngx-models/_models/interfaces/global-settings.interface.ts +67 -67
  630. package/src/_modules/ngx-models/_models/interfaces/select-options-custom-constructor.interface.ts +40 -40
  631. package/src/_modules/ngx-models/_models/interfaces/storage.service.spec.ts +18 -18
  632. package/src/_modules/ngx-models/_models/interfaces/storage.service.ts +40 -40
  633. package/src/_modules/ngx-models/_models/interfaces/voice/speak-options.interface.ts +19 -19
  634. package/src/_modules/ngx-models/_models/interfaces/voice/speak-result.interface.ts +14 -14
  635. package/src/_modules/ngx-models/_models/interfaces/voice/transcribe-options.interface.ts +14 -14
  636. package/src/_modules/ngx-models/_models/interfaces/voice/transcribe-result.interface.ts +15 -15
  637. package/src/_modules/ngx-models/_models/interfaces/voice/voice-profile.interface.ts +18 -18
  638. package/src/_modules/ngx-models/_models/interfaces/voice/voice-provider-init.interface.ts +21 -21
  639. package/src/_modules/ngx-models/_utils/shared.service.spec.ts +7 -7
  640. package/src/_modules/ngx-models/_utils/shared.service.ts +541 -541
  641. package/src/_modules/ngx-models/index.ts +110 -110
  642. package/src/_modules/pipe/_collections/pip-transforms.const.ts +42 -42
  643. package/src/_modules/pipe/_collections/utils/pip-country-pipe.util.spec.ts +47 -47
  644. package/src/_modules/pipe/_collections/utils/pip-country-pipe.util.ts +41 -41
  645. package/src/_modules/pipe/_collections/utils/pip-custom-pipe.util.spec.ts +39 -39
  646. package/src/_modules/pipe/_collections/utils/pip-custom-pipe.util.ts +30 -30
  647. package/src/_modules/pipe/_collections/utils/pip-division-pipe.util.spec.ts +41 -41
  648. package/src/_modules/pipe/_collections/utils/pip-division-pipe.util.ts +36 -36
  649. package/src/_modules/pipe/_collections/utils/pip-json-pipe.util.spec.ts +62 -62
  650. package/src/_modules/pipe/_collections/utils/pip-json-pipe.util.ts +17 -17
  651. package/src/_modules/pipe/_collections/utils/pip-list-pipe.util.spec.ts +34 -34
  652. package/src/_modules/pipe/_collections/utils/pip-list-pipe.util.ts +25 -25
  653. package/src/_modules/pipe/_collections/utils/pip-multi-pipe-pipe.util.spec.ts +67 -67
  654. package/src/_modules/pipe/_collections/utils/pip-multi-pipe-pipe.util.ts +226 -226
  655. package/src/_modules/pipe/_collections/utils/pip-obj-key-pipe.util.spec.ts +28 -28
  656. package/src/_modules/pipe/_collections/utils/pip-obj-key-pipe.util.ts +21 -21
  657. package/src/_modules/pipe/_collections/utils/pip-range-pipe.util.spec.ts +59 -59
  658. package/src/_modules/pipe/_collections/utils/pip-range-pipe.util.ts +106 -106
  659. package/src/_modules/pipe/_collections/utils/pip-region-pipe.util.spec.ts +31 -31
  660. package/src/_modules/pipe/_collections/utils/pip-region-pipe.util.ts +35 -35
  661. package/src/_modules/pipe/_collections/utils/pip-replace-pipe.util.spec.ts +44 -44
  662. package/src/_modules/pipe/_collections/utils/pip-replace-pipe.util.ts +23 -23
  663. package/src/_modules/pipe/_collections/utils/pip-slider-pipe.util.spec.ts +21 -21
  664. package/src/_modules/pipe/_collections/utils/pip-slider-pipe.util.ts +33 -33
  665. package/src/_modules/pipe/_collections/utils/pip-smart-replace-pipe.util.spec.ts +62 -62
  666. package/src/_modules/pipe/_collections/utils/pip-smart-replace-pipe.util.ts +80 -80
  667. package/src/_modules/pipe/_enums/pip-range-pipe-setting.enum.ts +15 -15
  668. package/src/_modules/pipe/_enums/pip.enum.ts +65 -65
  669. package/src/_modules/pipe/_models/pip-multi-pipe-settings.type.ts +8 -8
  670. package/src/_modules/pipe/_models/pip-transforms.interface.ts +30 -30
  671. package/src/_modules/pipe/index.ts +30 -30
  672. package/src/_modules/security/_collections/stored-secret.util.spec.ts +81 -81
  673. package/src/_modules/security/_collections/stored-secret.util.ts +96 -96
  674. package/src/_modules/security/_models/stored-secret.control-model.ts +55 -55
  675. package/src/_modules/security/index.ts +9 -9
  676. package/src/_modules/socket/_enums/sck-event-key.enum.ts +21 -21
  677. package/src/_modules/socket/_models/sck-client-params.control-model.spec.ts +67 -67
  678. package/src/_modules/socket/_models/sck-client-params.control-model.ts +50 -50
  679. package/src/_modules/socket/_models/sck-socket-event.control-model.spec.ts +89 -66
  680. package/src/_modules/socket/_models/sck-socket-event.control-model.ts +185 -172
  681. package/src/_modules/socket/_services/sck-client.service-base.spec.ts +99 -99
  682. package/src/_modules/socket/_services/sck-client.service-base.ts +353 -353
  683. package/src/_modules/socket/index.ts +14 -14
  684. package/src/_modules/state-machine/_models/state-machine-config.interface.ts +19 -19
  685. package/src/_modules/state-machine/_models/state-machine-event.interface.ts +25 -25
  686. package/src/_modules/state-machine/_models/state-machine.control-model.spec.ts +314 -314
  687. package/src/_modules/state-machine/_models/state-machine.control-model.ts +298 -298
  688. package/src/_modules/state-machine/_models/state-transition-result.interface.ts +53 -53
  689. package/src/_modules/state-machine/_models/state-transition.interface.ts +30 -30
  690. package/src/_modules/state-machine/index.ts +6 -6
  691. package/src/_modules/test/_collections/tst-module-settings.const.ts +67 -67
  692. package/src/_modules/test/index.ts +5 -5
  693. package/src/_modules/usage/_collections/usg-module-settings.const.ts +33 -33
  694. package/src/_modules/usage/_models/usg-action.control-model.spec.ts +27 -27
  695. package/src/_modules/usage/_models/usg-action.control-model.ts +28 -28
  696. package/src/_modules/usage/_models/usg-daily-usage-data.control-model.spec.ts +36 -36
  697. package/src/_modules/usage/_models/usg-daily-usage-data.control-model.ts +35 -35
  698. package/src/_modules/usage/_models/usg-data.control-model.spec.ts +41 -41
  699. package/src/_modules/usage/_models/usg-data.control-model.ts +35 -35
  700. package/src/_modules/usage/_models/usg-session.data-model.spec.ts +97 -97
  701. package/src/_modules/usage/_models/usg-session.data-model.ts +72 -72
  702. package/src/_modules/usage/index.ts +11 -11
  703. package/src/index.ts +104 -104
  704. package/tsconfig.app.json +12 -12
  705. package/tsconfig.json +31 -31
  706. package/tsconfig.test.json +16 -16
  707. package/tslint.json +153 -153
@@ -1,739 +1,739 @@
1
-
2
- import { DyFM_Log } from './log.util';
3
- import { DyFM_JsonErrorHelper } from './json-error-helper.util';
4
- import { DyFM_String } from './string.util';
5
-
6
- export interface DyFM_Object_ParseResult {
7
- unparsableResult: string;
8
- }
9
-
10
- export class DyFM_Object {
11
-
12
- static readonly defaultErrorMsg =
13
- ' failed. ' +
14
- '\nThis might be happening because the object you trying to clone, ' +
15
- 'contains object hooks for its own objects, therefore its creating an object loop. ' +
16
- 'See further information in the detailed error:\n\n';
17
-
18
- /**
19
- * returns remapped object list by path list
20
- * @param objList object list to map
21
- * @param paths string list of path etc.:
22
- * ```ts
23
- * [ [ 'first', 'sub', 'label' ], [ 'first', 'dif', 'name' ] ]
24
- * ```
25
- * will be...
26
- * from
27
- * ```ts
28
- * {
29
- * first: {
30
- * sub: {
31
- * label: 'vlmi'
32
- * },
33
- * dif: {
34
- * name: 'asd'
35
- * }
36
- * }
37
- * }[]
38
- * ```
39
- * to
40
- * ```
41
- * { label: 'vlmi', name: 'asd' }[]
42
- * ```
43
- * @returns remapped object list (the final obj will use the deepest keys)
44
- */
45
- static mapObjList(objList: object[], paths: string[][]): object[] {
46
- let newObjList: object[] = [ ...objList ];
47
-
48
- newObjList = newObjList.map((obj): any => {
49
- const newObj: any = {};
50
-
51
- paths.forEach((path: string[]): void => {
52
- newObj[path[path.length - 1]] = this.getNestedData(obj, path);
53
- });
54
-
55
- return newObj;
56
- });
57
-
58
- return newObjList;
59
- }
60
-
61
- /**
62
- * returns nested value from object
63
- * @param parentObj data source object
64
- * @param nestedDataKeys path of value as string list
65
- * etc.: ['nestLvl1', 'nestLvl2', 'nestLvl3'] as parentObj.nestLvl1.nestLvl2.nestLvl3
66
- * @returns data from object by path
67
- */
68
- static getNestedData(parentObj: object, nestedDataKeys: string[]): any {
69
- let newData: any = this.clone(parentObj); // {...parentObj};
70
-
71
- nestedDataKeys.forEach((dk: string): void => {
72
- if (newData) {
73
- newData = newData[dk];
74
- }
75
- });
76
-
77
- return newData;
78
- }
79
-
80
- /**
81
- * recursive function that nests data
82
- * @param newData the object that that is needed to be updated
83
- * @param nestKeys the path where the data should be updated
84
- * @param dataToSet the actual value that will be setted
85
- * @returns modified data
86
- */
87
- static nestData(parentObj: object, nestKeys: string[], dataToSet: any): object {
88
- const newData: any = this.clone(parentObj); // {...parentObj};
89
-
90
- if (nestKeys.length > 1) {
91
- const keys: string[] = [ ...nestKeys ];
92
- const nextNestKey: string = keys.shift() as string;
93
-
94
- newData[nextNestKey] = this.nestData(newData[nextNestKey], keys, dataToSet);
95
- } else {
96
- newData[nestKeys[0]] = dataToSet;
97
- }
98
-
99
- return newData;
100
- }
101
-
102
- /**
103
- * recursive function that adds to nested data
104
- * @param newData the object that that is needed to be updated
105
- * @param nestKeys the path where the data should be updated
106
- * @param dataToAdd the actual value that will be setted
107
- * @returns modified data
108
- */
109
- static addToNestedData(parentObj: object, nestKeys: string[], dataToAdd: any): object {
110
- const newData: any = this.clone(parentObj); // {...parentObj};
111
-
112
- if (nestKeys.length > 1) {
113
- const keys: string[] = [ ...nestKeys ];
114
- const nextNestKey: string = keys.shift() as string;
115
-
116
- newData[nextNestKey] = this.addToNestedData(newData[nextNestKey], keys, dataToAdd);
117
- } else {
118
- newData[nestKeys[0]] += dataToAdd;
119
- }
120
-
121
- return newData;
122
- }
123
-
124
- /**
125
- * recursive function that pushes to nested data
126
- * @param newData the object that that is needed to be updated
127
- * @param nestKeys the path where the data should be updated
128
- * @param dataToPush the actual value that will be setted
129
- * @returns modified data
130
- */
131
- static pushToNestedData(parentObj: object, nestKeys: string[], dataToPush: any): object {
132
- const newData: any = this.clone(parentObj); // {...parentObj};
133
-
134
- if (nestKeys.length > 1) {
135
- const keys: string[] = [ ...nestKeys ];
136
- const nextNestKey: string = keys.shift() as string;
137
-
138
- newData[nextNestKey] = this.pushToNestedData(newData[nextNestKey], keys, dataToPush);
139
- } else {
140
- if (Array.isArray(newData[nestKeys[0]])) {
141
- newData[nestKeys[0]].push(dataToPush);
142
- } else {
143
- newData[nestKeys[0]] = [ dataToPush ];
144
- }
145
- }
146
-
147
- return newData;
148
- }
149
-
150
- /**
151
- * recursive function that nests data on recursive data structure etc.: xData: { ..., 'nestedListKey': xData[] }
152
- * @param newData the object that that is needed to be updated
153
- * @param nestedListKey the location of nested dataList
154
- * @param nestIndexes path to the subject ect.: xData.listKey[1].listKey[4].listKey[0] will be [1, 4, 0]
155
- * @param dataToSet the actual value that will be seted on location
156
- * @returns modified data
157
- */
158
- static nestRecursiveListedData<T>(
159
- parentObj: T,
160
- nestedListKey: string,
161
- nestIndexes: number[],
162
- dataToSet: any
163
- ): T {
164
- const newData: any = this.clone(parentObj); // parentObj; // {...parentObj};
165
-
166
- if (nestIndexes.length > 1) {
167
- const indexes: number[] = [ ...nestIndexes ];
168
- const nextLevelKey: number = indexes.shift() as number;
169
-
170
- newData[nestedListKey][nextLevelKey] = this.nestRecursiveListedData(
171
- newData[nestedListKey][nextLevelKey], nestedListKey, indexes, dataToSet
172
- );
173
- } else {
174
- newData[nestedListKey][nestIndexes[0]] = dataToSet;
175
- }
176
-
177
- return newData;
178
- }
179
-
180
- static readonly removeCirculation = this.resolveCirculation;
181
- /**
182
- * THIS STILL NOT WORKING AS IT SHOULD
183
- *
184
- * recursive function that returns mutated data structure,
185
- * with locations at which circular references are found
186
- */
187
- static resolveCirculation<T>(
188
- data: T,
189
- location: string[] = [ ('ROOT;' + data?.constructor?.name) ],
190
- objs: any[] = [],
191
- /* arrs: any[] = [] */
192
- ): any {
193
- if (!data || typeof data !== 'object') {
194
- return data;
195
- } else if (objs.includes(data)) {
196
- return 'CIRCULATION:' + location.join('.');
197
- }
198
-
199
- let newData: any;
200
-
201
- if (Array.isArray(data)) {
202
- newData = [];
203
- } else {
204
- newData = {};
205
- }
206
-
207
- // using the utility that Object.keys will return array keys if the data is an array
208
- Object.keys(data).forEach((key: string): void => {
209
- newData[key] = this.resolveCirculation(
210
- data[key as keyof typeof data],
211
- [ ...location, key ],
212
- [ ...objs, data ]
213
- );
214
- });
215
-
216
- return newData;
217
- }
218
-
219
-
220
- /**
221
- * looks for circular references in object
222
- * returns duplicated object's all location paths and the object itself
223
- *
224
- * {
225
- * object: any,
226
- * pathsOfAllDuplications: string[],
227
- * }[]
228
- *
229
- * paths are in a single string, separated by '.'
230
- */
231
- static findCirculations(
232
- data: any,
233
- location: string[] = [ ('ROOT;' + data?.constructor?.name) ],
234
- objs: any[] = [],
235
- duplications: { object: any, pathsOfAllDuplications: string[] }[] = []
236
- ): { object: any, pathsOfAllDuplications: string[] }[] {
237
- if (!data || typeof data !== 'object') {
238
- return duplications;
239
- } else if (objs.includes(data)) {
240
- duplications.push({
241
- object: data,
242
- pathsOfAllDuplications: location,
243
- });
244
- }
245
-
246
- Object.keys(data).forEach((key: string): void => {
247
- this.findCirculations(
248
- data[key],
249
- [ ...location, key ],
250
- [ ...objs, data ],
251
- duplications
252
- );
253
- });
254
-
255
- return duplications;
256
- }
257
-
258
- /**
259
- * removes all undefined (will keep all null, false, 0, '', NaN etc.)
260
- *
261
- * (not supports lists in lists!)
262
- *
263
- * (this also modifies the original object in place)
264
- */
265
- static safeCleanObject<T>(obj: T): T {
266
- try {
267
- return this.cleanObject<T>(obj);
268
- } catch (error) {
269
- DyFM_Log.error('Error cleaning object:', error);
270
- return obj;
271
- }
272
- }
273
-
274
- /**
275
- * cleans the object, by removing all undefined values (but keeps all null, false, 0, '', NaN etc.)
276
- * (this is a deep clean)
277
- *
278
- * (this also modifies the original object in place)
279
- */
280
- static cleanObject<T>(obj: T, cleanings: any[] = []): T {
281
- if (!obj || typeof obj !== 'object' || cleanings.includes(obj)) {
282
- return obj;
283
- }
284
-
285
- cleanings.push(obj);
286
-
287
- Object.keys(obj).forEach((key: string): void => {
288
- if (obj[key] === undefined) {
289
- delete obj[key];
290
- } else if (Array.isArray(obj[key])) {
291
- obj[key].forEach((item: any): void => {
292
- if (typeof item === 'object') {
293
- this.cleanObject(item, cleanings);
294
- }
295
- });
296
- } else if (typeof obj[key] === 'object') {
297
- this.cleanObject(obj[key], cleanings);
298
- }
299
- });
300
-
301
- return obj;
302
- }
303
-
304
- /**
305
- * merges two objects, if the target object is not an object, it will be replaced by the source object
306
- * it will iterate through the source object
307
- * and will set the values to the target object
308
- * (like a patch, with deep merge)
309
- *
310
- * (this also modifies the original target object in place)
311
- */
312
- static mergeObjects<T>(target: T, source: T): T {
313
- if (typeof source === 'object') {
314
- target ??= {} as T;
315
-
316
- for (const key in source) {
317
- if (source[key] instanceof Object) {
318
- target[key] = this.mergeObjects(target[key], source[key]);
319
- } else if (Array.isArray(source[key])) {
320
- target[key] ??= [] as T[Extract<keyof T, string>];
321
- source[key].forEach(item => {
322
- if (
323
- !(target[key] as Array<any>).includes(item) &&
324
- !((target[key] as Array<any>).some(targetItem => this.sameObjects(item, targetItem)))
325
- ) {
326
- (target[key] as Array<any>).push(item);
327
- }
328
- });
329
- } else {
330
- target[key] = source[key];
331
- }
332
- }
333
- }
334
-
335
- return target;
336
- }
337
-
338
- /**
339
- * cleans the source object and merges it to the target object
340
- *
341
- * (this also modifies the original objects in place! (source AND target))
342
- */
343
- static patchObject<T>(target: T, source: T): T {
344
- this.cleanObject<T>(source);
345
- return this.mergeObjects<T>(target, source);
346
- }
347
-
348
- /**
349
- * parses the JSON list, if it fails, it returns the answer as a single item in an array
350
- *
351
- * (uses {@link DyFM_safeParseJSON})
352
- */
353
- static safeParseList<T extends Array<any>>(
354
- textedJSON: string,
355
- disableErrorLog?: boolean
356
- ): T {
357
- const parsed = this.safeParseJSON<T>(textedJSON, true);
358
-
359
- if (Array.isArray(parsed)) {
360
- return parsed;
361
- } else if (typeof parsed === 'object') {
362
- if (!disableErrorLog) {
363
- DyFM_Log.warn(
364
- 'DyFM_Object.safeParseList result is an object, returning its values',
365
- {
366
- parsed: parsed,
367
- }
368
- );
369
- }
370
-
371
- return Object.values(parsed) as T;
372
- } else {
373
-
374
- if (!disableErrorLog) {
375
- DyFM_Log.warn(
376
- 'DyFM_Object.safeParseList result is not an array or object, returning it as a single item',
377
- {
378
- parsed: parsed,
379
- }
380
- );
381
- }
382
-
383
- return [ parsed ] as string[] as T;
384
- }
385
- }
386
-
387
- /**
388
- * parses the JSON, if it fails, it returns { unparsableResult: textedJSON }
389
- *
390
- * (uses {@link DyFM_failableSafeParseJSON})
391
- */
392
- static safeParseJSON<T = any>(
393
- textedJSON: string,
394
- disableErrorLog?: boolean
395
- ): T | DyFM_Object_ParseResult {
396
- try {
397
- return this.failableSafeParseJSON(textedJSON);
398
- } catch (error) {
399
- if (!disableErrorLog) {
400
- DyFM_Log.error(
401
- 'Unable to parse JSON answer:',
402
- {
403
- unparsedJSON: textedJSON,
404
- error: error,
405
- }
406
- );
407
- }
408
-
409
- return { unparsableResult: textedJSON };
410
- }
411
- }
412
-
413
- /**
414
- * parses the JSON, if it fails, it throws an error
415
- * (also will extract the JSON from "```json ... ```" wrapper)
416
- * Uses enhanced error reporting with line context
417
- */
418
- static failableSafeParseJSON_old<T = any>(textedJSON: string): T {
419
- if (!textedJSON) {
420
- throw new Error(`No content provided to JSON parse ("${textedJSON}")`);
421
- }
422
-
423
- const match = textedJSON.match(/```json(.*)```/s);
424
- // TODO; ez nem lesz az igazi, mert kiszedi a tartalmakból is a sortöréseket!!! (ugyan ez pár sorral lejjebb)
425
- const cleanedTextedJSON = textedJSON.replaceAll('\n', '');
426
-
427
- if (match) {
428
- return DyFM_JsonErrorHelper.parseJsonWithEnhancedError(match[1].replaceAll('\n', ''));
429
- } else {
430
- return DyFM_JsonErrorHelper.parseJsonWithEnhancedError(
431
- cleanedTextedJSON.replaceAll('```json', '').replaceAll('```', '')
432
- );
433
- }
434
- }
435
-
436
-
437
-
438
- /**
439
- * parses the JSON, if it fails, it throws an error
440
- * (also will extract the JSON from "```json ... ```" wrapper)
441
- * Uses enhanced error reporting with line context
442
- */
443
- static failableSafeParseJSON<T = any>(textedJSON: string): T {
444
- if (!textedJSON) {
445
- throw new Error(`No content provided to JSON parse ("${textedJSON}")`);
446
- }
447
-
448
- if (textedJSON.includes('```json')) {
449
- // Extract content from code block, preserving newlines for error context
450
- /* const extractedJson = match[1].trim(); */
451
- const extractedJson = DyFM_String.multiBracketSplitDetailed(
452
- textedJSON,
453
- [
454
- { opening: '```json', closing: '```' },
455
- { opening: '{', closing: '}' },
456
- { opening: '[', closing: ']' },
457
- ],
458
- 1,
459
- )
460
-
461
- // Check if we have extracted content and handle undefined cases
462
- if (extractedJson.length > 1 && extractedJson[1] && extractedJson[1].brackets?.opening === '```json') {
463
- return DyFM_JsonErrorHelper.parseJsonWithEnhancedError(extractedJson[1].content);
464
- } else if (extractedJson.length > 0 && extractedJson[0]) {
465
- return DyFM_JsonErrorHelper.parseJsonWithEnhancedError(extractedJson[0].content);
466
- } else {
467
- // Fallback if extraction fails - use original text minus markdown wrapper
468
- const cleanedText = textedJSON.replace(/```json\s*/, '').replace(/\s*```$/, '').trim();
469
- return DyFM_JsonErrorHelper.parseJsonWithEnhancedError(cleanedText);
470
- }
471
- } else {
472
- return DyFM_JsonErrorHelper.parseJsonWithEnhancedError(textedJSON.trim());
473
- }
474
- }
475
-
476
-
477
- /**
478
- * Clone an object
479
- * @param object - The object to clone
480
- * @returns The cloned object
481
- */
482
- static clone<T>(object: T): T {
483
- try {
484
- return object ? JSON.parse(JSON.stringify(object)) as T : object;
485
- } catch (error) {
486
- DyFM_Log.error(
487
- 'clone()' + this.defaultErrorMsg,
488
- error
489
- );
490
-
491
- throw error;
492
- }
493
- }
494
- static readonly copy: typeof this.clone = this.clone;
495
-
496
- /**
497
- * Surface clone an object
498
- * @param object - The object to surface clone
499
- * @returns The surface cloned object
500
- */
501
- static surfaceClone<T extends Record<string, any>>(object: T): T {
502
- try {
503
- const result: Record<string, any> = {};
504
-
505
- Object.keys(object).forEach((key: string): void => {
506
- result[key] = object[key];
507
- });
508
-
509
- return result as T;
510
- } catch (error) {
511
- DyFM_Log.error(
512
- 'surfaceClone()' + this.defaultErrorMsg,
513
- error
514
- );
515
-
516
- throw error;
517
- }
518
- }
519
- static readonly surfaceCopy: typeof this.surfaceClone = this.surfaceClone;
520
-
521
- /**
522
- * Deep clone an object
523
- * @param object - The object to deep clone
524
- * @returns The deep cloned object
525
- */
526
- static deepClone<T extends Record<string, any>>(object: T): T {
527
- try {
528
- const result: Record<string, any> = {};
529
-
530
- if (!object) {
531
- return result as T;
532
- }
533
-
534
- Object.keys(object).forEach((key: string): void => {
535
- if (typeof object[key] === 'object') {
536
- result[key] = this.deepClone(object[key]);
537
- } else if (Array.isArray(object[key])) {
538
- result[key] = object[key].map((item: any): any => this.deepClone(item));
539
- } else {
540
- result[key] = object[key];
541
- }
542
- });
543
-
544
- return result as T;
545
- } catch (error) {
546
- DyFM_Log.error(
547
- 'deepClone()' + this.defaultErrorMsg,
548
- error
549
- );
550
-
551
- throw error;
552
- }
553
- }
554
-
555
- /**
556
- * A simple object comparison function that uses JSON.stringify() to compare objects.
557
- *
558
- * We experienced that sameObjects() function is not working properly for cases when
559
- * deleting a key from the objects (to prevent strict results).
560
- * So, we created orderedSameObject() function to prevent that issue.
561
- * But be aware that, that function is not as fast as sameObjects() function.
562
- */
563
- static sameObjects<T>(objA: T, objB: T): boolean {
564
- try {
565
- return JSON.stringify(objA) === JSON.stringify(objB);
566
- } catch (error) {
567
- DyFM_Log.error(
568
- 'sameObjects()' + this.defaultErrorMsg,
569
- error
570
- );
571
-
572
- throw error;
573
- }
574
- }
575
-
576
- /**
577
- * We experienced that sameObjects() function is not working properly for cases when
578
- * deleting a key from the objects (to prevent strict results).
579
- *
580
- * This function is created to prevent that issue.
581
- * But be aware that this function is not as fast as sameObjects() function.
582
- */
583
- static orderedSameObject<T>(objA: T, objB: T): boolean {
584
- try {
585
- if (
586
- typeof objA !== 'object' ||
587
- typeof objB !== 'object' ||
588
- Array.isArray(objA) ||
589
- Array.isArray(objB) ||
590
- objA === null ||
591
- objB === null ||
592
- objA === undefined ||
593
- objB === undefined
594
- ) {
595
- return JSON.stringify(objA) === JSON.stringify(objB);
596
- }
597
-
598
- const keysA = Object.keys(objA);
599
- const keysB = Object.keys(objB);
600
-
601
- if (keysA.length !== keysB.length) {
602
- return false;
603
- }
604
-
605
- keysA.sort();
606
- keysB.sort();
607
-
608
- for (let i = 0; i < keysA.length; i++) {
609
- if (JSON.stringify(keysA[i]) !== JSON.stringify(keysB[i])) {
610
- return false;
611
- }
612
- }
613
-
614
- return true;
615
- } catch (error) {
616
- /* try {
617
- return DyFM_Object.orderedSameObject2(objA, objB);
618
- } catch (error) { */
619
- DyFM_Log.error(
620
- 'orderedSameObject()' + this.defaultErrorMsg,
621
- error
622
- );
623
-
624
- throw error;
625
- /* } */
626
- }
627
- }
628
-
629
- /**
630
- * We experienced that sameObjects() function is not working properly for cases when
631
- * deleting a key from the objects (to prevent strict results).
632
- *
633
- * This function is created to prevent that issue.
634
- * But be aware that this function is not as fast as sameObjects() function.
635
- */
636
- static orderedSameObject2<T>(objA: T, objB: T): boolean {
637
- try {
638
- console.log('using orderedSameObject2');
639
-
640
- if (
641
- typeof objA !== 'object' ||
642
- typeof objB !== 'object' ||
643
- Array.isArray(objA) ||
644
- Array.isArray(objB) ||
645
- objA === null ||
646
- objB === null ||
647
- objA === undefined ||
648
- objB === undefined
649
- ) {
650
- return JSON.stringify(objA) === JSON.stringify(objB);
651
- }
652
-
653
- return JSON.stringify(
654
- objA,
655
- Object.keys(objA).sort()
656
- ) === JSON.stringify(
657
- objB,
658
- Object.keys(objB).sort()
659
- );
660
- } catch (error) {
661
- DyFM_Log.error(
662
- 'sameObjects()' + this.defaultErrorMsg,
663
- error
664
- );
665
-
666
- throw error;
667
- }
668
- }
669
-
670
- /**
671
- * compares the surface of two objects
672
- * @param objA
673
- * @param objB
674
- * @returns
675
- */
676
- static sameObjectSurface<T>(objA: T, objB: T): boolean {
677
- let result = true;
678
-
679
- for (const key in objA) {
680
- if (objA[key] !== objB[key]) {
681
- result = false;
682
- break;
683
- }
684
- }
685
-
686
- return result;
687
- }
688
-
689
- /**
690
- * sets values if its existing on To, even if its null (but if undefined)
691
- * @param setOn
692
- * @param setTo
693
- */
694
- static setExistingValuesOnly(setOn: any, setTo: any): void {
695
- for (const key in setTo) {
696
- if (setTo[key] != undefined) {
697
- setOn[key] = setTo[key];
698
- }
699
- }
700
- }
701
-
702
- /**
703
- * converts a JSONList to an array
704
- * @param JSONList
705
- * @returns
706
- */
707
- static JSONListify<T>(JSONList: any): T[] {
708
- const result: T[] = [];
709
-
710
- for (let i = 0; JSONList[i]; i++) {
711
- result.push(JSONList[i]);
712
- }
713
-
714
- return result;
715
- }
716
-
717
- static cleanAssign<T>(target: T, source: T): T {
718
- source = this.cleanObject<T>(source);
719
- return Object.assign<T, T>(target, source);
720
- }
721
-
722
- static hardParseJSON<T>(input: string): T | string {
723
- try {
724
- return JSON.parse(input);
725
- } catch (error) {
726
- try {
727
- return this.failableSafeParseJSON(input);
728
- } catch (error) {
729
- const result: T | DyFM_Object_ParseResult = this.safeParseJSON(input);
730
-
731
- if ((result as DyFM_Object_ParseResult).unparsableResult) {
732
- return (result as DyFM_Object_ParseResult).unparsableResult;
733
- }
734
- return result as T;
735
- }
736
- }
737
- }
738
-
739
- }
1
+
2
+ import { DyFM_Log } from './log.util';
3
+ import { DyFM_JsonErrorHelper } from './json-error-helper.util';
4
+ import { DyFM_String } from './string.util';
5
+
6
+ export interface DyFM_Object_ParseResult {
7
+ unparsableResult: string;
8
+ }
9
+
10
+ export class DyFM_Object {
11
+
12
+ static readonly defaultErrorMsg =
13
+ ' failed. ' +
14
+ '\nThis might be happening because the object you trying to clone, ' +
15
+ 'contains object hooks for its own objects, therefore its creating an object loop. ' +
16
+ 'See further information in the detailed error:\n\n';
17
+
18
+ /**
19
+ * returns remapped object list by path list
20
+ * @param objList object list to map
21
+ * @param paths string list of path etc.:
22
+ * ```ts
23
+ * [ [ 'first', 'sub', 'label' ], [ 'first', 'dif', 'name' ] ]
24
+ * ```
25
+ * will be...
26
+ * from
27
+ * ```ts
28
+ * {
29
+ * first: {
30
+ * sub: {
31
+ * label: 'vlmi'
32
+ * },
33
+ * dif: {
34
+ * name: 'asd'
35
+ * }
36
+ * }
37
+ * }[]
38
+ * ```
39
+ * to
40
+ * ```
41
+ * { label: 'vlmi', name: 'asd' }[]
42
+ * ```
43
+ * @returns remapped object list (the final obj will use the deepest keys)
44
+ */
45
+ static mapObjList(objList: object[], paths: string[][]): object[] {
46
+ let newObjList: object[] = [ ...objList ];
47
+
48
+ newObjList = newObjList.map((obj): any => {
49
+ const newObj: any = {};
50
+
51
+ paths.forEach((path: string[]): void => {
52
+ newObj[path[path.length - 1]] = this.getNestedData(obj, path);
53
+ });
54
+
55
+ return newObj;
56
+ });
57
+
58
+ return newObjList;
59
+ }
60
+
61
+ /**
62
+ * returns nested value from object
63
+ * @param parentObj data source object
64
+ * @param nestedDataKeys path of value as string list
65
+ * etc.: ['nestLvl1', 'nestLvl2', 'nestLvl3'] as parentObj.nestLvl1.nestLvl2.nestLvl3
66
+ * @returns data from object by path
67
+ */
68
+ static getNestedData(parentObj: object, nestedDataKeys: string[]): any {
69
+ let newData: any = this.clone(parentObj); // {...parentObj};
70
+
71
+ nestedDataKeys.forEach((dk: string): void => {
72
+ if (newData) {
73
+ newData = newData[dk];
74
+ }
75
+ });
76
+
77
+ return newData;
78
+ }
79
+
80
+ /**
81
+ * recursive function that nests data
82
+ * @param newData the object that that is needed to be updated
83
+ * @param nestKeys the path where the data should be updated
84
+ * @param dataToSet the actual value that will be setted
85
+ * @returns modified data
86
+ */
87
+ static nestData(parentObj: object, nestKeys: string[], dataToSet: any): object {
88
+ const newData: any = this.clone(parentObj); // {...parentObj};
89
+
90
+ if (nestKeys.length > 1) {
91
+ const keys: string[] = [ ...nestKeys ];
92
+ const nextNestKey: string = keys.shift() as string;
93
+
94
+ newData[nextNestKey] = this.nestData(newData[nextNestKey], keys, dataToSet);
95
+ } else {
96
+ newData[nestKeys[0]] = dataToSet;
97
+ }
98
+
99
+ return newData;
100
+ }
101
+
102
+ /**
103
+ * recursive function that adds to nested data
104
+ * @param newData the object that that is needed to be updated
105
+ * @param nestKeys the path where the data should be updated
106
+ * @param dataToAdd the actual value that will be setted
107
+ * @returns modified data
108
+ */
109
+ static addToNestedData(parentObj: object, nestKeys: string[], dataToAdd: any): object {
110
+ const newData: any = this.clone(parentObj); // {...parentObj};
111
+
112
+ if (nestKeys.length > 1) {
113
+ const keys: string[] = [ ...nestKeys ];
114
+ const nextNestKey: string = keys.shift() as string;
115
+
116
+ newData[nextNestKey] = this.addToNestedData(newData[nextNestKey], keys, dataToAdd);
117
+ } else {
118
+ newData[nestKeys[0]] += dataToAdd;
119
+ }
120
+
121
+ return newData;
122
+ }
123
+
124
+ /**
125
+ * recursive function that pushes to nested data
126
+ * @param newData the object that that is needed to be updated
127
+ * @param nestKeys the path where the data should be updated
128
+ * @param dataToPush the actual value that will be setted
129
+ * @returns modified data
130
+ */
131
+ static pushToNestedData(parentObj: object, nestKeys: string[], dataToPush: any): object {
132
+ const newData: any = this.clone(parentObj); // {...parentObj};
133
+
134
+ if (nestKeys.length > 1) {
135
+ const keys: string[] = [ ...nestKeys ];
136
+ const nextNestKey: string = keys.shift() as string;
137
+
138
+ newData[nextNestKey] = this.pushToNestedData(newData[nextNestKey], keys, dataToPush);
139
+ } else {
140
+ if (Array.isArray(newData[nestKeys[0]])) {
141
+ newData[nestKeys[0]].push(dataToPush);
142
+ } else {
143
+ newData[nestKeys[0]] = [ dataToPush ];
144
+ }
145
+ }
146
+
147
+ return newData;
148
+ }
149
+
150
+ /**
151
+ * recursive function that nests data on recursive data structure etc.: xData: { ..., 'nestedListKey': xData[] }
152
+ * @param newData the object that that is needed to be updated
153
+ * @param nestedListKey the location of nested dataList
154
+ * @param nestIndexes path to the subject ect.: xData.listKey[1].listKey[4].listKey[0] will be [1, 4, 0]
155
+ * @param dataToSet the actual value that will be seted on location
156
+ * @returns modified data
157
+ */
158
+ static nestRecursiveListedData<T>(
159
+ parentObj: T,
160
+ nestedListKey: string,
161
+ nestIndexes: number[],
162
+ dataToSet: any
163
+ ): T {
164
+ const newData: any = this.clone(parentObj); // parentObj; // {...parentObj};
165
+
166
+ if (nestIndexes.length > 1) {
167
+ const indexes: number[] = [ ...nestIndexes ];
168
+ const nextLevelKey: number = indexes.shift() as number;
169
+
170
+ newData[nestedListKey][nextLevelKey] = this.nestRecursiveListedData(
171
+ newData[nestedListKey][nextLevelKey], nestedListKey, indexes, dataToSet
172
+ );
173
+ } else {
174
+ newData[nestedListKey][nestIndexes[0]] = dataToSet;
175
+ }
176
+
177
+ return newData;
178
+ }
179
+
180
+ static readonly removeCirculation = this.resolveCirculation;
181
+ /**
182
+ * THIS STILL NOT WORKING AS IT SHOULD
183
+ *
184
+ * recursive function that returns mutated data structure,
185
+ * with locations at which circular references are found
186
+ */
187
+ static resolveCirculation<T>(
188
+ data: T,
189
+ location: string[] = [ ('ROOT;' + data?.constructor?.name) ],
190
+ objs: any[] = [],
191
+ /* arrs: any[] = [] */
192
+ ): any {
193
+ if (!data || typeof data !== 'object') {
194
+ return data;
195
+ } else if (objs.includes(data)) {
196
+ return 'CIRCULATION:' + location.join('.');
197
+ }
198
+
199
+ let newData: any;
200
+
201
+ if (Array.isArray(data)) {
202
+ newData = [];
203
+ } else {
204
+ newData = {};
205
+ }
206
+
207
+ // using the utility that Object.keys will return array keys if the data is an array
208
+ Object.keys(data).forEach((key: string): void => {
209
+ newData[key] = this.resolveCirculation(
210
+ data[key as keyof typeof data],
211
+ [ ...location, key ],
212
+ [ ...objs, data ]
213
+ );
214
+ });
215
+
216
+ return newData;
217
+ }
218
+
219
+
220
+ /**
221
+ * looks for circular references in object
222
+ * returns duplicated object's all location paths and the object itself
223
+ *
224
+ * {
225
+ * object: any,
226
+ * pathsOfAllDuplications: string[],
227
+ * }[]
228
+ *
229
+ * paths are in a single string, separated by '.'
230
+ */
231
+ static findCirculations(
232
+ data: any,
233
+ location: string[] = [ ('ROOT;' + data?.constructor?.name) ],
234
+ objs: any[] = [],
235
+ duplications: { object: any, pathsOfAllDuplications: string[] }[] = []
236
+ ): { object: any, pathsOfAllDuplications: string[] }[] {
237
+ if (!data || typeof data !== 'object') {
238
+ return duplications;
239
+ } else if (objs.includes(data)) {
240
+ duplications.push({
241
+ object: data,
242
+ pathsOfAllDuplications: location,
243
+ });
244
+ }
245
+
246
+ Object.keys(data).forEach((key: string): void => {
247
+ this.findCirculations(
248
+ data[key],
249
+ [ ...location, key ],
250
+ [ ...objs, data ],
251
+ duplications
252
+ );
253
+ });
254
+
255
+ return duplications;
256
+ }
257
+
258
+ /**
259
+ * removes all undefined (will keep all null, false, 0, '', NaN etc.)
260
+ *
261
+ * (not supports lists in lists!)
262
+ *
263
+ * (this also modifies the original object in place)
264
+ */
265
+ static safeCleanObject<T>(obj: T): T {
266
+ try {
267
+ return this.cleanObject<T>(obj);
268
+ } catch (error) {
269
+ DyFM_Log.error('Error cleaning object:', error);
270
+ return obj;
271
+ }
272
+ }
273
+
274
+ /**
275
+ * cleans the object, by removing all undefined values (but keeps all null, false, 0, '', NaN etc.)
276
+ * (this is a deep clean)
277
+ *
278
+ * (this also modifies the original object in place)
279
+ */
280
+ static cleanObject<T>(obj: T, cleanings: any[] = []): T {
281
+ if (!obj || typeof obj !== 'object' || cleanings.includes(obj)) {
282
+ return obj;
283
+ }
284
+
285
+ cleanings.push(obj);
286
+
287
+ Object.keys(obj).forEach((key: string): void => {
288
+ if (obj[key] === undefined) {
289
+ delete obj[key];
290
+ } else if (Array.isArray(obj[key])) {
291
+ obj[key].forEach((item: any): void => {
292
+ if (typeof item === 'object') {
293
+ this.cleanObject(item, cleanings);
294
+ }
295
+ });
296
+ } else if (typeof obj[key] === 'object') {
297
+ this.cleanObject(obj[key], cleanings);
298
+ }
299
+ });
300
+
301
+ return obj;
302
+ }
303
+
304
+ /**
305
+ * merges two objects, if the target object is not an object, it will be replaced by the source object
306
+ * it will iterate through the source object
307
+ * and will set the values to the target object
308
+ * (like a patch, with deep merge)
309
+ *
310
+ * (this also modifies the original target object in place)
311
+ */
312
+ static mergeObjects<T>(target: T, source: T): T {
313
+ if (typeof source === 'object') {
314
+ target ??= {} as T;
315
+
316
+ for (const key in source) {
317
+ if (source[key] instanceof Object) {
318
+ target[key] = this.mergeObjects(target[key], source[key]);
319
+ } else if (Array.isArray(source[key])) {
320
+ target[key] ??= [] as T[Extract<keyof T, string>];
321
+ source[key].forEach(item => {
322
+ if (
323
+ !(target[key] as Array<any>).includes(item) &&
324
+ !((target[key] as Array<any>).some(targetItem => this.sameObjects(item, targetItem)))
325
+ ) {
326
+ (target[key] as Array<any>).push(item);
327
+ }
328
+ });
329
+ } else {
330
+ target[key] = source[key];
331
+ }
332
+ }
333
+ }
334
+
335
+ return target;
336
+ }
337
+
338
+ /**
339
+ * cleans the source object and merges it to the target object
340
+ *
341
+ * (this also modifies the original objects in place! (source AND target))
342
+ */
343
+ static patchObject<T>(target: T, source: T): T {
344
+ this.cleanObject<T>(source);
345
+ return this.mergeObjects<T>(target, source);
346
+ }
347
+
348
+ /**
349
+ * parses the JSON list, if it fails, it returns the answer as a single item in an array
350
+ *
351
+ * (uses {@link DyFM_safeParseJSON})
352
+ */
353
+ static safeParseList<T extends Array<any>>(
354
+ textedJSON: string,
355
+ disableErrorLog?: boolean
356
+ ): T {
357
+ const parsed = this.safeParseJSON<T>(textedJSON, true);
358
+
359
+ if (Array.isArray(parsed)) {
360
+ return parsed;
361
+ } else if (typeof parsed === 'object') {
362
+ if (!disableErrorLog) {
363
+ DyFM_Log.warn(
364
+ 'DyFM_Object.safeParseList result is an object, returning its values',
365
+ {
366
+ parsed: parsed,
367
+ }
368
+ );
369
+ }
370
+
371
+ return Object.values(parsed) as T;
372
+ } else {
373
+
374
+ if (!disableErrorLog) {
375
+ DyFM_Log.warn(
376
+ 'DyFM_Object.safeParseList result is not an array or object, returning it as a single item',
377
+ {
378
+ parsed: parsed,
379
+ }
380
+ );
381
+ }
382
+
383
+ return [ parsed ] as string[] as T;
384
+ }
385
+ }
386
+
387
+ /**
388
+ * parses the JSON, if it fails, it returns { unparsableResult: textedJSON }
389
+ *
390
+ * (uses {@link DyFM_failableSafeParseJSON})
391
+ */
392
+ static safeParseJSON<T = any>(
393
+ textedJSON: string,
394
+ disableErrorLog?: boolean
395
+ ): T | DyFM_Object_ParseResult {
396
+ try {
397
+ return this.failableSafeParseJSON(textedJSON);
398
+ } catch (error) {
399
+ if (!disableErrorLog) {
400
+ DyFM_Log.error(
401
+ 'Unable to parse JSON answer:',
402
+ {
403
+ unparsedJSON: textedJSON,
404
+ error: error,
405
+ }
406
+ );
407
+ }
408
+
409
+ return { unparsableResult: textedJSON };
410
+ }
411
+ }
412
+
413
+ /**
414
+ * parses the JSON, if it fails, it throws an error
415
+ * (also will extract the JSON from "```json ... ```" wrapper)
416
+ * Uses enhanced error reporting with line context
417
+ */
418
+ static failableSafeParseJSON_old<T = any>(textedJSON: string): T {
419
+ if (!textedJSON) {
420
+ throw new Error(`No content provided to JSON parse ("${textedJSON}")`);
421
+ }
422
+
423
+ const match = textedJSON.match(/```json(.*)```/s);
424
+ // TODO; ez nem lesz az igazi, mert kiszedi a tartalmakból is a sortöréseket!!! (ugyan ez pár sorral lejjebb)
425
+ const cleanedTextedJSON = textedJSON.replaceAll('\n', '');
426
+
427
+ if (match) {
428
+ return DyFM_JsonErrorHelper.parseJsonWithEnhancedError(match[1].replaceAll('\n', ''));
429
+ } else {
430
+ return DyFM_JsonErrorHelper.parseJsonWithEnhancedError(
431
+ cleanedTextedJSON.replaceAll('```json', '').replaceAll('```', '')
432
+ );
433
+ }
434
+ }
435
+
436
+
437
+
438
+ /**
439
+ * parses the JSON, if it fails, it throws an error
440
+ * (also will extract the JSON from "```json ... ```" wrapper)
441
+ * Uses enhanced error reporting with line context
442
+ */
443
+ static failableSafeParseJSON<T = any>(textedJSON: string): T {
444
+ if (!textedJSON) {
445
+ throw new Error(`No content provided to JSON parse ("${textedJSON}")`);
446
+ }
447
+
448
+ if (textedJSON.includes('```json')) {
449
+ // Extract content from code block, preserving newlines for error context
450
+ /* const extractedJson = match[1].trim(); */
451
+ const extractedJson = DyFM_String.multiBracketSplitDetailed(
452
+ textedJSON,
453
+ [
454
+ { opening: '```json', closing: '```' },
455
+ { opening: '{', closing: '}' },
456
+ { opening: '[', closing: ']' },
457
+ ],
458
+ 1,
459
+ )
460
+
461
+ // Check if we have extracted content and handle undefined cases
462
+ if (extractedJson.length > 1 && extractedJson[1] && extractedJson[1].brackets?.opening === '```json') {
463
+ return DyFM_JsonErrorHelper.parseJsonWithEnhancedError(extractedJson[1].content);
464
+ } else if (extractedJson.length > 0 && extractedJson[0]) {
465
+ return DyFM_JsonErrorHelper.parseJsonWithEnhancedError(extractedJson[0].content);
466
+ } else {
467
+ // Fallback if extraction fails - use original text minus markdown wrapper
468
+ const cleanedText = textedJSON.replace(/```json\s*/, '').replace(/\s*```$/, '').trim();
469
+ return DyFM_JsonErrorHelper.parseJsonWithEnhancedError(cleanedText);
470
+ }
471
+ } else {
472
+ return DyFM_JsonErrorHelper.parseJsonWithEnhancedError(textedJSON.trim());
473
+ }
474
+ }
475
+
476
+
477
+ /**
478
+ * Clone an object
479
+ * @param object - The object to clone
480
+ * @returns The cloned object
481
+ */
482
+ static clone<T>(object: T): T {
483
+ try {
484
+ return object ? JSON.parse(JSON.stringify(object)) as T : object;
485
+ } catch (error) {
486
+ DyFM_Log.error(
487
+ 'clone()' + this.defaultErrorMsg,
488
+ error
489
+ );
490
+
491
+ throw error;
492
+ }
493
+ }
494
+ static readonly copy: typeof this.clone = this.clone;
495
+
496
+ /**
497
+ * Surface clone an object
498
+ * @param object - The object to surface clone
499
+ * @returns The surface cloned object
500
+ */
501
+ static surfaceClone<T extends Record<string, any>>(object: T): T {
502
+ try {
503
+ const result: Record<string, any> = {};
504
+
505
+ Object.keys(object).forEach((key: string): void => {
506
+ result[key] = object[key];
507
+ });
508
+
509
+ return result as T;
510
+ } catch (error) {
511
+ DyFM_Log.error(
512
+ 'surfaceClone()' + this.defaultErrorMsg,
513
+ error
514
+ );
515
+
516
+ throw error;
517
+ }
518
+ }
519
+ static readonly surfaceCopy: typeof this.surfaceClone = this.surfaceClone;
520
+
521
+ /**
522
+ * Deep clone an object
523
+ * @param object - The object to deep clone
524
+ * @returns The deep cloned object
525
+ */
526
+ static deepClone<T extends Record<string, any>>(object: T): T {
527
+ try {
528
+ const result: Record<string, any> = {};
529
+
530
+ if (!object) {
531
+ return result as T;
532
+ }
533
+
534
+ Object.keys(object).forEach((key: string): void => {
535
+ if (typeof object[key] === 'object') {
536
+ result[key] = this.deepClone(object[key]);
537
+ } else if (Array.isArray(object[key])) {
538
+ result[key] = object[key].map((item: any): any => this.deepClone(item));
539
+ } else {
540
+ result[key] = object[key];
541
+ }
542
+ });
543
+
544
+ return result as T;
545
+ } catch (error) {
546
+ DyFM_Log.error(
547
+ 'deepClone()' + this.defaultErrorMsg,
548
+ error
549
+ );
550
+
551
+ throw error;
552
+ }
553
+ }
554
+
555
+ /**
556
+ * A simple object comparison function that uses JSON.stringify() to compare objects.
557
+ *
558
+ * We experienced that sameObjects() function is not working properly for cases when
559
+ * deleting a key from the objects (to prevent strict results).
560
+ * So, we created orderedSameObject() function to prevent that issue.
561
+ * But be aware that, that function is not as fast as sameObjects() function.
562
+ */
563
+ static sameObjects<T>(objA: T, objB: T): boolean {
564
+ try {
565
+ return JSON.stringify(objA) === JSON.stringify(objB);
566
+ } catch (error) {
567
+ DyFM_Log.error(
568
+ 'sameObjects()' + this.defaultErrorMsg,
569
+ error
570
+ );
571
+
572
+ throw error;
573
+ }
574
+ }
575
+
576
+ /**
577
+ * We experienced that sameObjects() function is not working properly for cases when
578
+ * deleting a key from the objects (to prevent strict results).
579
+ *
580
+ * This function is created to prevent that issue.
581
+ * But be aware that this function is not as fast as sameObjects() function.
582
+ */
583
+ static orderedSameObject<T>(objA: T, objB: T): boolean {
584
+ try {
585
+ if (
586
+ typeof objA !== 'object' ||
587
+ typeof objB !== 'object' ||
588
+ Array.isArray(objA) ||
589
+ Array.isArray(objB) ||
590
+ objA === null ||
591
+ objB === null ||
592
+ objA === undefined ||
593
+ objB === undefined
594
+ ) {
595
+ return JSON.stringify(objA) === JSON.stringify(objB);
596
+ }
597
+
598
+ const keysA = Object.keys(objA);
599
+ const keysB = Object.keys(objB);
600
+
601
+ if (keysA.length !== keysB.length) {
602
+ return false;
603
+ }
604
+
605
+ keysA.sort();
606
+ keysB.sort();
607
+
608
+ for (let i = 0; i < keysA.length; i++) {
609
+ if (JSON.stringify(keysA[i]) !== JSON.stringify(keysB[i])) {
610
+ return false;
611
+ }
612
+ }
613
+
614
+ return true;
615
+ } catch (error) {
616
+ /* try {
617
+ return DyFM_Object.orderedSameObject2(objA, objB);
618
+ } catch (error) { */
619
+ DyFM_Log.error(
620
+ 'orderedSameObject()' + this.defaultErrorMsg,
621
+ error
622
+ );
623
+
624
+ throw error;
625
+ /* } */
626
+ }
627
+ }
628
+
629
+ /**
630
+ * We experienced that sameObjects() function is not working properly for cases when
631
+ * deleting a key from the objects (to prevent strict results).
632
+ *
633
+ * This function is created to prevent that issue.
634
+ * But be aware that this function is not as fast as sameObjects() function.
635
+ */
636
+ static orderedSameObject2<T>(objA: T, objB: T): boolean {
637
+ try {
638
+ console.log('using orderedSameObject2');
639
+
640
+ if (
641
+ typeof objA !== 'object' ||
642
+ typeof objB !== 'object' ||
643
+ Array.isArray(objA) ||
644
+ Array.isArray(objB) ||
645
+ objA === null ||
646
+ objB === null ||
647
+ objA === undefined ||
648
+ objB === undefined
649
+ ) {
650
+ return JSON.stringify(objA) === JSON.stringify(objB);
651
+ }
652
+
653
+ return JSON.stringify(
654
+ objA,
655
+ Object.keys(objA).sort()
656
+ ) === JSON.stringify(
657
+ objB,
658
+ Object.keys(objB).sort()
659
+ );
660
+ } catch (error) {
661
+ DyFM_Log.error(
662
+ 'sameObjects()' + this.defaultErrorMsg,
663
+ error
664
+ );
665
+
666
+ throw error;
667
+ }
668
+ }
669
+
670
+ /**
671
+ * compares the surface of two objects
672
+ * @param objA
673
+ * @param objB
674
+ * @returns
675
+ */
676
+ static sameObjectSurface<T>(objA: T, objB: T): boolean {
677
+ let result = true;
678
+
679
+ for (const key in objA) {
680
+ if (objA[key] !== objB[key]) {
681
+ result = false;
682
+ break;
683
+ }
684
+ }
685
+
686
+ return result;
687
+ }
688
+
689
+ /**
690
+ * sets values if its existing on To, even if its null (but if undefined)
691
+ * @param setOn
692
+ * @param setTo
693
+ */
694
+ static setExistingValuesOnly(setOn: any, setTo: any): void {
695
+ for (const key in setTo) {
696
+ if (setTo[key] != undefined) {
697
+ setOn[key] = setTo[key];
698
+ }
699
+ }
700
+ }
701
+
702
+ /**
703
+ * converts a JSONList to an array
704
+ * @param JSONList
705
+ * @returns
706
+ */
707
+ static JSONListify<T>(JSONList: any): T[] {
708
+ const result: T[] = [];
709
+
710
+ for (let i = 0; JSONList[i]; i++) {
711
+ result.push(JSONList[i]);
712
+ }
713
+
714
+ return result;
715
+ }
716
+
717
+ static cleanAssign<T>(target: T, source: T): T {
718
+ source = this.cleanObject<T>(source);
719
+ return Object.assign<T, T>(target, source);
720
+ }
721
+
722
+ static hardParseJSON<T>(input: string): T | string {
723
+ try {
724
+ return JSON.parse(input);
725
+ } catch (error) {
726
+ try {
727
+ return this.failableSafeParseJSON(input);
728
+ } catch (error) {
729
+ const result: T | DyFM_Object_ParseResult = this.safeParseJSON(input);
730
+
731
+ if ((result as DyFM_Object_ParseResult).unparsableResult) {
732
+ return (result as DyFM_Object_ParseResult).unparsableResult;
733
+ }
734
+ return result as T;
735
+ }
736
+ }
737
+ }
738
+
739
+ }