@futdevpro/nts-dynamo 1.15.15 → 1.15.16
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.
- package/.c8rc.json +26 -26
- package/.copilot/patterns.json +7 -7
- package/.cursor/rules/__assistant_guide.mdc +30 -30
- package/.cursor/rules/_ag_backend-structure.mdc +85 -85
- package/.cursor/rules/_ag_backend.mdc +16 -16
- package/.cursor/rules/_ag_frontend-structure.mdc +86 -86
- package/.cursor/rules/_ag_frontend.mdc +39 -39
- package/.cursor/rules/_ag_import-rules.mdc +44 -44
- package/.cursor/rules/_ag_naming.mdc +115 -115
- package/.cursor/rules/_ag_should-be.mdc +6 -6
- package/.cursor/rules/ai_development_guide.md +60 -60
- package/.cursor/rules/cursor-rules.md +160 -160
- package/.cursor/rules/default-command.mdc +464 -464
- package/.cursor/rules/error_code_pattern.md +39 -39
- package/.cursor/rules/saved rule mcp server use.md +15 -15
- package/.dynamo/version-bump.config.json +5 -0
- package/.github/workflows/main.yml +426 -393
- package/.husky/pre-commit +1 -0
- package/.vscode/settings.json +10 -10
- package/HOWTO.md +15 -15
- package/LICENSE +21 -21
- package/__documentations/2026-04-28-logs-module.md +49 -0
- package/__documentations/nts-integration-tests-2026-03-17.md +26 -26
- package/_specifications/BACKLOG.md +50 -50
- package/_specifications/TODO.md +15 -15
- package/_specifications/agent.md +138 -138
- package/eslint.config.js +3 -3
- package/nodemon.json +24 -24
- package/package.json +343 -362
- package/pipeline.cicd.config.json +152 -0
- package/scripts/run-coverage-tests.js +28 -28
- package/spec/support/helpers/spec-reporter-loader.js +359 -359
- package/spec/support/helpers/ts-node-helper.js +93 -93
- package/spec/support/jasmine.coverage.json +24 -24
- package/spec/support/jasmine.json +24 -24
- package/src/_collections/archive.util.spec.ts +57 -57
- package/src/_collections/archive.util.ts +18 -18
- package/src/_collections/atlas-default-db-options.const.ts +9 -9
- package/src/_collections/default-fallback-cache-max-age.const.spec.ts +11 -11
- package/src/_collections/default-fallback-cache-max-age.const.ts +2 -2
- package/src/_collections/default-not-found-page.const.spec.ts +19 -19
- package/src/_collections/default-not-found-page.const.ts +22 -22
- package/src/_collections/default-socket-path.const.spec.ts +12 -12
- package/src/_collections/default-socket-path.const.ts +2 -2
- package/src/_collections/get-environment-settings.util.spec.ts +210 -210
- package/src/_collections/get-environment-settings.util.ts +48 -48
- package/src/_collections/sample.env +21 -21
- package/src/_collections/star.controller.spec.ts +224 -224
- package/src/_collections/star.controller.ts +129 -129
- package/src/_enums/data-model-type.enum.ts +14 -14
- package/src/_enums/data-service-function.enum.ts +24 -24
- package/src/_enums/predefined-data-types.enum.ts +16 -16
- package/src/_enums/route-security.enum.ts +12 -12
- package/src/_models/control-models/api-call-params.control-model.spec.ts +152 -152
- package/src/_models/control-models/api-call-params.control-model.ts +142 -142
- package/src/_models/control-models/app-ext-system-controls.control-model.spec.ts +52 -52
- package/src/_models/control-models/app-ext-system-controls.control-model.ts +9 -9
- package/src/_models/control-models/app-params.control-model.spec.ts +225 -225
- package/src/_models/control-models/app-params.control-model.ts +136 -136
- package/src/_models/control-models/app-system-controls.control-model.spec.ts +31 -31
- package/src/_models/control-models/app-system-controls.control-model.ts +9 -9
- package/src/_models/control-models/endpoint-params.control-model.spec.ts +578 -578
- package/src/_models/control-models/endpoint-params.control-model.ts +526 -526
- package/src/_models/control-models/http-settings.control-model.spec.ts +77 -77
- package/src/_models/control-models/http-settings.control-model.ts +37 -37
- package/src/_models/control-models/system-control.control-model.spec.ts +27 -27
- package/src/_models/control-models/system-control.control-model.ts +12 -12
- package/src/_models/interfaces/certification-settings.interface.ts +7 -7
- package/src/_models/interfaces/environment-settings.interface.ts +59 -59
- package/src/_models/interfaces/global-log-settings.interface.ts +108 -108
- package/src/_models/interfaces/global-service-settings.interface.ts +47 -47
- package/src/_models/interfaces/routing-module-settings.interface.ts +21 -21
- package/src/_models/interfaces/static-client-settings.interface.spec.ts +29 -29
- package/src/_models/interfaces/static-client-settings.interface.ts +28 -28
- package/src/_models/types/db-update.type.ts +100 -100
- package/src/_modules/ai/_models/ai-input-interfaces.ts +117 -117
- package/src/_modules/ai/_models/ai-test-generation-result.interface.ts +16 -16
- package/src/_modules/ai/_modules/anthropic/_services/aai-user-key.control-service.ts +138 -138
- package/src/_modules/ai/_modules/anthropic/index.ts +5 -5
- package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.spec.ts +242 -242
- package/src/_modules/ai/_modules/document-ai/_collections/dai-chunking.util.ts +639 -639
- package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.spec.ts +209 -209
- package/src/_modules/ai/_modules/document-ai/_collections/dai-document.util.ts +85 -85
- package/src/_modules/ai/_modules/document-ai/_enums/dai-compare-result-type.enum.ts +7 -7
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-chunk.data-model.ts +146 -146
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-doc-page.data-model.ts +162 -162
- package/src/_modules/ai/_modules/document-ai/_models/data-models/dai-document.data-model.ts +99 -99
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-chunk-compare-result.interface.ts +18 -18
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-doc-page-compare-result.interface.ts +19 -19
- package/src/_modules/ai/_modules/document-ai/_models/interfaces/dai-document-compare-result.interface.ts +25 -25
- package/src/_modules/ai/_modules/document-ai/index.ts +28 -28
- package/src/_modules/ai/_modules/fdp-ai/_services/fdpai-user-key.control-service.ts +189 -189
- package/src/_modules/ai/_modules/fdp-ai/index.ts +5 -5
- package/src/_modules/ai/_modules/open-ai/_collections/oai-global-settings.const.ts +9 -9
- package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests-hu.conts.ts +82 -82
- package/src/_modules/ai/_modules/open-ai/_collections/oai-llm-predefined-requests.conts.ts +75 -75
- package/src/_modules/ai/_modules/open-ai/_enums/oai-gpt-message-role.enum.ts +45 -45
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-global-settings.interface.ts +7 -7
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-gpt-message.interface.ts +7 -7
- package/src/_modules/ai/_modules/open-ai/_models/interfaces/oai-llm-predefined-requests.interface.ts +57 -57
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-doc-chunk-data.service.ts +292 -292
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-document.data-service.spec.ts +342 -342
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.spec.ts +550 -550
- package/src/_modules/ai/_modules/open-ai/_services/data-services/oai-vector-data.service.ts +630 -630
- package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.spec.ts +240 -240
- package/src/_modules/ai/_modules/open-ai/_services/oai-embedding.control-service.ts +98 -98
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.spec.ts +462 -462
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm-chat.service-base.ts +615 -615
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.spec.ts +437 -437
- package/src/_modules/ai/_modules/open-ai/_services/oai-llm.service-base.ts +833 -833
- package/src/_modules/ai/_modules/open-ai/_services/oai-user-key.control-service.ts +157 -157
- package/src/_modules/ai/_services/ai-embedding.service-base.spec.ts +98 -98
- package/src/_modules/ai/_services/ai-embedding.service-base.ts +48 -48
- package/src/_modules/ai/_services/ai-llm-chat.service-base.spec.ts +229 -229
- package/src/_modules/ai/_services/ai-llm-chat.service-base.ts +68 -68
- package/src/_modules/ai/_services/ai-llm.service-base.spec.ts +250 -250
- package/src/_modules/ai/_services/ai-llm.service-base.ts +332 -332
- package/src/_modules/ai/_services/ai-provider.service-base.spec.ts +79 -79
- package/src/_modules/ai/_services/ai-provider.service-base.ts +29 -29
- package/src/_modules/ai/_services/ai-user-key.service-base.ts +59 -59
- package/src/_modules/ai/index.ts +13 -13
- package/src/_modules/assistant/_collections/ass-global-settings.const.ts +13 -13
- package/src/_modules/assistant/_collections/ass.util.spec.ts +176 -176
- package/src/_modules/assistant/_collections/ass.util.ts +50 -50
- package/src/_modules/assistant/_models/ass-global-settings.interface.ts +15 -15
- package/src/_modules/assistant/_services/ass-io.control-service.spec.ts +140 -140
- package/src/_modules/assistant/_services/ass-main.control-service.spec.ts +192 -192
- package/src/_modules/assistant/_services/ass-main.control-service.ts +107 -107
- package/src/_modules/bot/_collections/bot-default-commands.const.ts +12 -12
- package/src/_modules/bot/_collections/bot-global-settings.const.ts +39 -39
- package/src/_modules/bot/_models/bot-channel-wrapper.interface.ts +62 -62
- package/src/_modules/bot/_models/bot-command.interface.ts +8 -8
- package/src/_modules/bot/_models/bot-global-settings.interface.ts +96 -96
- package/src/_modules/bot/_models/bot-last-mention-date.interface.ts +6 -6
- package/src/_modules/bot/_models/bot-last-message-date.interface.ts +5 -5
- package/src/_modules/bot/_models/bot-user-wrapper.interface.ts +41 -41
- package/src/_modules/bot/_modules/discord-bot/_models/dib-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/discord-bot/_services/dib-messaging-provider.control-service.spec.ts +431 -431
- package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.spec.ts +160 -160
- package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.ts +55 -55
- package/src/_modules/bot/_modules/dynamo-bot/_models/dyb-platform.types.ts +15 -15
- package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.spec.ts +374 -374
- package/src/_modules/bot/_modules/dynamo-bot/_services/dyb-messaging-provider.control-service.ts +447 -447
- package/src/_modules/bot/_modules/dynamo-bot/index.ts +15 -15
- package/src/_modules/bot/_modules/slack-bot/_models/slb-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.spec.ts +344 -344
- package/src/_modules/bot/_modules/slack-bot/_services/slb-messaging-provider.control-service.ts +197 -197
- package/src/_modules/bot/_modules/teams-bot/_models/teb-platform.types.ts +9 -9
- package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.spec.ts +345 -345
- package/src/_modules/bot/_modules/teams-bot/_services/teb-messaging-provider.control-service.ts +197 -197
- package/src/_modules/bot/_services/bot-commands.control-service.spec.ts +116 -116
- package/src/_modules/bot/_services/bot-io.control-service.spec.ts +285 -285
- package/src/_modules/bot/_services/bot-main.control-service.spec.ts +208 -208
- package/src/_modules/bot/_services/bot-messaging-provider.service-base.spec.ts +349 -349
- package/src/_modules/bot/_services/bot-routines.control-service.spec.ts +111 -111
- package/src/_modules/custom-data/custom-data.controller.spec.ts +49 -49
- package/src/_modules/custom-data/custom-data.controller.ts +67 -67
- package/src/_modules/custom-data/custom-data.data-service.spec.ts +54 -54
- package/src/_modules/custom-data/custom-data.data-service.ts +21 -21
- package/src/_modules/custom-data/get-custom-data-routing-module.util.spec.ts +28 -28
- package/src/_modules/custom-data/get-custom-data-routing-module.util.ts +24 -24
- package/src/_modules/custom-data/index.ts +9 -9
- package/src/_modules/defaults/_collections/default-endpoints.util.ts +487 -487
- package/src/_modules/defaults/_models/default-user.data-model.ts +72 -72
- package/src/_modules/defaults/_services/default-auth.service.spec.ts +269 -269
- package/src/_modules/defaults/_services/default-auth.service.ts +177 -177
- package/src/_modules/defaults/_services/default-socket-events.service.spec.ts +42 -42
- package/src/_modules/defaults/_services/default-socket-events.service.ts +61 -61
- package/src/_modules/defaults/_services/default-user.data-service.spec.ts +187 -187
- package/src/_modules/defaults/_services/default-user.data-service.ts +98 -98
- package/src/_modules/defaults/index.ts +17 -17
- package/src/_modules/discord-assistant/_collections/dias-global-settings.const.ts +19 -19
- package/src/_modules/discord-assistant/_collections/dias.util.spec.ts +366 -366
- package/src/_modules/discord-assistant/_collections/dias.util.ts +132 -132
- package/src/_modules/discord-assistant/_models/dias-global-settings.interface.ts +19 -19
- package/src/_modules/discord-assistant/_models/dias-knowledge.data-model.ts +52 -52
- package/src/_modules/discord-assistant/_services/dias-chunk.data-service.ts +177 -177
- package/src/_modules/discord-assistant/_services/dias-io.control-service.spec.ts +108 -108
- package/src/_modules/discord-assistant/_services/dias-io.control-service.ts +69 -69
- package/src/_modules/discord-assistant/_services/dias-main.control-service.spec.ts +22 -22
- package/src/_modules/discord-assistant/_services/dias-main.control-service.ts +27 -27
- package/src/_modules/discord-assistant/_services/dias.service-base.spec.ts +195 -195
- package/src/_modules/discord-assistant/_services/dias.service-base.ts +76 -76
- package/src/_modules/discord-assistant/index.ts +38 -38
- package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.spec.ts +34 -34
- package/src/_modules/discord-assistant-voiced/_services/dias-discord-bot.control-service.ts +11 -11
- package/src/_modules/discord-assistant-voiced/index.ts +36 -36
- package/src/_modules/discord-bot/_collections/dibo-default-commands.const.ts +16 -16
- package/src/_modules/discord-bot/_collections/dibo-global-settings.conts.ts +55 -55
- package/src/_modules/discord-bot/_collections/dibo-operations.util.spec.ts +214 -214
- package/src/_modules/discord-bot/_collections/dibo-operations.util.ts +387 -387
- package/src/_modules/discord-bot/_models/dibo-command.interface.ts +12 -12
- package/src/_modules/discord-bot/_models/dibo-global-settings.interface.ts +98 -98
- package/src/_modules/discord-bot/_models/dibo-last-mention-date.inteface.ts +7 -7
- package/src/_modules/discord-bot/_models/dibo-last-message-date.interface.ts +6 -6
- package/src/_modules/discord-bot/_services/dibo-commands.control-service.spec.ts +154 -154
- package/src/_modules/discord-bot/_services/dibo-commands.control-service.ts +153 -153
- package/src/_modules/discord-bot/_services/dibo-io.control-service.spec.ts +264 -264
- package/src/_modules/discord-bot/_services/dibo-io.control-service.ts +306 -306
- package/src/_modules/discord-bot/_services/dibo-main.control-service.spec.ts +408 -408
- package/src/_modules/discord-bot/_services/dibo-main.control-service.ts +487 -487
- package/src/_modules/discord-bot/_services/dibo-routines.control-service.spec.ts +105 -105
- package/src/_modules/discord-bot/index.ts +36 -36
- package/src/_modules/local-vector-search/_enums/lvs-search-mode.enum.ts +19 -19
- package/src/_modules/local-vector-search/_models/lvs-search-result.interface.ts +17 -17
- package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.spec.ts +418 -418
- package/src/_modules/local-vector-search/_services/lvs-doc-chunk-data.service.ts +276 -276
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.spec.ts +345 -345
- package/src/_modules/local-vector-search/_services/lvs-local-vector-search.data-service.ts +330 -330
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.spec.ts +393 -393
- package/src/_modules/local-vector-search/_services/lvs-vector-pool.control-service.ts +220 -220
- package/src/_modules/local-vector-search/index.ts +11 -11
- package/src/_modules/messaging/README.md +354 -354
- package/src/_modules/messaging/_collections/get-messaging-routing-module.util.ts +26 -26
- package/src/_modules/messaging/_collections/msg-global-settings.const.ts +22 -22
- package/src/_modules/messaging/_collections/msg.util.spec.ts +226 -226
- package/src/_modules/messaging/_models/msg-global-settings.interface.ts +37 -37
- package/src/_modules/messaging/_services/msg-conversation.data-service.ts +146 -146
- package/src/_modules/messaging/_services/msg-events.service.spec.ts +219 -219
- package/src/_modules/messaging/_services/msg-events.service.ts +267 -267
- package/src/_modules/messaging/_services/msg-integration.control-service.ts +179 -179
- package/src/_modules/messaging/_services/msg-main.control-service.spec.ts +147 -147
- package/src/_modules/messaging/_services/msg-main.control-service.ts +571 -571
- package/src/_modules/messaging/_services/msg-message.data-service.ts +129 -129
- package/src/_modules/messaging/_services/msg.controller.spec.ts +201 -201
- package/src/_modules/messaging/index.ts +30 -30
- package/src/_modules/mock/app-extended-server.mock.ts +201 -201
- package/src/_modules/mock/app-integration-test.mock.ts +51 -51
- package/src/_modules/mock/app-params.mock.spec.ts +21 -21
- package/src/_modules/mock/app-params.mock.ts +9 -9
- package/src/_modules/mock/app-server.mock.ts +188 -188
- package/src/_modules/mock/auth-service.mock.spec.ts +47 -47
- package/src/_modules/mock/auth-service.mock.ts +28 -28
- package/src/_modules/mock/controller.mock.spec.ts +26 -26
- package/src/_modules/mock/controller.mock.ts +16 -16
- package/src/_modules/mock/data-model.mock.spec.ts +111 -111
- package/src/_modules/mock/data-model.mock.ts +82 -82
- package/src/_modules/mock/email-service-collection.mock.spec.ts +24 -24
- package/src/_modules/mock/email-service-collection.mock.ts +15 -15
- package/src/_modules/mock/email-service.mock.spec.ts +17 -17
- package/src/_modules/mock/email-service.mock.ts +20 -20
- package/src/_modules/mock/email-template.mock.html +14 -14
- package/src/_modules/mock/endpoint.mock.ts +91 -91
- package/src/_modules/mock/socket-client.mock.spec.ts +40 -40
- package/src/_modules/mock/socket-client.mock.ts +45 -45
- package/src/_modules/mock/socket-server.mock.spec.ts +44 -44
- package/src/_modules/mock/socket-server.mock.ts +46 -46
- package/src/_modules/oauth2/_routes/oauth2.controller.spec.ts +107 -107
- package/src/_modules/oauth2/_routes/oauth2.controller.ts +98 -98
- package/src/_modules/oauth2/_services/oauth2.auth-service.spec.ts +254 -254
- package/src/_modules/oauth2/_services/oauth2.auth-service.ts +232 -232
- package/src/_modules/oauth2/_services/oauth2.control-service.spec.ts +585 -585
- package/src/_modules/oauth2/_services/oauth2.control-service.ts +653 -653
- package/src/_modules/oauth2/index.ts +17 -17
- package/src/_modules/server/errors/errors.control-service.spec.ts +230 -230
- package/src/_modules/server/errors/errors.control-service.ts +69 -69
- package/src/_modules/server/errors/errors.controller.spec.ts +165 -165
- package/src/_modules/server/errors/errors.controller.ts +270 -270
- package/src/_modules/server/errors/errors.data-service.spec.ts +355 -355
- package/src/_modules/server/index.ts +30 -30
- package/src/_modules/server/server-status/server-status-snapshot.control-service.spec.ts +70 -70
- package/src/_modules/server/server-status/server-status-snapshot.control-service.ts +17 -17
- package/src/_modules/server/server-status/server-status-snapshot.data-service.spec.ts +77 -77
- package/src/_modules/server/server-status/server-status-snapshot.data-service.ts +37 -37
- package/src/_modules/server/server-status/server-status.control-service.spec.ts +516 -516
- package/src/_modules/server/server-status/server-status.control-service.ts +336 -336
- package/src/_modules/server/server-status/server-status.controller.spec.ts +156 -156
- package/src/_modules/server/server-status/server-status.controller.ts +131 -131
- package/src/_modules/socket/_enums/socket-security.enum.ts +11 -11
- package/src/_modules/socket/_models/socket-client-service-params.control-model.spec.ts +32 -32
- package/src/_modules/socket/_models/socket-client-service-params.control-model.ts +22 -22
- package/src/_modules/socket/_models/socket-presence.control-model.spec.ts +164 -164
- package/src/_modules/socket/_models/socket-presence.control-model.ts +210 -210
- package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +46 -46
- package/src/_modules/socket/_models/socket-server-service-params.control-model.ts +22 -22
- package/src/_modules/socket/_services/socket-client.service.spec.ts +15 -15
- package/src/_modules/socket/_services/socket-client.service.ts +260 -260
- package/src/_modules/socket/_services/socket-server.service.spec.ts +11 -11
- package/src/_modules/socket/app-extended.integration.spec.ts +85 -85
- package/src/_modules/socket/app-extended.server.ts +630 -630
- package/src/_modules/socket/index.ts +42 -42
- package/src/_modules/test/get-test-routing-module.util.spec.ts +28 -28
- package/src/_modules/test/get-test-routing-module.util.ts +23 -23
- package/src/_modules/test/index.ts +11 -11
- package/src/_modules/test/test.controller.spec.ts +72 -72
- package/src/_modules/test/test.controller.ts +115 -115
- package/src/_modules/usage/get-usage-routing-module.util.ts +22 -22
- package/src/_modules/usage/index.ts +15 -15
- package/src/_modules/usage/usage.controller.spec.ts +81 -81
- package/src/_modules/usage/usage.controller.ts +126 -126
- package/src/_modules/usage/usage.data-service.spec.ts +332 -332
- package/src/_modules/usage/usage.data-service.ts +185 -185
- package/src/_services/base/api.service-base.spec.ts +125 -125
- package/src/_services/base/api.service-base.ts +74 -74
- package/src/_services/base/archive-data.service.spec.ts +196 -196
- package/src/_services/base/archive-data.service.ts +216 -216
- package/src/_services/base/data.service.spec.ts +493 -493
- package/src/_services/base/data.service.ts +2525 -2525
- package/src/_services/base/db.service.spec.ts +73 -73
- package/src/_services/base/db.service.ts +1575 -1575
- package/src/_services/base/singleton.service-base.spec.ts +28 -28
- package/src/_services/base/singleton.service-base.ts +24 -24
- package/src/_services/base/singleton.service.spec.ts +114 -114
- package/src/_services/base/singleton.service.ts +38 -38
- package/src/_services/core/api.service.spec.ts +140 -140
- package/src/_services/core/auth.service.spec.ts +159 -159
- package/src/_services/core/auth.service.ts +174 -174
- package/src/_services/core/email.service.spec.ts +85 -85
- package/src/_services/core/email.service.ts +742 -742
- package/src/_services/core/global.service.spec.ts +275 -275
- package/src/_services/core/global.service.ts +461 -461
- package/src/_services/core/service-collection.service.spec.ts +46 -46
- package/src/_services/core/service-collection.service.ts +6 -6
- package/src/_services/route/controller.service.spec.ts +53 -53
- package/src/_services/route/controller.service.ts +148 -148
- package/src/_services/route/routing-module.service.spec.ts +98 -98
- package/src/_services/route/routing-module.service.ts +330 -330
- package/src/_services/shared.static-service.spec.ts +99 -99
- package/src/_services/shared.static-service.ts +78 -78
- package/src/index.ts +94 -94
- package/tsconfig.app.json +12 -12
- package/tsconfig.json +42 -42
- package/build/_modules/logs/get-logs-routing-module.util.d.ts +0 -19
- package/build/_modules/logs/get-logs-routing-module.util.d.ts.map +0 -1
- package/build/_modules/logs/get-logs-routing-module.util.js +0 -32
- package/build/_modules/logs/get-logs-routing-module.util.js.map +0 -1
- package/build/_modules/logs/index.d.ts +0 -4
- package/build/_modules/logs/index.d.ts.map +0 -1
- package/build/_modules/logs/index.js +0 -10
- package/build/_modules/logs/index.js.map +0 -1
- package/build/_modules/logs/log-buffer.service.d.ts +0 -38
- package/build/_modules/logs/log-buffer.service.d.ts.map +0 -1
- package/build/_modules/logs/log-buffer.service.js +0 -97
- package/build/_modules/logs/log-buffer.service.js.map +0 -1
- package/build/_modules/logs/logs.controller.d.ts +0 -27
- package/build/_modules/logs/logs.controller.d.ts.map +0 -1
- package/build/_modules/logs/logs.controller.js +0 -90
- package/build/_modules/logs/logs.controller.js.map +0 -1
- package/build/_modules/logs/logs.service.d.ts +0 -40
- package/build/_modules/logs/logs.service.d.ts.map +0 -1
- package/build/_modules/logs/logs.service.js +0 -97
- package/build/_modules/logs/logs.service.js.map +0 -1
- package/src/_modules/logs/get-logs-routing-module.util.ts +0 -36
- package/src/_modules/logs/index.ts +0 -3
- package/src/_modules/logs/log-buffer.service.ts +0 -101
- package/src/_modules/logs/logs.controller.ts +0 -109
- package/src/_modules/logs/logs.service.ts +0 -100
|
@@ -1,250 +1,250 @@
|
|
|
1
|
-
|
|
2
|
-
import { DyNTS_AI_LLM_ServiceBase } from './ai-llm.service-base';
|
|
3
|
-
import { DyFM_AI_CallSettings, DyFM_AI_MessageRole } from '@futdevpro/fsm-dynamo/ai';
|
|
4
|
-
import { DyFM_Log, DyFM_Object } from '@futdevpro/fsm-dynamo';
|
|
5
|
-
|
|
6
|
-
class TestLLMService extends DyNTS_AI_LLM_ServiceBase<DyFM_AI_CallSettings> {
|
|
7
|
-
readonly aiProvider: any = {} as any;
|
|
8
|
-
readonly capabilities: any = {} as any;
|
|
9
|
-
setup = (config: any): void => {};
|
|
10
|
-
testConnection = async (issuer: string): Promise<boolean> => true;
|
|
11
|
-
readonly defaultSettings: DyFM_AI_CallSettings = {
|
|
12
|
-
systemPrompt: 'Test system prompt',
|
|
13
|
-
useModel: 'test-model',
|
|
14
|
-
debugLog: false,
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
readonly predefinedRequests = {
|
|
18
|
-
yesNo: {
|
|
19
|
-
upperCaseYes: 'YES',
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
requestSimpleMessage = async (set: any): Promise<string> => { return ''; };
|
|
24
|
-
requestYesNo = async (set: any): Promise<boolean> => { return false; };
|
|
25
|
-
requestPercentage = async (set: any): Promise<number> => { return 0; };
|
|
26
|
-
requestSelect = async <T>(set: any): Promise<T | { unparsableResult: string }> => { return null as any; };
|
|
27
|
-
requestMultiselect = async <T>(set: any): Promise<T[] | { unparsableResult: string }> => { return []; };
|
|
28
|
-
requestJSON = async <T>(set: any): Promise<T | { unparsableResult: string }> => { return null as any; };
|
|
29
|
-
requestJSONQuestionWithKeysDescription = async <T>(set: any): Promise<T | { unparsableResult: string }> => { return null as any; };
|
|
30
|
-
requestJSONWithExactKeys = async <T>(set: any): Promise<T | { unparsableResult: string }> => { return null as any; };
|
|
31
|
-
requestList = async <T>(set: any): Promise<T[] | { unparsableResult: string }> => { return []; };
|
|
32
|
-
|
|
33
|
-
static getInstance(): TestLLMService {
|
|
34
|
-
return TestLLMService.getSingletonInstance();
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
describe('| DyNTS_AI_LLM_ServiceBase', () => {
|
|
39
|
-
let service: TestLLMService;
|
|
40
|
-
|
|
41
|
-
beforeEach(() => {
|
|
42
|
-
service = TestLLMService.getInstance();
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('| should be a singleton instance', () => {
|
|
46
|
-
const instance1 = TestLLMService.getInstance();
|
|
47
|
-
const instance2 = TestLLMService.getInstance();
|
|
48
|
-
|
|
49
|
-
expect(instance1).toBe(instance2);
|
|
50
|
-
expect(instance1).toBeInstanceOf(TestLLMService);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
describe('| defaultSystemPrompt', () => {
|
|
54
|
-
it('| should return system prompt from default settings', () => {
|
|
55
|
-
expect(service.defaultSystemPrompt).toBe('Test system prompt');
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
describe('| defaultModel', () => {
|
|
60
|
-
it('| should return model from default settings', () => {
|
|
61
|
-
expect(service.defaultModel).toBe('test-model');
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
describe('| debugLog', () => {
|
|
66
|
-
it('| should return debugLog from default settings', () => {
|
|
67
|
-
expect(service.debugLog).toBe(false);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it('| should return _debugLog when defaultSettings debugLog is not set', () => {
|
|
71
|
-
const serviceWithoutDebugLog = new (class extends TestLLMService {
|
|
72
|
-
override readonly defaultSettings: DyFM_AI_CallSettings = {
|
|
73
|
-
systemPrompt: 'Test',
|
|
74
|
-
useModel: 'test',
|
|
75
|
-
};
|
|
76
|
-
override readonly aiProvider: any = {} as any;
|
|
77
|
-
override readonly capabilities: any = {} as any;
|
|
78
|
-
override setup = (config: any): void => {};
|
|
79
|
-
override testConnection = async (issuer: string): Promise<boolean> => true;
|
|
80
|
-
} as any)();
|
|
81
|
-
|
|
82
|
-
// Set _debugLog on the new instance
|
|
83
|
-
serviceWithoutDebugLog._debugLog = true;
|
|
84
|
-
expect(serviceWithoutDebugLog.debugLog).toBe(true);
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
describe('| convertAnswerToBoolean', () => {
|
|
89
|
-
it('| should return true when answer contains YES', () => {
|
|
90
|
-
const result = (service as any).convertAnswerToBoolean('YES');
|
|
91
|
-
|
|
92
|
-
expect(result).toBe(true);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it('| should return true when answer contains yes in uppercase', () => {
|
|
96
|
-
const result = (service as any).convertAnswerToBoolean('The answer is YES');
|
|
97
|
-
|
|
98
|
-
expect(result).toBe(true);
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
it('| should return false when answer does not contain YES', () => {
|
|
102
|
-
const result = (service as any).convertAnswerToBoolean('NO');
|
|
103
|
-
|
|
104
|
-
expect(result).toBe(false);
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it('| should be case insensitive', () => {
|
|
108
|
-
const result = (service as any).convertAnswerToBoolean('yes');
|
|
109
|
-
|
|
110
|
-
expect(result).toBe(true);
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
describe('| convertAnswerToNumber', () => {
|
|
115
|
-
it('| should return number when answer is valid', () => {
|
|
116
|
-
const result = (service as any).convertAnswerToNumber('42', 'What is the answer?');
|
|
117
|
-
|
|
118
|
-
expect(result).toBe(42);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('| should return null when answer is invalid (contains skip flag)', () => {
|
|
122
|
-
spyOn(service as any, 'isAnswerValid').and.returnValue(true);
|
|
123
|
-
|
|
124
|
-
const result = (service as any).convertAnswerToNumber('42', 'What is the answer?');
|
|
125
|
-
|
|
126
|
-
expect(result).toBeNull();
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it('| should return null when answer is NaN', () => {
|
|
130
|
-
const logSpy = spyOn(DyFM_Log, 'T_error');
|
|
131
|
-
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
132
|
-
|
|
133
|
-
const result = (service as any).convertAnswerToNumber('not-a-number', 'What is the answer?');
|
|
134
|
-
|
|
135
|
-
expect(result).toBeNull();
|
|
136
|
-
expect(logSpy).toHaveBeenCalled();
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it('| should handle decimal numbers', () => {
|
|
140
|
-
const result = (service as any).convertAnswerToNumber('42.5', 'What is the answer?');
|
|
141
|
-
|
|
142
|
-
expect(result).toBe(42.5);
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
describe('| convertAnswerToSelectOption', () => {
|
|
147
|
-
it('| should return selected option when found', () => {
|
|
148
|
-
const options = ['option1', 'option2', 'option3'];
|
|
149
|
-
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
150
|
-
spyOn(service as any, 'stringifySelectOptions').and.returnValue(['option1', 'option2', 'option3']);
|
|
151
|
-
|
|
152
|
-
const result = (service as any).convertAnswerToSelectOption('option1', 'Select an option', options);
|
|
153
|
-
|
|
154
|
-
expect(result).toBe('option1');
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it('| should return null when answer is invalid', () => {
|
|
158
|
-
spyOn(service as any, 'isAnswerValid').and.returnValue(true);
|
|
159
|
-
|
|
160
|
-
const result = (service as any).convertAnswerToSelectOption('option1', 'Select an option', ['option1']);
|
|
161
|
-
|
|
162
|
-
expect(result).toBeNull();
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
it('| should return null when option not found', () => {
|
|
166
|
-
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
167
|
-
spyOn(service as any, 'stringifySelectOptions').and.returnValue(['option1', 'option2']);
|
|
168
|
-
|
|
169
|
-
const result = (service as any).convertAnswerToSelectOption('option3', 'Select an option', ['option1', 'option2']);
|
|
170
|
-
|
|
171
|
-
expect(result).toBeNull();
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
it('| should handle JSON options', () => {
|
|
175
|
-
const options = [{ id: 1, name: 'test' }];
|
|
176
|
-
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
177
|
-
spyOn(service as any, 'stringifySelectOptions').and.returnValue([JSON.stringify({ id: 1, name: 'test' })]);
|
|
178
|
-
spyOn(DyFM_Object, 'safeParseJSON').and.returnValue({ id: 1, name: 'test' });
|
|
179
|
-
|
|
180
|
-
const result = (service as any).convertAnswerToSelectOption(
|
|
181
|
-
JSON.stringify({ id: 1, name: 'test' }),
|
|
182
|
-
'Select an option',
|
|
183
|
-
options
|
|
184
|
-
);
|
|
185
|
-
|
|
186
|
-
expect(result).toEqual({ id: 1, name: 'test' });
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
describe('| convertAnswerToSelectOptions', () => {
|
|
191
|
-
it('| should return multiple selected options', () => {
|
|
192
|
-
const options = ['option1', 'option2', 'option3'];
|
|
193
|
-
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
194
|
-
spyOn(service as any, 'stringifySelectOption').and.callFake((opt: string) => opt);
|
|
195
|
-
|
|
196
|
-
const result = (service as any).convertAnswerToSelectOptions('option1 and option2', 'Select options', options);
|
|
197
|
-
|
|
198
|
-
expect(result).toEqual(['option1', 'option2']);
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it('| should return null when answer is invalid', () => {
|
|
202
|
-
spyOn(service as any, 'isAnswerValid').and.returnValue(true);
|
|
203
|
-
|
|
204
|
-
const result = (service as any).convertAnswerToSelectOptions('option1', 'Select options', ['option1']);
|
|
205
|
-
|
|
206
|
-
expect(result).toBeNull();
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
it('| should return empty array when no options match', () => {
|
|
210
|
-
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
211
|
-
spyOn(service as any, 'stringifySelectOption').and.callFake((opt: string) => opt);
|
|
212
|
-
|
|
213
|
-
const result = (service as any).convertAnswerToSelectOptions('option4', 'Select options', ['option1', 'option2']);
|
|
214
|
-
|
|
215
|
-
expect(result).toEqual([]);
|
|
216
|
-
});
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
describe('| convertAnswerToJSON', () => {
|
|
220
|
-
it('| should return parsed JSON when valid', () => {
|
|
221
|
-
const jsonString = '{"key": "value"}';
|
|
222
|
-
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
223
|
-
spyOn(DyFM_Object, 'safeParseJSON').and.returnValue({ key: 'value' });
|
|
224
|
-
|
|
225
|
-
const result = (service as any).convertAnswerToJSON(jsonString, 'Enter JSON') as { key: string };
|
|
226
|
-
|
|
227
|
-
expect(result).toEqual({ key: 'value' });
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
it('| should return unparsableResult when answer is invalid', () => {
|
|
231
|
-
spyOn(service as any, 'isAnswerValid').and.returnValue(true);
|
|
232
|
-
|
|
233
|
-
const result = (service as any).convertAnswerToJSON('{"key": "value"}', 'Enter JSON');
|
|
234
|
-
|
|
235
|
-
expect(result).toEqual({ unparsableResult: '{"key": "value"}' });
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
it('| should return unparsableResult when JSON is invalid', () => {
|
|
239
|
-
const logSpy = spyOn(DyFM_Log, 'T_error');
|
|
240
|
-
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
241
|
-
spyOn(DyFM_Object, 'safeParseJSON').and.returnValue({ unparsableResult: 'invalid json' });
|
|
242
|
-
|
|
243
|
-
const result = (service as any).convertAnswerToJSON('invalid json', 'Enter JSON');
|
|
244
|
-
|
|
245
|
-
expect(result).toEqual({ unparsableResult: 'invalid json' });
|
|
246
|
-
expect(logSpy).toHaveBeenCalled();
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
});
|
|
250
|
-
|
|
1
|
+
|
|
2
|
+
import { DyNTS_AI_LLM_ServiceBase } from './ai-llm.service-base';
|
|
3
|
+
import { DyFM_AI_CallSettings, DyFM_AI_MessageRole } from '@futdevpro/fsm-dynamo/ai';
|
|
4
|
+
import { DyFM_Log, DyFM_Object } from '@futdevpro/fsm-dynamo';
|
|
5
|
+
|
|
6
|
+
class TestLLMService extends DyNTS_AI_LLM_ServiceBase<DyFM_AI_CallSettings> {
|
|
7
|
+
readonly aiProvider: any = {} as any;
|
|
8
|
+
readonly capabilities: any = {} as any;
|
|
9
|
+
setup = (config: any): void => {};
|
|
10
|
+
testConnection = async (issuer: string): Promise<boolean> => true;
|
|
11
|
+
readonly defaultSettings: DyFM_AI_CallSettings = {
|
|
12
|
+
systemPrompt: 'Test system prompt',
|
|
13
|
+
useModel: 'test-model',
|
|
14
|
+
debugLog: false,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
readonly predefinedRequests = {
|
|
18
|
+
yesNo: {
|
|
19
|
+
upperCaseYes: 'YES',
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
requestSimpleMessage = async (set: any): Promise<string> => { return ''; };
|
|
24
|
+
requestYesNo = async (set: any): Promise<boolean> => { return false; };
|
|
25
|
+
requestPercentage = async (set: any): Promise<number> => { return 0; };
|
|
26
|
+
requestSelect = async <T>(set: any): Promise<T | { unparsableResult: string }> => { return null as any; };
|
|
27
|
+
requestMultiselect = async <T>(set: any): Promise<T[] | { unparsableResult: string }> => { return []; };
|
|
28
|
+
requestJSON = async <T>(set: any): Promise<T | { unparsableResult: string }> => { return null as any; };
|
|
29
|
+
requestJSONQuestionWithKeysDescription = async <T>(set: any): Promise<T | { unparsableResult: string }> => { return null as any; };
|
|
30
|
+
requestJSONWithExactKeys = async <T>(set: any): Promise<T | { unparsableResult: string }> => { return null as any; };
|
|
31
|
+
requestList = async <T>(set: any): Promise<T[] | { unparsableResult: string }> => { return []; };
|
|
32
|
+
|
|
33
|
+
static getInstance(): TestLLMService {
|
|
34
|
+
return TestLLMService.getSingletonInstance();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
describe('| DyNTS_AI_LLM_ServiceBase', () => {
|
|
39
|
+
let service: TestLLMService;
|
|
40
|
+
|
|
41
|
+
beforeEach(() => {
|
|
42
|
+
service = TestLLMService.getInstance();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('| should be a singleton instance', () => {
|
|
46
|
+
const instance1 = TestLLMService.getInstance();
|
|
47
|
+
const instance2 = TestLLMService.getInstance();
|
|
48
|
+
|
|
49
|
+
expect(instance1).toBe(instance2);
|
|
50
|
+
expect(instance1).toBeInstanceOf(TestLLMService);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
describe('| defaultSystemPrompt', () => {
|
|
54
|
+
it('| should return system prompt from default settings', () => {
|
|
55
|
+
expect(service.defaultSystemPrompt).toBe('Test system prompt');
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
describe('| defaultModel', () => {
|
|
60
|
+
it('| should return model from default settings', () => {
|
|
61
|
+
expect(service.defaultModel).toBe('test-model');
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
describe('| debugLog', () => {
|
|
66
|
+
it('| should return debugLog from default settings', () => {
|
|
67
|
+
expect(service.debugLog).toBe(false);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('| should return _debugLog when defaultSettings debugLog is not set', () => {
|
|
71
|
+
const serviceWithoutDebugLog = new (class extends TestLLMService {
|
|
72
|
+
override readonly defaultSettings: DyFM_AI_CallSettings = {
|
|
73
|
+
systemPrompt: 'Test',
|
|
74
|
+
useModel: 'test',
|
|
75
|
+
};
|
|
76
|
+
override readonly aiProvider: any = {} as any;
|
|
77
|
+
override readonly capabilities: any = {} as any;
|
|
78
|
+
override setup = (config: any): void => {};
|
|
79
|
+
override testConnection = async (issuer: string): Promise<boolean> => true;
|
|
80
|
+
} as any)();
|
|
81
|
+
|
|
82
|
+
// Set _debugLog on the new instance
|
|
83
|
+
serviceWithoutDebugLog._debugLog = true;
|
|
84
|
+
expect(serviceWithoutDebugLog.debugLog).toBe(true);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
describe('| convertAnswerToBoolean', () => {
|
|
89
|
+
it('| should return true when answer contains YES', () => {
|
|
90
|
+
const result = (service as any).convertAnswerToBoolean('YES');
|
|
91
|
+
|
|
92
|
+
expect(result).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('| should return true when answer contains yes in uppercase', () => {
|
|
96
|
+
const result = (service as any).convertAnswerToBoolean('The answer is YES');
|
|
97
|
+
|
|
98
|
+
expect(result).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('| should return false when answer does not contain YES', () => {
|
|
102
|
+
const result = (service as any).convertAnswerToBoolean('NO');
|
|
103
|
+
|
|
104
|
+
expect(result).toBe(false);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('| should be case insensitive', () => {
|
|
108
|
+
const result = (service as any).convertAnswerToBoolean('yes');
|
|
109
|
+
|
|
110
|
+
expect(result).toBe(true);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
describe('| convertAnswerToNumber', () => {
|
|
115
|
+
it('| should return number when answer is valid', () => {
|
|
116
|
+
const result = (service as any).convertAnswerToNumber('42', 'What is the answer?');
|
|
117
|
+
|
|
118
|
+
expect(result).toBe(42);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('| should return null when answer is invalid (contains skip flag)', () => {
|
|
122
|
+
spyOn(service as any, 'isAnswerValid').and.returnValue(true);
|
|
123
|
+
|
|
124
|
+
const result = (service as any).convertAnswerToNumber('42', 'What is the answer?');
|
|
125
|
+
|
|
126
|
+
expect(result).toBeNull();
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('| should return null when answer is NaN', () => {
|
|
130
|
+
const logSpy = spyOn(DyFM_Log, 'T_error');
|
|
131
|
+
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
132
|
+
|
|
133
|
+
const result = (service as any).convertAnswerToNumber('not-a-number', 'What is the answer?');
|
|
134
|
+
|
|
135
|
+
expect(result).toBeNull();
|
|
136
|
+
expect(logSpy).toHaveBeenCalled();
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it('| should handle decimal numbers', () => {
|
|
140
|
+
const result = (service as any).convertAnswerToNumber('42.5', 'What is the answer?');
|
|
141
|
+
|
|
142
|
+
expect(result).toBe(42.5);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
describe('| convertAnswerToSelectOption', () => {
|
|
147
|
+
it('| should return selected option when found', () => {
|
|
148
|
+
const options = ['option1', 'option2', 'option3'];
|
|
149
|
+
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
150
|
+
spyOn(service as any, 'stringifySelectOptions').and.returnValue(['option1', 'option2', 'option3']);
|
|
151
|
+
|
|
152
|
+
const result = (service as any).convertAnswerToSelectOption('option1', 'Select an option', options);
|
|
153
|
+
|
|
154
|
+
expect(result).toBe('option1');
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it('| should return null when answer is invalid', () => {
|
|
158
|
+
spyOn(service as any, 'isAnswerValid').and.returnValue(true);
|
|
159
|
+
|
|
160
|
+
const result = (service as any).convertAnswerToSelectOption('option1', 'Select an option', ['option1']);
|
|
161
|
+
|
|
162
|
+
expect(result).toBeNull();
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('| should return null when option not found', () => {
|
|
166
|
+
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
167
|
+
spyOn(service as any, 'stringifySelectOptions').and.returnValue(['option1', 'option2']);
|
|
168
|
+
|
|
169
|
+
const result = (service as any).convertAnswerToSelectOption('option3', 'Select an option', ['option1', 'option2']);
|
|
170
|
+
|
|
171
|
+
expect(result).toBeNull();
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('| should handle JSON options', () => {
|
|
175
|
+
const options = [{ id: 1, name: 'test' }];
|
|
176
|
+
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
177
|
+
spyOn(service as any, 'stringifySelectOptions').and.returnValue([JSON.stringify({ id: 1, name: 'test' })]);
|
|
178
|
+
spyOn(DyFM_Object, 'safeParseJSON').and.returnValue({ id: 1, name: 'test' });
|
|
179
|
+
|
|
180
|
+
const result = (service as any).convertAnswerToSelectOption(
|
|
181
|
+
JSON.stringify({ id: 1, name: 'test' }),
|
|
182
|
+
'Select an option',
|
|
183
|
+
options
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
expect(result).toEqual({ id: 1, name: 'test' });
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
describe('| convertAnswerToSelectOptions', () => {
|
|
191
|
+
it('| should return multiple selected options', () => {
|
|
192
|
+
const options = ['option1', 'option2', 'option3'];
|
|
193
|
+
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
194
|
+
spyOn(service as any, 'stringifySelectOption').and.callFake((opt: string) => opt);
|
|
195
|
+
|
|
196
|
+
const result = (service as any).convertAnswerToSelectOptions('option1 and option2', 'Select options', options);
|
|
197
|
+
|
|
198
|
+
expect(result).toEqual(['option1', 'option2']);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it('| should return null when answer is invalid', () => {
|
|
202
|
+
spyOn(service as any, 'isAnswerValid').and.returnValue(true);
|
|
203
|
+
|
|
204
|
+
const result = (service as any).convertAnswerToSelectOptions('option1', 'Select options', ['option1']);
|
|
205
|
+
|
|
206
|
+
expect(result).toBeNull();
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
it('| should return empty array when no options match', () => {
|
|
210
|
+
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
211
|
+
spyOn(service as any, 'stringifySelectOption').and.callFake((opt: string) => opt);
|
|
212
|
+
|
|
213
|
+
const result = (service as any).convertAnswerToSelectOptions('option4', 'Select options', ['option1', 'option2']);
|
|
214
|
+
|
|
215
|
+
expect(result).toEqual([]);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
describe('| convertAnswerToJSON', () => {
|
|
220
|
+
it('| should return parsed JSON when valid', () => {
|
|
221
|
+
const jsonString = '{"key": "value"}';
|
|
222
|
+
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
223
|
+
spyOn(DyFM_Object, 'safeParseJSON').and.returnValue({ key: 'value' });
|
|
224
|
+
|
|
225
|
+
const result = (service as any).convertAnswerToJSON(jsonString, 'Enter JSON') as { key: string };
|
|
226
|
+
|
|
227
|
+
expect(result).toEqual({ key: 'value' });
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
it('| should return unparsableResult when answer is invalid', () => {
|
|
231
|
+
spyOn(service as any, 'isAnswerValid').and.returnValue(true);
|
|
232
|
+
|
|
233
|
+
const result = (service as any).convertAnswerToJSON('{"key": "value"}', 'Enter JSON');
|
|
234
|
+
|
|
235
|
+
expect(result).toEqual({ unparsableResult: '{"key": "value"}' });
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
it('| should return unparsableResult when JSON is invalid', () => {
|
|
239
|
+
const logSpy = spyOn(DyFM_Log, 'T_error');
|
|
240
|
+
spyOn(service as any, 'isAnswerValid').and.returnValue(false);
|
|
241
|
+
spyOn(DyFM_Object, 'safeParseJSON').and.returnValue({ unparsableResult: 'invalid json' });
|
|
242
|
+
|
|
243
|
+
const result = (service as any).convertAnswerToJSON('invalid json', 'Enter JSON');
|
|
244
|
+
|
|
245
|
+
expect(result).toEqual({ unparsableResult: 'invalid json' });
|
|
246
|
+
expect(logSpy).toHaveBeenCalled();
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
|