@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,643 +1,643 @@
1
- import { DyFM_Crypto } from './crypto.util';
2
-
3
- describe('| DyFM_Crypto extra tests', () => {
4
-
5
- describe('| TIME MANIPULATION TESTS - Cross-temporal consistency', () => {
6
- const testKey = 'time-test-key-456';
7
- const testData = {
8
- id: 123,
9
- name: 'time-test',
10
- timestamp: new Date().toISOString(),
11
- nested: { value: 'time-dependent-test' }
12
- };
13
-
14
- let originalDateNow: () => number;
15
- let originalDateConstructor: DateConstructor;
16
-
17
- beforeEach(() => {
18
- // Store original Date functions
19
- originalDateNow = Date.now;
20
- originalDateConstructor = Date;
21
- });
22
-
23
- afterEach(() => {
24
- // Restore original Date functions
25
- Date.now = originalDateNow;
26
- (global as any).Date = originalDateConstructor;
27
- });
28
-
29
- it('| should produce identical encrypted output regardless of system time', () => {
30
- const baseTime = 1609459200000; // 2021-01-01 00:00:00 UTC
31
-
32
- // Mock Date.now to return fixed time
33
- Date.now = jasmine.createSpy('Date.now').and.returnValue(baseTime);
34
-
35
- // Mock Date constructor to return fixed date
36
- (global as any).Date = jasmine.createSpy('Date').and.callFake((args: any) => {
37
- if (!args) {
38
- return new originalDateConstructor(baseTime);
39
- }
40
- return new originalDateConstructor(args);
41
- });
42
-
43
- const encrypted1 = DyFM_Crypto.encrypt(testData, testKey);
44
- const encrypted2 = DyFM_Crypto.encrypt(testData, testKey);
45
-
46
- expect(encrypted1).toEqual(encrypted2);
47
- expect(encrypted1).toBeDefined();
48
- });
49
-
50
- it('| should maintain consistency across different time zones', () => {
51
- const timeZones = [
52
- 0, // UTC
53
- -5, // EST
54
- 1, // CET
55
- 9, // JST
56
- -8, // PST
57
- 5.5 // IST
58
- ];
59
-
60
- const results: string[] = [];
61
-
62
- timeZones.forEach(offset => {
63
- const baseTime = 1609459200000 + (offset * 3600000); // Adjust for timezone
64
- Date.now = jasmine.createSpy('Date.now').and.returnValue(baseTime);
65
-
66
- const encrypted = DyFM_Crypto.encrypt(testData, testKey);
67
- results.push(encrypted);
68
- });
69
-
70
- // All results should be identical regardless of timezone
71
- const firstResult = results[0];
72
- results.forEach(result => {
73
- expect(result).toEqual(firstResult);
74
- });
75
- });
76
-
77
- it('| should handle time-based data consistently', () => {
78
- const timeBasedData = {
79
- createdAt: new Date('2023-01-01T00:00:00Z'),
80
- updatedAt: new Date('2023-12-31T23:59:59Z'),
81
- timestamp: Date.now(),
82
- timeString: new Date().toISOString()
83
- };
84
-
85
- // Test with different system times
86
- const times = [
87
- 1609459200000, // 2021-01-01
88
- 1640995200000, // 2022-01-01
89
- 1672531200000, // 2023-01-01
90
- 1704067200000 // 2024-01-01
91
- ];
92
-
93
- const results: string[] = [];
94
-
95
- times.forEach(time => {
96
- Date.now = jasmine.createSpy('Date.now').and.returnValue(time);
97
- const encrypted = DyFM_Crypto.encrypt(timeBasedData, testKey);
98
- results.push(encrypted);
99
- });
100
-
101
- // All results should be identical
102
- const firstResult = results[0];
103
- results.forEach(result => {
104
- expect(result).toEqual(firstResult);
105
- });
106
- });
107
-
108
- it('| should maintain consistency across date boundaries', () => {
109
- const boundaryTimes = [
110
- 1609459200000, // 2021-01-01 00:00:00
111
- 1609459259999, // 2021-01-01 00:00:59
112
- 1609459260000, // 2021-01-01 00:01:00
113
- 1609545600000, // 2021-01-02 00:00:00
114
- 1609632000000, // 2021-01-03 00:00:00
115
- 1640995200000, // 2022-01-01 00:00:00
116
- 1672531200000 // 2023-01-01 00:00:00
117
- ];
118
-
119
- const results: string[] = [];
120
-
121
- boundaryTimes.forEach(time => {
122
- Date.now = jasmine.createSpy('Date.now').and.returnValue(time);
123
- const encrypted = DyFM_Crypto.encrypt(testData, testKey);
124
- results.push(encrypted);
125
- });
126
-
127
- // All results should be identical
128
- const firstResult = results[0];
129
- results.forEach(result => {
130
- expect(result).toEqual(firstResult);
131
- });
132
- });
133
-
134
- it('| should handle leap year transitions consistently', () => {
135
- const leapYearTimes = [
136
- 1609459200000, // 2021-01-01 (not leap year)
137
- 1640995200000, // 2022-01-01 (not leap year)
138
- 1672531200000, // 2023-01-01 (not leap year)
139
- 1704067200000, // 2024-01-01 (leap year)
140
- 1735689600000, // 2025-01-01 (not leap year)
141
- 1735689600000 + (365 * 24 * 60 * 60 * 1000), // 2025-12-31
142
- 1735689600000 + (366 * 24 * 60 * 60 * 1000) // 2026-01-01
143
- ];
144
-
145
- const results: string[] = [];
146
-
147
- leapYearTimes.forEach(time => {
148
- Date.now = jasmine.createSpy('Date.now').and.returnValue(time);
149
- const encrypted = DyFM_Crypto.encrypt(testData, testKey);
150
- results.push(encrypted);
151
- });
152
-
153
- // All results should be identical
154
- const firstResult = results[0];
155
- results.forEach(result => {
156
- expect(result).toEqual(firstResult);
157
- });
158
- });
159
-
160
- it('| should maintain consistency across daylight saving time transitions', () => {
161
- // DST transition times (approximate)
162
- const dstTimes = [
163
- 1615708800000, // 2021-03-14 (DST start)
164
- 1615712400000, // 2021-03-14 01:00 (DST start + 1 hour)
165
- 1636243200000, // 2021-11-07 (DST end)
166
- 1636246800000, // 2021-11-07 01:00 (DST end + 1 hour)
167
- 1648339200000, // 2022-03-13 (DST start)
168
- 1648342800000, // 2022-03-13 01:00 (DST start + 1 hour)
169
- 1668816000000, // 2022-11-06 (DST end)
170
- 1668819600000 // 2022-11-06 01:00 (DST end + 1 hour)
171
- ];
172
-
173
- const results: string[] = [];
174
-
175
- dstTimes.forEach(time => {
176
- Date.now = jasmine.createSpy('Date.now').and.returnValue(time);
177
- const encrypted = DyFM_Crypto.encrypt(testData, testKey);
178
- results.push(encrypted);
179
- });
180
-
181
- // All results should be identical
182
- const firstResult = results[0];
183
- results.forEach(result => {
184
- expect(result).toEqual(firstResult);
185
- });
186
- });
187
-
188
- it('| should handle microsecond precision consistently', () => {
189
- const baseTime = 1609459200000;
190
- const microsecondOffsets = [
191
- 0,
192
- 1,
193
- 10,
194
- 100,
195
- 1000,
196
- 10000,
197
- 100000,
198
- 999999
199
- ];
200
-
201
- const results: string[] = [];
202
-
203
- microsecondOffsets.forEach(offset => {
204
- const time = baseTime + offset;
205
- Date.now = jasmine.createSpy('Date.now').and.returnValue(time);
206
- const encrypted = DyFM_Crypto.encrypt(testData, testKey);
207
- results.push(encrypted);
208
- });
209
-
210
- // All results should be identical
211
- const firstResult = results[0];
212
- results.forEach(result => {
213
- expect(result).toEqual(firstResult);
214
- });
215
- });
216
-
217
- it('| should maintain consistency across different Date object states', () => {
218
- const testDataWithDates = {
219
- date1: new Date('2023-01-01'),
220
- date2: new Date('2023-12-31'),
221
- date3: new Date(),
222
- date4: new Date(0), // Unix epoch
223
- date5: new Date(8640000000000000), // Max safe date
224
- date6: new Date(-8640000000000000) // Min safe date
225
- };
226
-
227
- const results: string[] = [];
228
-
229
- // Test with different system times
230
- const systemTimes = [1609459200000, 1640995200000, 1672531200000];
231
-
232
- systemTimes.forEach(systemTime => {
233
- Date.now = jasmine.createSpy('Date.now').and.returnValue(systemTime);
234
- const encrypted = DyFM_Crypto.encrypt(testDataWithDates, testKey);
235
- results.push(encrypted);
236
- });
237
-
238
- // All results should be identical
239
- const firstResult = results[0];
240
- results.forEach(result => {
241
- expect(result).toEqual(firstResult);
242
- });
243
- });
244
-
245
- it('| should handle time-based encryption/decryption cycles consistently', () => {
246
- const cycles = 10;
247
- const results: string[] = [];
248
-
249
- for (let i = 0; i < cycles; i++) {
250
- // Simulate different system times
251
- const time = 1609459200000 + (i * 86400000); // Add 1 day each cycle
252
- Date.now = jasmine.createSpy('Date.now').and.returnValue(time);
253
-
254
- const encrypted = DyFM_Crypto.encrypt(testData, testKey);
255
- results.push(encrypted);
256
- }
257
-
258
- // All results should be identical
259
- const firstResult = results[0];
260
- results.forEach(result => {
261
- expect(result).toEqual(firstResult);
262
- });
263
- });
264
-
265
- it('| should maintain consistency with real-world time scenarios', () => {
266
- const realWorldScenarios = [
267
- { name: 'New Year 2021', time: 1609459200000 },
268
- { name: 'Leap Day 2020', time: 1583020800000 },
269
- { name: 'DST Start 2021', time: 1615708800000 },
270
- { name: 'DST End 2021', time: 1636243200000 },
271
- { name: 'Midnight UTC', time: 1609459200000 },
272
- { name: 'Noon UTC', time: 1609459200000 + (12 * 3600000) },
273
- { name: 'End of Day', time: 1609459200000 + (23 * 3600000) + (59 * 60000) + (59 * 1000) }
274
- ];
275
-
276
- const results: string[] = [];
277
-
278
- realWorldScenarios.forEach(scenario => {
279
- Date.now = jasmine.createSpy('Date.now').and.returnValue(scenario.time);
280
- const encrypted = DyFM_Crypto.encrypt(testData, testKey);
281
- results.push(encrypted);
282
- });
283
-
284
- // All results should be identical
285
- const firstResult = results[0];
286
- results.forEach((result, index) => {
287
- expect(result).toEqual(firstResult);
288
- });
289
- });
290
- });
291
-
292
- describe('| ERROR HANDLING TESTS - Comprehensive validation', () => {
293
- const validKey = 'valid-test-key-123';
294
- const validData = { id: 1, name: 'test' };
295
-
296
- describe('| Encryption Error Cases', () => {
297
- it('| should throw descriptive error when encrypting undefined data', () => {
298
- expect(() => DyFM_Crypto.encrypt(undefined, validKey)).toThrow();
299
- });
300
-
301
- it('| should throw descriptive error when encrypting null data', () => {
302
- expect(() => DyFM_Crypto.encrypt(null, validKey)).toThrow();
303
- });
304
-
305
- it('| should throw descriptive error when encrypting empty string', () => {
306
- expect(() => DyFM_Crypto.encrypt('', validKey)).toThrow();
307
- });
308
-
309
- it('| should allow empty object for backward compatibility', () => {
310
- expect(() => DyFM_Crypto.encrypt({}, validKey)).not.toThrow();
311
- });
312
-
313
- it('| should allow empty array for backward compatibility', () => {
314
- expect(() => DyFM_Crypto.encrypt([], validKey)).not.toThrow();
315
- });
316
-
317
- it('| should throw descriptive error when key is missing', () => {
318
- expect(() => DyFM_Crypto.encrypt(validData, undefined as any)).toThrow();
319
- });
320
-
321
- it('| should throw descriptive error when key is null', () => {
322
- expect(() => DyFM_Crypto.encrypt(validData, null as any)).toThrow();
323
- });
324
-
325
- it('| should throw descriptive error when key is not a string', () => {
326
- expect(() => DyFM_Crypto.encrypt(validData, 123 as any)).toThrow();
327
- });
328
-
329
- it('| should throw descriptive error when key is empty string', () => {
330
- expect(() => DyFM_Crypto.encrypt(validData, '')).toThrow();
331
- });
332
-
333
- it('| should throw descriptive error when key is only whitespace', () => {
334
- expect(() => DyFM_Crypto.encrypt(validData, ' ')).toThrow();
335
- });
336
-
337
- it('| should warn about short keys but still work', () => {
338
- // This test just ensures encryption works with short keys
339
- // Note: Warning is shown in console but spy might not catch it in test environment
340
- expect(() => DyFM_Crypto.encrypt(validData, 'short')).not.toThrow();
341
- });
342
- });
343
-
344
- describe('| Decryption Error Cases', () => {
345
- it('| should throw descriptive error when decrypting undefined data', () => {
346
- expect(() => DyFM_Crypto.decrypt(undefined as any, validKey)).toThrow();
347
- });
348
-
349
- it('| should throw descriptive error when decrypting null data', () => {
350
- expect(() => DyFM_Crypto.decrypt(null as any, validKey)).toThrow();
351
- });
352
-
353
- it('| should throw descriptive error when decrypting non-string data', () => {
354
- expect(() => DyFM_Crypto.decrypt(123 as any, validKey)).toThrow();
355
- });
356
-
357
- it('| should throw descriptive error when decrypting empty string', () => {
358
- expect(() => DyFM_Crypto.decrypt('', validKey)).toThrow();
359
- });
360
-
361
- it('| should throw descriptive error when decrypting too short data', () => {
362
- expect(() => DyFM_Crypto.decrypt('short', validKey)).toThrow();
363
- });
364
-
365
- it('| should throw descriptive error when decrypting invalid format', () => {
366
- expect(() => DyFM_Crypto.decrypt('invalid!@#format', validKey)).toThrow();
367
- });
368
-
369
- it('| should throw descriptive error when key is missing for decryption', () => {
370
- const encrypted = DyFM_Crypto.encrypt(validData, validKey);
371
- expect(() => DyFM_Crypto.decrypt(encrypted, undefined as any)).toThrow();
372
- });
373
-
374
- it('| should throw descriptive error when key is wrong type for decryption', () => {
375
- const encrypted = DyFM_Crypto.encrypt(validData, validKey);
376
- expect(() => DyFM_Crypto.decrypt(encrypted, 123 as any)).toThrow();
377
- });
378
-
379
- it('| should throw descriptive error when key is empty for decryption', () => {
380
- const encrypted = DyFM_Crypto.encrypt(validData, validKey);
381
- expect(() => DyFM_Crypto.decrypt(encrypted, '')).toThrow();
382
- });
383
-
384
- it('| should handle decryption with proper key validation', () => {
385
- // Test that decryption works with valid key
386
- const encrypted = DyFM_Crypto.encrypt(validData, validKey);
387
- expect(() => DyFM_Crypto.decrypt(encrypted, validKey)).not.toThrow();
388
- });
389
- });
390
-
391
- describe('| Decryption Failure Scenarios', () => {
392
- it('| should throw descriptive error when decrypting with wrong key', () => {
393
- const encrypted = DyFM_Crypto.encrypt(validData, validKey);
394
- expect(() => DyFM_Crypto.decrypt(encrypted, 'wrong-key-123')).toThrow();
395
- });
396
-
397
- it('| should throw descriptive error when decrypting corrupted data', () => {
398
- const encrypted = DyFM_Crypto.encrypt(validData, validKey);
399
- const corrupted = encrypted.substring(0, encrypted.length - 10); // Remove last 10 characters
400
- expect(() => DyFM_Crypto.decrypt(corrupted, validKey)).toThrow();
401
- });
402
-
403
- it('| should throw descriptive error when decrypting invalid base64', () => {
404
- expect(() => DyFM_Crypto.decrypt('invalid-base64!@#', validKey)).toThrow();
405
- });
406
-
407
- it('| should throw descriptive error when decrypting completely wrong data', () => {
408
- expect(() => DyFM_Crypto.decrypt('this-is-not-encrypted-data', validKey)).toThrow();
409
- });
410
- });
411
-
412
- describe('| Edge Case Validations', () => {
413
- it('| should allow valid data with minimum key length', () => {
414
- const shortKey = '12345678'; // 8 characters minimum
415
- const encrypted = DyFM_Crypto.encrypt(validData, shortKey);
416
- const decrypted = DyFM_Crypto.decrypt(encrypted, shortKey);
417
- expect(decrypted).toEqual(validData);
418
- });
419
-
420
- it('| should allow valid data with whitespace in key', () => {
421
- const keyWithSpaces = ' valid-key-123 ';
422
- const encrypted = DyFM_Crypto.encrypt(validData, keyWithSpaces);
423
- const decrypted = DyFM_Crypto.decrypt(encrypted, keyWithSpaces);
424
- expect(decrypted).toEqual(validData);
425
- });
426
-
427
- it('| should handle special characters in data', () => {
428
- const specialData = {
429
- special: '!@#$%^&*()_+-=[]{}|;:,.<>?',
430
- unicode: '世界你好',
431
- emoji: '🚀💻🔐'
432
- };
433
- const encrypted = DyFM_Crypto.encrypt(specialData, validKey);
434
- const decrypted = DyFM_Crypto.decrypt(encrypted, validKey);
435
- expect(decrypted).toEqual(specialData);
436
- });
437
-
438
- it('| should handle very long data', () => {
439
- const longData = {
440
- text: 'A'.repeat(10000),
441
- array: Array(1000).fill(0).map((_, i) => i),
442
- nested: {
443
- level1: { level2: { level3: { data: 'deep nested data' } } }
444
- }
445
- };
446
- const encrypted = DyFM_Crypto.encrypt(longData, validKey);
447
- const decrypted = DyFM_Crypto.decrypt(encrypted, validKey);
448
- expect(decrypted).toEqual(longData);
449
- });
450
- });
451
-
452
- describe('| Error Code Validation', () => {
453
- it('| should have specific error codes for different failure types', () => {
454
- try {
455
- DyFM_Crypto.encrypt(undefined, validKey);
456
- fail('Should have thrown an error');
457
- } catch (error: any) {
458
- expect(error._errorCode).toBe('DyFM-CRY-DATA-UNDEFINED');
459
- }
460
-
461
- try {
462
- DyFM_Crypto.encrypt(validData, '');
463
- fail('Should have thrown an error');
464
- } catch (error: any) {
465
- expect(error._errorCode).toBe('DyFM-CRY-KEY-MISSING');
466
- }
467
-
468
- try {
469
- DyFM_Crypto.decrypt('', validKey);
470
- fail('Should have thrown an error');
471
- } catch (error: any) {
472
- expect(error._errorCode).toBe('DyFM-CRY-ENCRYPTED-EMPTY');
473
- }
474
- });
475
- });
476
- });
477
-
478
- describe('| specific byte count and corruption scenarios', () => {
479
- const validKey = 'valid-test-key-123';
480
- const validData = { id: 1, name: 'test' };
481
-
482
- it('| should throw DyFM-CRY-DATA-CORRUPTED error with correct message for 18 bytes', () => {
483
- // Create a base64 string that parses to exactly 18 bytes
484
- // 18 bytes = 24 base64 characters (18 * 4/3 = 24)
485
- const exactly18Bytes = 'ABCDEFGHIJKLMNOPQRSTUVWX'; // 24 chars = 18 bytes
486
-
487
- try {
488
- DyFM_Crypto.decrypt(exactly18Bytes, validKey);
489
- fail('Should have thrown an error');
490
- } catch (error: any) {
491
- expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
492
- // Pre-parse validation catches this, so check for base64 character count message
493
- expect(error._message || error.message || '').toContain('too short');
494
- expect(error._message || error.message || '').toContain('characters');
495
- }
496
- });
497
-
498
- it('| should throw error for 16 bytes (too short)', () => {
499
- // 16 bytes = ~22 base64 characters (but we need exact 16 bytes = 21.33 chars, round to 22)
500
- const exactly16Bytes = 'ABCDEFGHIJKLMNOPQRSTUV'; // 22 chars ≈ 16 bytes
501
-
502
- try {
503
- DyFM_Crypto.decrypt(exactly16Bytes, validKey);
504
- fail('Should have thrown an error');
505
- } catch (error: any) {
506
- expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
507
- }
508
- });
509
-
510
- it('| should throw error for 24 bytes (too short)', () => {
511
- // 24 bytes = 32 base64 characters
512
- const exactly24Bytes = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCD'; // 32 chars = 24 bytes
513
-
514
- try {
515
- DyFM_Crypto.decrypt(exactly24Bytes, validKey);
516
- fail('Should have thrown an error');
517
- } catch (error: any) {
518
- expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
519
- // Pre-parse validation catches this, so check for base64 character count message
520
- expect(error._message || error.message || '').toContain('too short');
521
- expect(error._message || error.message || '').toContain('characters');
522
- }
523
- });
524
-
525
- it('| should throw error for 32 bytes (too short)', () => {
526
- // 32 bytes = 43 base64 characters (32 * 4/3 = 42.67, round to 43)
527
- const exactly32Bytes = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP'; // 43 chars ≈ 32 bytes
528
-
529
- try {
530
- DyFM_Crypto.decrypt(exactly32Bytes, validKey);
531
- fail('Should have thrown an error');
532
- } catch (error: any) {
533
- expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
534
- // Pre-parse validation catches this, so check for base64 character count message
535
- expect(error._message || error.message || '').toContain('too short');
536
- }
537
- });
538
-
539
- it('| should throw error for 40 bytes (too short)', () => {
540
- // 40 bytes = 54 base64 characters (40 * 4/3 = 53.33, round to 54)
541
- const exactly40Bytes = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB'; // 54 chars ≈ 40 bytes
542
-
543
- try {
544
- DyFM_Crypto.decrypt(exactly40Bytes, validKey);
545
- fail('Should have thrown an error');
546
- } catch (error: any) {
547
- expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
548
- // Pre-parse validation catches this, so check for base64 character count message
549
- expect(error._message || error.message || '').toContain('too short');
550
- }
551
- });
552
-
553
- it('| should validate error message includes correct expected byte count (48)', () => {
554
- const encrypted = DyFM_Crypto.encrypt(validData, validKey);
555
- // Truncate to make it less than 48 bytes
556
- const truncated = encrypted.substring(0, 20); // Very short
557
-
558
- try {
559
- DyFM_Crypto.decrypt(truncated, validKey);
560
- fail('Should have thrown an error');
561
- } catch (error: any) {
562
- expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
563
- // Pre-parse validation catches this, so check for base64 character count or byte count message
564
- const errorMsg = error._message || error.message || '';
565
- expect(errorMsg).toMatch(/Expected at least|too short|48|bytes|characters/);
566
- }
567
- });
568
-
569
- it('| should validate error message includes correct received byte count', () => {
570
- // Create a base64 string that parses to exactly 18 bytes
571
- const exactly18Bytes = 'ABCDEFGHIJKLMNOPQRSTUVWX'; // 24 chars = 18 bytes
572
-
573
- try {
574
- DyFM_Crypto.decrypt(exactly18Bytes, validKey);
575
- fail('Should have thrown an error');
576
- } catch (error: any) {
577
- expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
578
- // Pre-parse validation catches this, so check for character count or byte count in message
579
- const errorMsg = error._message || error.message || '';
580
- expect(errorMsg).toMatch(/received|characters|bytes|original/);
581
- }
582
- });
583
-
584
- it('| should handle scenarios where base64 string length does not match parsed byte count', () => {
585
- // Create a base64 string with padding that affects byte count
586
- const encrypted = DyFM_Crypto.encrypt(validData, validKey);
587
- // Add padding characters that shouldn't be there
588
- const withExtraPadding = encrypted + '==';
589
-
590
- try {
591
- DyFM_Crypto.decrypt(withExtraPadding, validKey);
592
- fail('Should have thrown an error');
593
- } catch (error: any) {
594
- // Should throw some kind of error (either corrupted or wrong key)
595
- expect(() => {
596
- throw error;
597
- }).toThrow();
598
- }
599
- });
600
-
601
- it('| should throw error for 64 bytes when truncated from valid encrypted data', () => {
602
- const encrypted = DyFM_Crypto.encrypt(validData, validKey);
603
- // Truncate encrypted data to simulate corruption
604
- // Use a shorter truncation that will definitely fail validation
605
- // 50 characters is less than 64 (minimum expected), so it will fail pre-parse validation
606
- const truncated = encrypted.substring(0, 50);
607
-
608
- try {
609
- DyFM_Crypto.decrypt(truncated, validKey);
610
- fail('Should have thrown an error');
611
- } catch (error: any) {
612
- // Should throw an error - DATA-CORRUPTED from pre-parse validation
613
- expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
614
- expect(() => {
615
- throw error;
616
- }).toThrow();
617
- }
618
- });
619
-
620
- it('| should validate error code for various byte count scenarios', () => {
621
- const byteCounts = [
622
- { bytes: 16, base64Length: 22 },
623
- { bytes: 18, base64Length: 24 },
624
- { bytes: 24, base64Length: 32 },
625
- { bytes: 32, base64Length: 43 },
626
- { bytes: 40, base64Length: 54 }
627
- ];
628
-
629
- byteCounts.forEach(({ base64Length }) => {
630
- // Create a base64 string of the specified length
631
- const shortBase64 = 'A'.repeat(base64Length);
632
-
633
- try {
634
- DyFM_Crypto.decrypt(shortBase64, validKey);
635
- fail(`Should have thrown an error for ${base64Length} character base64 string`);
636
- } catch (error: any) {
637
- // All should throw DATA-CORRUPTED or similar error
638
- expect(error._errorCode).toBeDefined();
639
- }
640
- });
641
- });
642
- });
1
+ import { DyFM_Crypto } from './crypto.util';
2
+
3
+ describe('| DyFM_Crypto extra tests', () => {
4
+
5
+ describe('| TIME MANIPULATION TESTS - Cross-temporal consistency', () => {
6
+ const testKey = 'time-test-key-456';
7
+ const testData = {
8
+ id: 123,
9
+ name: 'time-test',
10
+ timestamp: new Date().toISOString(),
11
+ nested: { value: 'time-dependent-test' }
12
+ };
13
+
14
+ let originalDateNow: () => number;
15
+ let originalDateConstructor: DateConstructor;
16
+
17
+ beforeEach(() => {
18
+ // Store original Date functions
19
+ originalDateNow = Date.now;
20
+ originalDateConstructor = Date;
21
+ });
22
+
23
+ afterEach(() => {
24
+ // Restore original Date functions
25
+ Date.now = originalDateNow;
26
+ (global as any).Date = originalDateConstructor;
27
+ });
28
+
29
+ it('| should produce identical encrypted output regardless of system time', () => {
30
+ const baseTime = 1609459200000; // 2021-01-01 00:00:00 UTC
31
+
32
+ // Mock Date.now to return fixed time
33
+ Date.now = jasmine.createSpy('Date.now').and.returnValue(baseTime);
34
+
35
+ // Mock Date constructor to return fixed date
36
+ (global as any).Date = jasmine.createSpy('Date').and.callFake((args: any) => {
37
+ if (!args) {
38
+ return new originalDateConstructor(baseTime);
39
+ }
40
+ return new originalDateConstructor(args);
41
+ });
42
+
43
+ const encrypted1 = DyFM_Crypto.encrypt(testData, testKey);
44
+ const encrypted2 = DyFM_Crypto.encrypt(testData, testKey);
45
+
46
+ expect(encrypted1).toEqual(encrypted2);
47
+ expect(encrypted1).toBeDefined();
48
+ });
49
+
50
+ it('| should maintain consistency across different time zones', () => {
51
+ const timeZones = [
52
+ 0, // UTC
53
+ -5, // EST
54
+ 1, // CET
55
+ 9, // JST
56
+ -8, // PST
57
+ 5.5 // IST
58
+ ];
59
+
60
+ const results: string[] = [];
61
+
62
+ timeZones.forEach(offset => {
63
+ const baseTime = 1609459200000 + (offset * 3600000); // Adjust for timezone
64
+ Date.now = jasmine.createSpy('Date.now').and.returnValue(baseTime);
65
+
66
+ const encrypted = DyFM_Crypto.encrypt(testData, testKey);
67
+ results.push(encrypted);
68
+ });
69
+
70
+ // All results should be identical regardless of timezone
71
+ const firstResult = results[0];
72
+ results.forEach(result => {
73
+ expect(result).toEqual(firstResult);
74
+ });
75
+ });
76
+
77
+ it('| should handle time-based data consistently', () => {
78
+ const timeBasedData = {
79
+ createdAt: new Date('2023-01-01T00:00:00Z'),
80
+ updatedAt: new Date('2023-12-31T23:59:59Z'),
81
+ timestamp: Date.now(),
82
+ timeString: new Date().toISOString()
83
+ };
84
+
85
+ // Test with different system times
86
+ const times = [
87
+ 1609459200000, // 2021-01-01
88
+ 1640995200000, // 2022-01-01
89
+ 1672531200000, // 2023-01-01
90
+ 1704067200000 // 2024-01-01
91
+ ];
92
+
93
+ const results: string[] = [];
94
+
95
+ times.forEach(time => {
96
+ Date.now = jasmine.createSpy('Date.now').and.returnValue(time);
97
+ const encrypted = DyFM_Crypto.encrypt(timeBasedData, testKey);
98
+ results.push(encrypted);
99
+ });
100
+
101
+ // All results should be identical
102
+ const firstResult = results[0];
103
+ results.forEach(result => {
104
+ expect(result).toEqual(firstResult);
105
+ });
106
+ });
107
+
108
+ it('| should maintain consistency across date boundaries', () => {
109
+ const boundaryTimes = [
110
+ 1609459200000, // 2021-01-01 00:00:00
111
+ 1609459259999, // 2021-01-01 00:00:59
112
+ 1609459260000, // 2021-01-01 00:01:00
113
+ 1609545600000, // 2021-01-02 00:00:00
114
+ 1609632000000, // 2021-01-03 00:00:00
115
+ 1640995200000, // 2022-01-01 00:00:00
116
+ 1672531200000 // 2023-01-01 00:00:00
117
+ ];
118
+
119
+ const results: string[] = [];
120
+
121
+ boundaryTimes.forEach(time => {
122
+ Date.now = jasmine.createSpy('Date.now').and.returnValue(time);
123
+ const encrypted = DyFM_Crypto.encrypt(testData, testKey);
124
+ results.push(encrypted);
125
+ });
126
+
127
+ // All results should be identical
128
+ const firstResult = results[0];
129
+ results.forEach(result => {
130
+ expect(result).toEqual(firstResult);
131
+ });
132
+ });
133
+
134
+ it('| should handle leap year transitions consistently', () => {
135
+ const leapYearTimes = [
136
+ 1609459200000, // 2021-01-01 (not leap year)
137
+ 1640995200000, // 2022-01-01 (not leap year)
138
+ 1672531200000, // 2023-01-01 (not leap year)
139
+ 1704067200000, // 2024-01-01 (leap year)
140
+ 1735689600000, // 2025-01-01 (not leap year)
141
+ 1735689600000 + (365 * 24 * 60 * 60 * 1000), // 2025-12-31
142
+ 1735689600000 + (366 * 24 * 60 * 60 * 1000) // 2026-01-01
143
+ ];
144
+
145
+ const results: string[] = [];
146
+
147
+ leapYearTimes.forEach(time => {
148
+ Date.now = jasmine.createSpy('Date.now').and.returnValue(time);
149
+ const encrypted = DyFM_Crypto.encrypt(testData, testKey);
150
+ results.push(encrypted);
151
+ });
152
+
153
+ // All results should be identical
154
+ const firstResult = results[0];
155
+ results.forEach(result => {
156
+ expect(result).toEqual(firstResult);
157
+ });
158
+ });
159
+
160
+ it('| should maintain consistency across daylight saving time transitions', () => {
161
+ // DST transition times (approximate)
162
+ const dstTimes = [
163
+ 1615708800000, // 2021-03-14 (DST start)
164
+ 1615712400000, // 2021-03-14 01:00 (DST start + 1 hour)
165
+ 1636243200000, // 2021-11-07 (DST end)
166
+ 1636246800000, // 2021-11-07 01:00 (DST end + 1 hour)
167
+ 1648339200000, // 2022-03-13 (DST start)
168
+ 1648342800000, // 2022-03-13 01:00 (DST start + 1 hour)
169
+ 1668816000000, // 2022-11-06 (DST end)
170
+ 1668819600000 // 2022-11-06 01:00 (DST end + 1 hour)
171
+ ];
172
+
173
+ const results: string[] = [];
174
+
175
+ dstTimes.forEach(time => {
176
+ Date.now = jasmine.createSpy('Date.now').and.returnValue(time);
177
+ const encrypted = DyFM_Crypto.encrypt(testData, testKey);
178
+ results.push(encrypted);
179
+ });
180
+
181
+ // All results should be identical
182
+ const firstResult = results[0];
183
+ results.forEach(result => {
184
+ expect(result).toEqual(firstResult);
185
+ });
186
+ });
187
+
188
+ it('| should handle microsecond precision consistently', () => {
189
+ const baseTime = 1609459200000;
190
+ const microsecondOffsets = [
191
+ 0,
192
+ 1,
193
+ 10,
194
+ 100,
195
+ 1000,
196
+ 10000,
197
+ 100000,
198
+ 999999
199
+ ];
200
+
201
+ const results: string[] = [];
202
+
203
+ microsecondOffsets.forEach(offset => {
204
+ const time = baseTime + offset;
205
+ Date.now = jasmine.createSpy('Date.now').and.returnValue(time);
206
+ const encrypted = DyFM_Crypto.encrypt(testData, testKey);
207
+ results.push(encrypted);
208
+ });
209
+
210
+ // All results should be identical
211
+ const firstResult = results[0];
212
+ results.forEach(result => {
213
+ expect(result).toEqual(firstResult);
214
+ });
215
+ });
216
+
217
+ it('| should maintain consistency across different Date object states', () => {
218
+ const testDataWithDates = {
219
+ date1: new Date('2023-01-01'),
220
+ date2: new Date('2023-12-31'),
221
+ date3: new Date(),
222
+ date4: new Date(0), // Unix epoch
223
+ date5: new Date(8640000000000000), // Max safe date
224
+ date6: new Date(-8640000000000000) // Min safe date
225
+ };
226
+
227
+ const results: string[] = [];
228
+
229
+ // Test with different system times
230
+ const systemTimes = [1609459200000, 1640995200000, 1672531200000];
231
+
232
+ systemTimes.forEach(systemTime => {
233
+ Date.now = jasmine.createSpy('Date.now').and.returnValue(systemTime);
234
+ const encrypted = DyFM_Crypto.encrypt(testDataWithDates, testKey);
235
+ results.push(encrypted);
236
+ });
237
+
238
+ // All results should be identical
239
+ const firstResult = results[0];
240
+ results.forEach(result => {
241
+ expect(result).toEqual(firstResult);
242
+ });
243
+ });
244
+
245
+ it('| should handle time-based encryption/decryption cycles consistently', () => {
246
+ const cycles = 10;
247
+ const results: string[] = [];
248
+
249
+ for (let i = 0; i < cycles; i++) {
250
+ // Simulate different system times
251
+ const time = 1609459200000 + (i * 86400000); // Add 1 day each cycle
252
+ Date.now = jasmine.createSpy('Date.now').and.returnValue(time);
253
+
254
+ const encrypted = DyFM_Crypto.encrypt(testData, testKey);
255
+ results.push(encrypted);
256
+ }
257
+
258
+ // All results should be identical
259
+ const firstResult = results[0];
260
+ results.forEach(result => {
261
+ expect(result).toEqual(firstResult);
262
+ });
263
+ });
264
+
265
+ it('| should maintain consistency with real-world time scenarios', () => {
266
+ const realWorldScenarios = [
267
+ { name: 'New Year 2021', time: 1609459200000 },
268
+ { name: 'Leap Day 2020', time: 1583020800000 },
269
+ { name: 'DST Start 2021', time: 1615708800000 },
270
+ { name: 'DST End 2021', time: 1636243200000 },
271
+ { name: 'Midnight UTC', time: 1609459200000 },
272
+ { name: 'Noon UTC', time: 1609459200000 + (12 * 3600000) },
273
+ { name: 'End of Day', time: 1609459200000 + (23 * 3600000) + (59 * 60000) + (59 * 1000) }
274
+ ];
275
+
276
+ const results: string[] = [];
277
+
278
+ realWorldScenarios.forEach(scenario => {
279
+ Date.now = jasmine.createSpy('Date.now').and.returnValue(scenario.time);
280
+ const encrypted = DyFM_Crypto.encrypt(testData, testKey);
281
+ results.push(encrypted);
282
+ });
283
+
284
+ // All results should be identical
285
+ const firstResult = results[0];
286
+ results.forEach((result, index) => {
287
+ expect(result).toEqual(firstResult);
288
+ });
289
+ });
290
+ });
291
+
292
+ describe('| ERROR HANDLING TESTS - Comprehensive validation', () => {
293
+ const validKey = 'valid-test-key-123';
294
+ const validData = { id: 1, name: 'test' };
295
+
296
+ describe('| Encryption Error Cases', () => {
297
+ it('| should throw descriptive error when encrypting undefined data', () => {
298
+ expect(() => DyFM_Crypto.encrypt(undefined, validKey)).toThrow();
299
+ });
300
+
301
+ it('| should throw descriptive error when encrypting null data', () => {
302
+ expect(() => DyFM_Crypto.encrypt(null, validKey)).toThrow();
303
+ });
304
+
305
+ it('| should throw descriptive error when encrypting empty string', () => {
306
+ expect(() => DyFM_Crypto.encrypt('', validKey)).toThrow();
307
+ });
308
+
309
+ it('| should allow empty object for backward compatibility', () => {
310
+ expect(() => DyFM_Crypto.encrypt({}, validKey)).not.toThrow();
311
+ });
312
+
313
+ it('| should allow empty array for backward compatibility', () => {
314
+ expect(() => DyFM_Crypto.encrypt([], validKey)).not.toThrow();
315
+ });
316
+
317
+ it('| should throw descriptive error when key is missing', () => {
318
+ expect(() => DyFM_Crypto.encrypt(validData, undefined as any)).toThrow();
319
+ });
320
+
321
+ it('| should throw descriptive error when key is null', () => {
322
+ expect(() => DyFM_Crypto.encrypt(validData, null as any)).toThrow();
323
+ });
324
+
325
+ it('| should throw descriptive error when key is not a string', () => {
326
+ expect(() => DyFM_Crypto.encrypt(validData, 123 as any)).toThrow();
327
+ });
328
+
329
+ it('| should throw descriptive error when key is empty string', () => {
330
+ expect(() => DyFM_Crypto.encrypt(validData, '')).toThrow();
331
+ });
332
+
333
+ it('| should throw descriptive error when key is only whitespace', () => {
334
+ expect(() => DyFM_Crypto.encrypt(validData, ' ')).toThrow();
335
+ });
336
+
337
+ it('| should warn about short keys but still work', () => {
338
+ // This test just ensures encryption works with short keys
339
+ // Note: Warning is shown in console but spy might not catch it in test environment
340
+ expect(() => DyFM_Crypto.encrypt(validData, 'short')).not.toThrow();
341
+ });
342
+ });
343
+
344
+ describe('| Decryption Error Cases', () => {
345
+ it('| should throw descriptive error when decrypting undefined data', () => {
346
+ expect(() => DyFM_Crypto.decrypt(undefined as any, validKey)).toThrow();
347
+ });
348
+
349
+ it('| should throw descriptive error when decrypting null data', () => {
350
+ expect(() => DyFM_Crypto.decrypt(null as any, validKey)).toThrow();
351
+ });
352
+
353
+ it('| should throw descriptive error when decrypting non-string data', () => {
354
+ expect(() => DyFM_Crypto.decrypt(123 as any, validKey)).toThrow();
355
+ });
356
+
357
+ it('| should throw descriptive error when decrypting empty string', () => {
358
+ expect(() => DyFM_Crypto.decrypt('', validKey)).toThrow();
359
+ });
360
+
361
+ it('| should throw descriptive error when decrypting too short data', () => {
362
+ expect(() => DyFM_Crypto.decrypt('short', validKey)).toThrow();
363
+ });
364
+
365
+ it('| should throw descriptive error when decrypting invalid format', () => {
366
+ expect(() => DyFM_Crypto.decrypt('invalid!@#format', validKey)).toThrow();
367
+ });
368
+
369
+ it('| should throw descriptive error when key is missing for decryption', () => {
370
+ const encrypted = DyFM_Crypto.encrypt(validData, validKey);
371
+ expect(() => DyFM_Crypto.decrypt(encrypted, undefined as any)).toThrow();
372
+ });
373
+
374
+ it('| should throw descriptive error when key is wrong type for decryption', () => {
375
+ const encrypted = DyFM_Crypto.encrypt(validData, validKey);
376
+ expect(() => DyFM_Crypto.decrypt(encrypted, 123 as any)).toThrow();
377
+ });
378
+
379
+ it('| should throw descriptive error when key is empty for decryption', () => {
380
+ const encrypted = DyFM_Crypto.encrypt(validData, validKey);
381
+ expect(() => DyFM_Crypto.decrypt(encrypted, '')).toThrow();
382
+ });
383
+
384
+ it('| should handle decryption with proper key validation', () => {
385
+ // Test that decryption works with valid key
386
+ const encrypted = DyFM_Crypto.encrypt(validData, validKey);
387
+ expect(() => DyFM_Crypto.decrypt(encrypted, validKey)).not.toThrow();
388
+ });
389
+ });
390
+
391
+ describe('| Decryption Failure Scenarios', () => {
392
+ it('| should throw descriptive error when decrypting with wrong key', () => {
393
+ const encrypted = DyFM_Crypto.encrypt(validData, validKey);
394
+ expect(() => DyFM_Crypto.decrypt(encrypted, 'wrong-key-123')).toThrow();
395
+ });
396
+
397
+ it('| should throw descriptive error when decrypting corrupted data', () => {
398
+ const encrypted = DyFM_Crypto.encrypt(validData, validKey);
399
+ const corrupted = encrypted.substring(0, encrypted.length - 10); // Remove last 10 characters
400
+ expect(() => DyFM_Crypto.decrypt(corrupted, validKey)).toThrow();
401
+ });
402
+
403
+ it('| should throw descriptive error when decrypting invalid base64', () => {
404
+ expect(() => DyFM_Crypto.decrypt('invalid-base64!@#', validKey)).toThrow();
405
+ });
406
+
407
+ it('| should throw descriptive error when decrypting completely wrong data', () => {
408
+ expect(() => DyFM_Crypto.decrypt('this-is-not-encrypted-data', validKey)).toThrow();
409
+ });
410
+ });
411
+
412
+ describe('| Edge Case Validations', () => {
413
+ it('| should allow valid data with minimum key length', () => {
414
+ const shortKey = '12345678'; // 8 characters minimum
415
+ const encrypted = DyFM_Crypto.encrypt(validData, shortKey);
416
+ const decrypted = DyFM_Crypto.decrypt(encrypted, shortKey);
417
+ expect(decrypted).toEqual(validData);
418
+ });
419
+
420
+ it('| should allow valid data with whitespace in key', () => {
421
+ const keyWithSpaces = ' valid-key-123 ';
422
+ const encrypted = DyFM_Crypto.encrypt(validData, keyWithSpaces);
423
+ const decrypted = DyFM_Crypto.decrypt(encrypted, keyWithSpaces);
424
+ expect(decrypted).toEqual(validData);
425
+ });
426
+
427
+ it('| should handle special characters in data', () => {
428
+ const specialData = {
429
+ special: '!@#$%^&*()_+-=[]{}|;:,.<>?',
430
+ unicode: '世界你好',
431
+ emoji: '🚀💻🔐'
432
+ };
433
+ const encrypted = DyFM_Crypto.encrypt(specialData, validKey);
434
+ const decrypted = DyFM_Crypto.decrypt(encrypted, validKey);
435
+ expect(decrypted).toEqual(specialData);
436
+ });
437
+
438
+ it('| should handle very long data', () => {
439
+ const longData = {
440
+ text: 'A'.repeat(10000),
441
+ array: Array(1000).fill(0).map((_, i) => i),
442
+ nested: {
443
+ level1: { level2: { level3: { data: 'deep nested data' } } }
444
+ }
445
+ };
446
+ const encrypted = DyFM_Crypto.encrypt(longData, validKey);
447
+ const decrypted = DyFM_Crypto.decrypt(encrypted, validKey);
448
+ expect(decrypted).toEqual(longData);
449
+ });
450
+ });
451
+
452
+ describe('| Error Code Validation', () => {
453
+ it('| should have specific error codes for different failure types', () => {
454
+ try {
455
+ DyFM_Crypto.encrypt(undefined, validKey);
456
+ fail('Should have thrown an error');
457
+ } catch (error: any) {
458
+ expect(error._errorCode).toBe('DyFM-CRY-DATA-UNDEFINED');
459
+ }
460
+
461
+ try {
462
+ DyFM_Crypto.encrypt(validData, '');
463
+ fail('Should have thrown an error');
464
+ } catch (error: any) {
465
+ expect(error._errorCode).toBe('DyFM-CRY-KEY-MISSING');
466
+ }
467
+
468
+ try {
469
+ DyFM_Crypto.decrypt('', validKey);
470
+ fail('Should have thrown an error');
471
+ } catch (error: any) {
472
+ expect(error._errorCode).toBe('DyFM-CRY-ENCRYPTED-EMPTY');
473
+ }
474
+ });
475
+ });
476
+ });
477
+
478
+ describe('| specific byte count and corruption scenarios', () => {
479
+ const validKey = 'valid-test-key-123';
480
+ const validData = { id: 1, name: 'test' };
481
+
482
+ it('| should throw DyFM-CRY-DATA-CORRUPTED error with correct message for 18 bytes', () => {
483
+ // Create a base64 string that parses to exactly 18 bytes
484
+ // 18 bytes = 24 base64 characters (18 * 4/3 = 24)
485
+ const exactly18Bytes = 'ABCDEFGHIJKLMNOPQRSTUVWX'; // 24 chars = 18 bytes
486
+
487
+ try {
488
+ DyFM_Crypto.decrypt(exactly18Bytes, validKey);
489
+ fail('Should have thrown an error');
490
+ } catch (error: any) {
491
+ expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
492
+ // Pre-parse validation catches this, so check for base64 character count message
493
+ expect(error._message || error.message || '').toContain('too short');
494
+ expect(error._message || error.message || '').toContain('characters');
495
+ }
496
+ });
497
+
498
+ it('| should throw error for 16 bytes (too short)', () => {
499
+ // 16 bytes = ~22 base64 characters (but we need exact 16 bytes = 21.33 chars, round to 22)
500
+ const exactly16Bytes = 'ABCDEFGHIJKLMNOPQRSTUV'; // 22 chars ≈ 16 bytes
501
+
502
+ try {
503
+ DyFM_Crypto.decrypt(exactly16Bytes, validKey);
504
+ fail('Should have thrown an error');
505
+ } catch (error: any) {
506
+ expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
507
+ }
508
+ });
509
+
510
+ it('| should throw error for 24 bytes (too short)', () => {
511
+ // 24 bytes = 32 base64 characters
512
+ const exactly24Bytes = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCD'; // 32 chars = 24 bytes
513
+
514
+ try {
515
+ DyFM_Crypto.decrypt(exactly24Bytes, validKey);
516
+ fail('Should have thrown an error');
517
+ } catch (error: any) {
518
+ expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
519
+ // Pre-parse validation catches this, so check for base64 character count message
520
+ expect(error._message || error.message || '').toContain('too short');
521
+ expect(error._message || error.message || '').toContain('characters');
522
+ }
523
+ });
524
+
525
+ it('| should throw error for 32 bytes (too short)', () => {
526
+ // 32 bytes = 43 base64 characters (32 * 4/3 = 42.67, round to 43)
527
+ const exactly32Bytes = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP'; // 43 chars ≈ 32 bytes
528
+
529
+ try {
530
+ DyFM_Crypto.decrypt(exactly32Bytes, validKey);
531
+ fail('Should have thrown an error');
532
+ } catch (error: any) {
533
+ expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
534
+ // Pre-parse validation catches this, so check for base64 character count message
535
+ expect(error._message || error.message || '').toContain('too short');
536
+ }
537
+ });
538
+
539
+ it('| should throw error for 40 bytes (too short)', () => {
540
+ // 40 bytes = 54 base64 characters (40 * 4/3 = 53.33, round to 54)
541
+ const exactly40Bytes = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB'; // 54 chars ≈ 40 bytes
542
+
543
+ try {
544
+ DyFM_Crypto.decrypt(exactly40Bytes, validKey);
545
+ fail('Should have thrown an error');
546
+ } catch (error: any) {
547
+ expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
548
+ // Pre-parse validation catches this, so check for base64 character count message
549
+ expect(error._message || error.message || '').toContain('too short');
550
+ }
551
+ });
552
+
553
+ it('| should validate error message includes correct expected byte count (48)', () => {
554
+ const encrypted = DyFM_Crypto.encrypt(validData, validKey);
555
+ // Truncate to make it less than 48 bytes
556
+ const truncated = encrypted.substring(0, 20); // Very short
557
+
558
+ try {
559
+ DyFM_Crypto.decrypt(truncated, validKey);
560
+ fail('Should have thrown an error');
561
+ } catch (error: any) {
562
+ expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
563
+ // Pre-parse validation catches this, so check for base64 character count or byte count message
564
+ const errorMsg = error._message || error.message || '';
565
+ expect(errorMsg).toMatch(/Expected at least|too short|48|bytes|characters/);
566
+ }
567
+ });
568
+
569
+ it('| should validate error message includes correct received byte count', () => {
570
+ // Create a base64 string that parses to exactly 18 bytes
571
+ const exactly18Bytes = 'ABCDEFGHIJKLMNOPQRSTUVWX'; // 24 chars = 18 bytes
572
+
573
+ try {
574
+ DyFM_Crypto.decrypt(exactly18Bytes, validKey);
575
+ fail('Should have thrown an error');
576
+ } catch (error: any) {
577
+ expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
578
+ // Pre-parse validation catches this, so check for character count or byte count in message
579
+ const errorMsg = error._message || error.message || '';
580
+ expect(errorMsg).toMatch(/received|characters|bytes|original/);
581
+ }
582
+ });
583
+
584
+ it('| should handle scenarios where base64 string length does not match parsed byte count', () => {
585
+ // Create a base64 string with padding that affects byte count
586
+ const encrypted = DyFM_Crypto.encrypt(validData, validKey);
587
+ // Add padding characters that shouldn't be there
588
+ const withExtraPadding = encrypted + '==';
589
+
590
+ try {
591
+ DyFM_Crypto.decrypt(withExtraPadding, validKey);
592
+ fail('Should have thrown an error');
593
+ } catch (error: any) {
594
+ // Should throw some kind of error (either corrupted or wrong key)
595
+ expect(() => {
596
+ throw error;
597
+ }).toThrow();
598
+ }
599
+ });
600
+
601
+ it('| should throw error for 64 bytes when truncated from valid encrypted data', () => {
602
+ const encrypted = DyFM_Crypto.encrypt(validData, validKey);
603
+ // Truncate encrypted data to simulate corruption
604
+ // Use a shorter truncation that will definitely fail validation
605
+ // 50 characters is less than 64 (minimum expected), so it will fail pre-parse validation
606
+ const truncated = encrypted.substring(0, 50);
607
+
608
+ try {
609
+ DyFM_Crypto.decrypt(truncated, validKey);
610
+ fail('Should have thrown an error');
611
+ } catch (error: any) {
612
+ // Should throw an error - DATA-CORRUPTED from pre-parse validation
613
+ expect(error._errorCode).toBe('DyFM-CRY-DATA-CORRUPTED');
614
+ expect(() => {
615
+ throw error;
616
+ }).toThrow();
617
+ }
618
+ });
619
+
620
+ it('| should validate error code for various byte count scenarios', () => {
621
+ const byteCounts = [
622
+ { bytes: 16, base64Length: 22 },
623
+ { bytes: 18, base64Length: 24 },
624
+ { bytes: 24, base64Length: 32 },
625
+ { bytes: 32, base64Length: 43 },
626
+ { bytes: 40, base64Length: 54 }
627
+ ];
628
+
629
+ byteCounts.forEach(({ base64Length }) => {
630
+ // Create a base64 string of the specified length
631
+ const shortBase64 = 'A'.repeat(base64Length);
632
+
633
+ try {
634
+ DyFM_Crypto.decrypt(shortBase64, validKey);
635
+ fail(`Should have thrown an error for ${base64Length} character base64 string`);
636
+ } catch (error: any) {
637
+ // All should throw DATA-CORRUPTED or similar error
638
+ expect(error._errorCode).toBeDefined();
639
+ }
640
+ });
641
+ });
642
+ });
643
643
  });