@loop_ouroboros/mcp-hub-lite 1.0.2 → 1.1.1
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/CHANGELOG.md +32 -0
- package/dist/client/assets/{HomeView-7rMg9C6t.js → HomeView-BBwvy1oj.js} +1 -1
- package/dist/client/assets/ResourceDetailView-CZ2aB73w.js +1 -0
- package/dist/client/assets/ResourceDetailView-DUJZbegl.css +1 -0
- package/dist/client/assets/ResourcesView-CN1NlhWs.js +1 -0
- package/dist/client/assets/ResourcesView-Cc8RHtia.css +1 -0
- package/dist/client/assets/ServerDashboard-BfLeFDGw.css +1 -0
- package/dist/client/assets/ServerDashboard-k652Vw4Z.js +1 -0
- package/dist/client/assets/ServerDetail-BLQ-a4cO.js +2 -0
- package/dist/client/assets/ServerDetail-CtnNKJGx.css +1 -0
- package/dist/client/assets/{ServerListView-Bws09jNR.css → ServerListView-B-bPljsO.css} +1 -1
- package/dist/client/assets/ServerListView-BHrsFD5i.js +36 -0
- package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHhwEuGe.js +1 -0
- package/dist/client/assets/SettingsView-CUOFNXrz.js +1 -0
- package/dist/client/assets/SettingsView-GkBOKL0V.css +1 -0
- package/dist/client/assets/ToolCallDialog-BfPjLxfV.js +1 -0
- package/dist/client/assets/ToolsView-BxgXvPC3.css +1 -0
- package/dist/client/assets/ToolsView-CyuhYAE2.js +1 -0
- package/dist/client/assets/{_baseClone-5q1b0P3O.js → _baseClone-DO5qfalW.js} +1 -1
- package/dist/client/assets/el-form-item-B4LbJ6OO.css +1 -0
- package/dist/client/assets/el-form-item-CcGsD2K_.js +12 -0
- package/dist/client/assets/el-input-BH4BZKnG.css +1 -0
- package/dist/client/assets/el-input-tYgeiaCT.js +1 -0
- package/dist/client/assets/{el-loading-H85n3BUC.js → el-loading-Dwl9E_Vr.js} +1 -1
- package/dist/client/assets/{el-select-C0U_l4IZ.css → el-overlay-CBvdpA69.css} +1 -1
- package/dist/client/assets/el-overlay-kqX_BABo.js +1 -0
- package/dist/client/assets/{ResourceDetailView-BdOaL_-o.css → el-radio-group-B0bauIRR.css} +1 -1
- package/dist/client/assets/el-radio-group-D8aWBVOT.js +1 -0
- package/dist/client/assets/el-skeleton-item-BLY1jEuR.css +1 -0
- package/dist/client/assets/el-skeleton-item-BRwIFspE.js +1 -0
- package/dist/client/assets/el-switch-BBrS-_6y.css +1 -0
- package/dist/client/assets/el-switch-BF8c-xeU.js +1 -0
- package/dist/client/assets/el-tab-pane-C4Ep94cd.js +1 -0
- package/dist/client/assets/el-table-column-BdvRS9Y2.css +1 -0
- package/dist/client/assets/el-table-column-Cog6uCh-.js +1 -0
- package/dist/client/assets/index-ByNBhPAR.js +1 -0
- package/dist/client/assets/index-CTB6oe-9.js +2 -0
- package/dist/client/assets/{index-BsDWtoIl.css → index-DpH6ZSbs.css} +1 -1
- package/dist/client/assets/omit-CUnDT6sS.js +1 -0
- package/dist/client/assets/{raf-DY5mgbuB.js → raf-CmzeRPMd.js} +1 -1
- package/dist/client/assets/{vue-vendor-6ny5zj9i.js → vue-vendor-CbgVSHIh.js} +3 -3
- package/dist/client/index.html +3 -3
- package/dist/server/shared/models/resource.model.d.ts +2 -1
- package/dist/server/shared/models/resource.model.d.ts.map +1 -1
- package/dist/server/shared/models/server.model.d.ts +362 -5
- package/dist/server/shared/models/server.model.d.ts.map +1 -1
- package/dist/server/shared/models/server.model.js +220 -1
- package/dist/server/shared/models/session.model.d.ts +1 -57
- package/dist/server/shared/models/session.model.d.ts.map +1 -1
- package/dist/server/shared/models/session.model.js +1 -55
- package/dist/server/shared/models/tool.model.d.ts +4 -2
- package/dist/server/shared/models/tool.model.d.ts.map +1 -1
- package/dist/server/shared/types/session-context.types.d.ts +0 -2
- package/dist/server/shared/types/session-context.types.d.ts.map +1 -1
- package/dist/server/shared/types/websocket.types.d.ts +17 -10
- package/dist/server/shared/types/websocket.types.d.ts.map +1 -1
- package/dist/server/src/api/mcp/debug-response-wrapper.js +2 -2
- package/dist/server/src/api/mcp/gateway.d.ts +1 -3
- package/dist/server/src/api/mcp/gateway.d.ts.map +1 -1
- package/dist/server/src/api/mcp/gateway.js +32 -49
- package/dist/server/src/api/web/hub-tools.d.ts +2 -2
- package/dist/server/src/api/web/hub-tools.d.ts.map +1 -1
- package/dist/server/src/api/web/hub-tools.js +3 -54
- package/dist/server/src/api/web/mcp-status.d.ts +1 -1
- package/dist/server/src/api/web/mcp-status.d.ts.map +1 -1
- package/dist/server/src/api/web/mcp-status.js +71 -30
- package/dist/server/src/api/web/resources.d.ts.map +1 -1
- package/dist/server/src/api/web/resources.js +28 -22
- package/dist/server/src/api/web/search.d.ts +2 -16
- package/dist/server/src/api/web/search.d.ts.map +1 -1
- package/dist/server/src/api/web/search.js +24 -45
- package/dist/server/src/api/web/servers.d.ts +3 -3
- package/dist/server/src/api/web/servers.d.ts.map +1 -1
- package/dist/server/src/api/web/servers.js +70 -25
- package/dist/server/src/api/ws/ws-handler.d.ts.map +1 -1
- package/dist/server/src/api/ws/ws-handler.js +4 -2
- package/dist/server/src/app.d.ts.map +1 -1
- package/dist/server/src/app.js +0 -2
- package/dist/server/src/cli/commands/list.js +2 -2
- package/dist/server/src/cli/commands/server.d.ts +57 -0
- package/dist/server/src/cli/commands/server.d.ts.map +1 -0
- package/dist/server/src/cli/commands/server.js +169 -0
- package/dist/server/src/cli/commands/status.d.ts.map +1 -1
- package/dist/server/src/cli/commands/status.js +41 -30
- package/dist/server/src/cli/index.d.ts.map +1 -1
- package/dist/server/src/cli/index.js +2 -1
- package/dist/server/src/cli/server.d.ts +11 -2
- package/dist/server/src/cli/server.d.ts.map +1 -1
- package/dist/server/src/config/config-change-logger.d.ts +22 -0
- package/dist/server/src/config/config-change-logger.d.ts.map +1 -1
- package/dist/server/src/config/config-change-logger.js +135 -11
- package/dist/server/src/config/config-loader.d.ts +6 -5
- package/dist/server/src/config/config-loader.d.ts.map +1 -1
- package/dist/server/src/config/config-loader.js +54 -16
- package/dist/server/src/config/config-manager.d.ts +51 -43
- package/dist/server/src/config/config-manager.d.ts.map +1 -1
- package/dist/server/src/config/config-manager.js +84 -66
- package/dist/server/src/config/config-migrator.d.ts +82 -0
- package/dist/server/src/config/config-migrator.d.ts.map +1 -0
- package/dist/server/src/config/config-migrator.js +348 -0
- package/dist/server/src/config/config-saver.d.ts +2 -0
- package/dist/server/src/config/config-saver.d.ts.map +1 -1
- package/dist/server/src/config/config-saver.js +8 -2
- package/dist/server/src/config/config.schema.d.ts +10 -104
- package/dist/server/src/config/config.schema.d.ts.map +1 -1
- package/dist/server/src/config/config.schema.js +15 -99
- package/dist/server/src/config/path-validator.d.ts +27 -0
- package/dist/server/src/config/path-validator.d.ts.map +1 -0
- package/dist/server/src/config/path-validator.js +53 -0
- package/dist/server/src/config/server-config-manager.d.ts +37 -31
- package/dist/server/src/config/server-config-manager.d.ts.map +1 -1
- package/dist/server/src/config/server-config-manager.js +222 -66
- package/dist/server/src/config/type-converter.d.ts.map +1 -1
- package/dist/server/src/config/type-converter.js +3 -2
- package/dist/server/src/models/event.model.d.ts +17 -10
- package/dist/server/src/models/event.model.d.ts.map +1 -1
- package/dist/server/src/models/server.model.d.ts +17 -3
- package/dist/server/src/models/server.model.d.ts.map +1 -1
- package/dist/server/src/models/server.model.js +2 -1
- package/dist/server/src/models/system-tools.constants.d.ts +10 -27
- package/dist/server/src/models/system-tools.constants.d.ts.map +1 -1
- package/dist/server/src/models/system-tools.constants.js +4 -8
- package/dist/server/src/pid/manager.d.ts.map +1 -1
- package/dist/server/src/pid/manager.js +2 -1
- package/dist/server/src/server/dev-server.js +34 -20
- package/dist/server/src/server/runner.d.ts.map +1 -1
- package/dist/server/src/server/runner.js +41 -26
- package/dist/server/src/services/connection/connection-manager.d.ts +85 -103
- package/dist/server/src/services/connection/connection-manager.d.ts.map +1 -1
- package/dist/server/src/services/connection/connection-manager.js +286 -241
- package/dist/server/src/services/connection/tool-cache.d.ts +27 -25
- package/dist/server/src/services/connection/tool-cache.d.ts.map +1 -1
- package/dist/server/src/services/connection/tool-cache.js +50 -55
- package/dist/server/src/services/gateway/gateway.service.d.ts +2 -0
- package/dist/server/src/services/gateway/gateway.service.d.ts.map +1 -1
- package/dist/server/src/services/gateway/gateway.service.js +53 -23
- package/dist/server/src/services/gateway/global-transport.d.ts +19 -0
- package/dist/server/src/services/gateway/global-transport.d.ts.map +1 -0
- package/dist/server/src/services/gateway/global-transport.js +66 -0
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/call-tool-handler.js +67 -65
- package/dist/server/src/services/gateway/request-handlers/index.d.ts +1 -1
- package/dist/server/src/services/gateway/request-handlers/index.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/index.js +1 -1
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts +1 -4
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/initialize-handler.js +20 -80
- package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts +35 -0
- package/dist/server/src/services/gateway/request-handlers/initialize.constants.d.ts.map +1 -0
- package/dist/server/src/services/gateway/request-handlers/initialize.constants.js +44 -0
- package/dist/server/src/services/gateway/request-handlers/resources-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/resources-handler.js +5 -4
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.d.ts.map +1 -1
- package/dist/server/src/services/gateway/request-handlers/system-tools-handler.js +32 -77
- package/dist/server/src/services/gateway/tool-list-generator.d.ts.map +1 -1
- package/dist/server/src/services/gateway/tool-list-generator.js +37 -16
- package/dist/server/src/services/gateway/types.d.ts +2 -1
- package/dist/server/src/services/gateway/types.d.ts.map +1 -1
- package/dist/server/src/services/hub-manager.service.d.ts +32 -238
- package/dist/server/src/services/hub-manager.service.d.ts.map +1 -1
- package/dist/server/src/services/hub-manager.service.js +89 -267
- package/dist/server/src/services/hub-tools/index.d.ts +1 -3
- package/dist/server/src/services/hub-tools/index.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/index.js +1 -2
- package/dist/server/src/services/hub-tools/instance-matcher.d.ts +62 -0
- package/dist/server/src/services/hub-tools/instance-matcher.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/instance-matcher.js +132 -0
- package/dist/server/src/services/hub-tools/instance-selector.d.ts +29 -0
- package/dist/server/src/services/hub-tools/instance-selector.d.ts.map +1 -0
- package/dist/server/src/services/hub-tools/instance-selector.js +103 -0
- package/dist/server/src/services/hub-tools/resource-generator.d.ts +24 -1
- package/dist/server/src/services/hub-tools/resource-generator.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/resource-generator.js +259 -39
- package/dist/server/src/services/hub-tools/server-selector.d.ts +26 -13
- package/dist/server/src/services/hub-tools/server-selector.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/server-selector.js +44 -37
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts +1 -4
- package/dist/server/src/services/hub-tools/system-tool-definitions.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/system-tool-definitions.js +17 -80
- package/dist/server/src/services/hub-tools/tool-search.d.ts +7 -7
- package/dist/server/src/services/hub-tools/tool-search.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools/tool-search.js +10 -4
- package/dist/server/src/services/hub-tools/types.d.ts +2 -2
- package/dist/server/src/services/hub-tools/types.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools.service.d.ts +43 -72
- package/dist/server/src/services/hub-tools.service.d.ts.map +1 -1
- package/dist/server/src/services/hub-tools.service.js +185 -110
- package/dist/server/src/services/system-tool-handler.d.ts.map +1 -1
- package/dist/server/src/services/system-tool-handler.js +7 -17
- package/dist/server/src/utils/composite-key.d.ts +29 -0
- package/dist/server/src/utils/composite-key.d.ts.map +1 -0
- package/dist/server/src/utils/composite-key.js +39 -0
- package/dist/server/src/utils/error-handler.d.ts.map +1 -1
- package/dist/server/src/utils/error-handler.js +3 -2
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/src/utils/index.js +2 -0
- package/dist/server/src/utils/instance-id.d.ts +22 -0
- package/dist/server/src/utils/instance-id.d.ts.map +1 -0
- package/dist/server/src/utils/instance-id.js +59 -0
- package/dist/server/src/utils/json-utils.d.ts +4 -4
- package/dist/server/src/utils/json-utils.d.ts.map +1 -1
- package/dist/server/src/utils/json-utils.js +4 -4
- package/dist/server/src/utils/logger/dev-logger.d.ts +2 -1
- package/dist/server/src/utils/logger/dev-logger.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-formatter.js +82 -5
- package/dist/server/src/utils/logger/log-modules.d.ts +15 -9
- package/dist/server/src/utils/logger/log-modules.d.ts.map +1 -1
- package/dist/server/src/utils/logger/log-modules.js +8 -6
- package/dist/server/src/utils/parameter-validator.d.ts +10 -0
- package/dist/server/src/utils/parameter-validator.d.ts.map +1 -0
- package/dist/server/src/utils/parameter-validator.js +53 -0
- package/dist/server/src/utils/process-tree.d.ts +49 -0
- package/dist/server/src/utils/process-tree.d.ts.map +1 -0
- package/dist/server/src/utils/process-tree.js +285 -0
- package/dist/server/src/utils/sort-utils.d.ts +40 -0
- package/dist/server/src/utils/sort-utils.d.ts.map +1 -0
- package/dist/server/src/utils/sort-utils.js +131 -0
- package/dist/server/src/utils/transports/sse-transport.d.ts +16 -1
- package/dist/server/src/utils/transports/sse-transport.d.ts.map +1 -1
- package/dist/server/src/utils/transports/sse-transport.js +55 -9
- package/dist/server/src/utils/transports/stdio-transport.d.ts +24 -53
- package/dist/server/src/utils/transports/stdio-transport.d.ts.map +1 -1
- package/dist/server/src/utils/transports/stdio-transport.js +66 -247
- package/dist/server/src/utils/transports/streamable-http-transport.d.ts +24 -1
- package/dist/server/src/utils/transports/streamable-http-transport.d.ts.map +1 -1
- package/dist/server/src/utils/transports/streamable-http-transport.js +68 -8
- package/dist/server/src/utils/transports/transport-factory.d.ts +9 -4
- package/dist/server/src/utils/transports/transport-factory.d.ts.map +1 -1
- package/dist/server/src/utils/transports/transport-factory.js +31 -11
- package/dist/server/src/utils/transports/transport.interface.d.ts +6 -0
- package/dist/server/src/utils/transports/transport.interface.d.ts.map +1 -1
- package/dist/server/src/utils/version.d.ts +11 -0
- package/dist/server/src/utils/version.d.ts.map +1 -0
- package/dist/server/src/utils/version.js +57 -0
- package/dist/server/tests/contract/mcp-protocol/initialize.test.js +24 -24
- package/dist/server/tests/contract/mcp-protocol/tools-call.test.js +49 -45
- package/dist/server/tests/contract/mcp-protocol/tools-list.test.js +35 -36
- package/dist/server/tests/integration/gateway/fault-tolerance.test.js +65 -25
- package/dist/server/tests/integration/gateway/mcp-connection.test.js +53 -61
- package/dist/server/tests/server.test.js +27 -16
- package/dist/server/tests/temp/temp-run-docling.d.ts +2 -0
- package/dist/server/tests/temp/temp-run-docling.d.ts.map +1 -0
- package/dist/server/tests/temp/temp-run-docling.js +53 -0
- package/dist/server/tests/types/test-helpers.d.ts +1 -2
- package/dist/server/tests/types/test-helpers.d.ts.map +1 -1
- package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config-loader-automatic-migration.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config-loader-automatic-migration.test.js +199 -0
- package/dist/server/tests/unit/config/config-migrator.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config-migrator.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config-migrator.test.js +316 -0
- package/dist/server/tests/unit/config/config-saver.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config-saver.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config-saver.test.js +200 -0
- package/dist/server/tests/unit/config/config.schema.test.d.ts +2 -0
- package/dist/server/tests/unit/config/config.schema.test.d.ts.map +1 -0
- package/dist/server/tests/unit/config/config.schema.test.js +347 -0
- package/dist/server/tests/unit/server/runner.test.js +86 -62
- package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts +2 -0
- package/dist/server/tests/unit/services/connection/connection-manager.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/connection/connection-manager.test.js +112 -0
- package/dist/server/tests/unit/services/hub-manager-service.test.js +112 -46
- package/dist/server/tests/unit/services/hub-manager.test.js +25 -15
- package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-tools/instance-selector.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-tools/instance-selector.test.js +195 -0
- package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts +2 -0
- package/dist/server/tests/unit/services/hub-tools/server-selector.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/hub-tools/server-selector.test.js +190 -0
- package/dist/server/tests/unit/services/hub-tools.service.test.js +560 -320
- package/dist/server/tests/unit/services/instance-matcher.test.d.ts +2 -0
- package/dist/server/tests/unit/services/instance-matcher.test.d.ts.map +1 -0
- package/dist/server/tests/unit/services/instance-matcher.test.js +256 -0
- package/dist/server/tests/unit/services/session-manager.test.js +26 -436
- package/dist/server/tests/unit/utils/config.test.js +88 -186
- package/dist/server/tests/unit/utils/json-utils.test.js +18 -18
- package/dist/server/tests/unit/utils/logger-formatter.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/logger-formatter.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/logger-formatter.test.js +66 -0
- package/dist/server/tests/unit/utils/parameter-validator.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/parameter-validator.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/parameter-validator.test.js +63 -0
- package/dist/server/tests/unit/utils/process-tree.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/process-tree.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/process-tree.test.js +129 -0
- package/dist/server/tests/unit/utils/sort-utils.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/sort-utils.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/sort-utils.test.js +220 -0
- package/dist/server/tests/unit/utils/transport-factory.test.d.ts +2 -0
- package/dist/server/tests/unit/utils/transport-factory.test.d.ts.map +1 -0
- package/dist/server/tests/unit/utils/transport-factory.test.js +55 -0
- package/package.json +3 -1
- package/dist/client/assets/ResourceDetailView-Bf-1ffbk.js +0 -1
- package/dist/client/assets/ResourcesView-CjMklkyv.css +0 -1
- package/dist/client/assets/ResourcesView-g5x4xCPh.js +0 -1
- package/dist/client/assets/ServerDashboard-Chpne8Q0.css +0 -1
- package/dist/client/assets/ServerDashboard-G8Wmp4hF.js +0 -2
- package/dist/client/assets/ServerListView-dV2XrPjo.js +0 -32
- package/dist/client/assets/ServerStatusTags.vue_vue_type_script_setup_true_lang-BHiTFM7-.js +0 -1
- package/dist/client/assets/SessionsView-Ckd38lj1.js +0 -1
- package/dist/client/assets/SettingsView-BJUdepEQ.js +0 -1
- package/dist/client/assets/ToolCallDialog-C_bTCpHC.js +0 -1
- package/dist/client/assets/ToolsView-0c2eputu.js +0 -1
- package/dist/client/assets/ToolsView-E3Ps9c7i.css +0 -1
- package/dist/client/assets/el-form-item-BVMLpmVC.css +0 -1
- package/dist/client/assets/el-form-item-ClFnj49k.js +0 -12
- package/dist/client/assets/el-input-CDnuSKVZ.js +0 -1
- package/dist/client/assets/el-input-CmuHb8HS.css +0 -1
- package/dist/client/assets/el-overlay-B2ZKM6Up.css +0 -1
- package/dist/client/assets/el-overlay-CzMkXyYy.js +0 -1
- package/dist/client/assets/el-select-DvjGddk_.js +0 -1
- package/dist/client/assets/el-tab-pane-C_DQMcwe.js +0 -1
- package/dist/client/assets/el-table-column-CASRIbZM.js +0 -1
- package/dist/client/assets/el-table-column-T_mV9jNw.css +0 -1
- package/dist/client/assets/el-tag-DjxZVOpb.css +0 -1
- package/dist/client/assets/el-tag-npbwux4f.js +0 -1
- package/dist/client/assets/index-CCnAxNF8.js +0 -2
- package/dist/client/assets/index-d1DZeSfz.js +0 -1
- package/dist/client/assets/omit-DPsOVNIJ.js +0 -1
- package/dist/client/assets/vnode-CHomNjgN.js +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
-
import { stringifyForLogging, stringifyForLoggingWithReplacer, setJsonPrettyConfigGetter, rawHeadersToObject, stringifyRawHeadersForLogging, getJsonPrettySetting, getMcpCommDebugSetting,
|
|
2
|
+
import { stringifyForLogging, stringifyForLoggingWithReplacer, setJsonPrettyConfigGetter, rawHeadersToObject, stringifyRawHeadersForLogging, getJsonPrettySetting, getMcpCommDebugSetting, getApiDebugSetting } from '../../../src/utils/json-utils.js';
|
|
3
3
|
describe('json-utils', () => {
|
|
4
4
|
beforeEach(() => {
|
|
5
5
|
// Reset config getter
|
|
@@ -13,7 +13,7 @@ describe('json-utils', () => {
|
|
|
13
13
|
logging: {
|
|
14
14
|
jsonPretty: true,
|
|
15
15
|
mcpCommDebug: false,
|
|
16
|
-
|
|
16
|
+
apiDebug: false
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
}));
|
|
@@ -35,7 +35,7 @@ describe('json-utils', () => {
|
|
|
35
35
|
logging: {
|
|
36
36
|
jsonPretty: true,
|
|
37
37
|
mcpCommDebug: false,
|
|
38
|
-
|
|
38
|
+
apiDebug: false
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
}));
|
|
@@ -53,7 +53,7 @@ describe('json-utils', () => {
|
|
|
53
53
|
logging: {
|
|
54
54
|
jsonPretty: true,
|
|
55
55
|
mcpCommDebug: false,
|
|
56
|
-
|
|
56
|
+
apiDebug: false
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
}));
|
|
@@ -72,7 +72,7 @@ describe('json-utils', () => {
|
|
|
72
72
|
logging: {
|
|
73
73
|
jsonPretty: true,
|
|
74
74
|
mcpCommDebug: false,
|
|
75
|
-
|
|
75
|
+
apiDebug: false
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
}));
|
|
@@ -102,7 +102,7 @@ describe('json-utils', () => {
|
|
|
102
102
|
logging: {
|
|
103
103
|
jsonPretty: false,
|
|
104
104
|
mcpCommDebug: false,
|
|
105
|
-
|
|
105
|
+
apiDebug: false
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
}));
|
|
@@ -182,7 +182,7 @@ describe('json-utils', () => {
|
|
|
182
182
|
logging: {
|
|
183
183
|
jsonPretty: false,
|
|
184
184
|
mcpCommDebug: false,
|
|
185
|
-
|
|
185
|
+
apiDebug: false
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
188
|
}));
|
|
@@ -192,7 +192,7 @@ describe('json-utils', () => {
|
|
|
192
192
|
logging: {
|
|
193
193
|
jsonPretty: true,
|
|
194
194
|
mcpCommDebug: false,
|
|
195
|
-
|
|
195
|
+
apiDebug: false
|
|
196
196
|
}
|
|
197
197
|
}
|
|
198
198
|
}));
|
|
@@ -212,7 +212,7 @@ describe('json-utils', () => {
|
|
|
212
212
|
logging: {
|
|
213
213
|
jsonPretty: false, // Config says false, but env should override
|
|
214
214
|
mcpCommDebug: false,
|
|
215
|
-
|
|
215
|
+
apiDebug: false
|
|
216
216
|
}
|
|
217
217
|
}
|
|
218
218
|
}));
|
|
@@ -231,7 +231,7 @@ describe('json-utils', () => {
|
|
|
231
231
|
logging: {
|
|
232
232
|
jsonPretty: false, // Config says false, but env should override
|
|
233
233
|
mcpCommDebug: false,
|
|
234
|
-
|
|
234
|
+
apiDebug: false
|
|
235
235
|
}
|
|
236
236
|
}
|
|
237
237
|
}));
|
|
@@ -250,7 +250,7 @@ describe('json-utils', () => {
|
|
|
250
250
|
logging: {
|
|
251
251
|
jsonPretty: true, // Config says true, but env should override
|
|
252
252
|
mcpCommDebug: false,
|
|
253
|
-
|
|
253
|
+
apiDebug: false
|
|
254
254
|
}
|
|
255
255
|
}
|
|
256
256
|
}));
|
|
@@ -269,7 +269,7 @@ describe('json-utils', () => {
|
|
|
269
269
|
logging: {
|
|
270
270
|
jsonPretty: true, // Config says true, but env should override
|
|
271
271
|
mcpCommDebug: false,
|
|
272
|
-
|
|
272
|
+
apiDebug: false
|
|
273
273
|
}
|
|
274
274
|
}
|
|
275
275
|
}));
|
|
@@ -288,7 +288,7 @@ describe('json-utils', () => {
|
|
|
288
288
|
logging: {
|
|
289
289
|
jsonPretty: false,
|
|
290
290
|
mcpCommDebug: false,
|
|
291
|
-
|
|
291
|
+
apiDebug: false
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
294
|
}));
|
|
@@ -303,7 +303,7 @@ describe('json-utils', () => {
|
|
|
303
303
|
it('should return correct defaults when no config getter is set', () => {
|
|
304
304
|
expect(getJsonPrettySetting()).toBe(true);
|
|
305
305
|
expect(getMcpCommDebugSetting()).toBe(false);
|
|
306
|
-
expect(
|
|
306
|
+
expect(getApiDebugSetting()).toBe(false);
|
|
307
307
|
});
|
|
308
308
|
it('should return values from config getter when available', () => {
|
|
309
309
|
setJsonPrettyConfigGetter(() => ({
|
|
@@ -311,13 +311,13 @@ describe('json-utils', () => {
|
|
|
311
311
|
logging: {
|
|
312
312
|
jsonPretty: false,
|
|
313
313
|
mcpCommDebug: true,
|
|
314
|
-
|
|
314
|
+
apiDebug: true
|
|
315
315
|
}
|
|
316
316
|
}
|
|
317
317
|
}));
|
|
318
318
|
expect(getJsonPrettySetting()).toBe(false);
|
|
319
319
|
expect(getMcpCommDebugSetting()).toBe(true);
|
|
320
|
-
expect(
|
|
320
|
+
expect(getApiDebugSetting()).toBe(true);
|
|
321
321
|
});
|
|
322
322
|
it('should fall back to defaults when config getter fails', () => {
|
|
323
323
|
setJsonPrettyConfigGetter(() => {
|
|
@@ -325,7 +325,7 @@ describe('json-utils', () => {
|
|
|
325
325
|
});
|
|
326
326
|
expect(getJsonPrettySetting()).toBe(true);
|
|
327
327
|
expect(getMcpCommDebugSetting()).toBe(false);
|
|
328
|
-
expect(
|
|
328
|
+
expect(getApiDebugSetting()).toBe(false);
|
|
329
329
|
});
|
|
330
330
|
});
|
|
331
331
|
describe('rawHeadersToObject', () => {
|
|
@@ -364,7 +364,7 @@ describe('json-utils', () => {
|
|
|
364
364
|
logging: {
|
|
365
365
|
jsonPretty: true,
|
|
366
366
|
mcpCommDebug: false,
|
|
367
|
-
|
|
367
|
+
apiDebug: false
|
|
368
368
|
}
|
|
369
369
|
}
|
|
370
370
|
}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-formatter.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/utils/logger-formatter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { formatError } from '../../../src/utils/logger/log-formatter.js';
|
|
3
|
+
describe('Logger Formatter - formatError', () => {
|
|
4
|
+
it('should return empty string for array containing exactly one empty object ([{}])', () => {
|
|
5
|
+
const error = [{}];
|
|
6
|
+
const result = formatError(error);
|
|
7
|
+
expect(result).toBe('');
|
|
8
|
+
});
|
|
9
|
+
it('should return formatted string for array containing multiple empty objects ([{}, {}, {}])', () => {
|
|
10
|
+
const error = [{}, {}, {}];
|
|
11
|
+
const result = formatError(error);
|
|
12
|
+
expect(result).toContain('{}');
|
|
13
|
+
});
|
|
14
|
+
it('should return formatted string for array containing non-empty objects', () => {
|
|
15
|
+
const error = [{ message: 'test' }];
|
|
16
|
+
const result = formatError(error);
|
|
17
|
+
expect(result).toContain('message');
|
|
18
|
+
expect(result).toContain('test');
|
|
19
|
+
});
|
|
20
|
+
it('should return formatted string for array containing mixed objects (empty and non-empty)', () => {
|
|
21
|
+
const error = [{}, { message: 'test' }, {}];
|
|
22
|
+
const result = formatError(error);
|
|
23
|
+
expect(result).toContain('message');
|
|
24
|
+
expect(result).toContain('test');
|
|
25
|
+
});
|
|
26
|
+
it('should return empty string for empty array', () => {
|
|
27
|
+
const error = [];
|
|
28
|
+
const result = formatError(error);
|
|
29
|
+
expect(result).toBe('');
|
|
30
|
+
});
|
|
31
|
+
it('should handle Error objects with message correctly', () => {
|
|
32
|
+
const error = new Error('Test error');
|
|
33
|
+
const result = formatError(error);
|
|
34
|
+
expect(result).toContain('Test error');
|
|
35
|
+
});
|
|
36
|
+
it('should handle Error objects without message correctly', () => {
|
|
37
|
+
const error = new Error();
|
|
38
|
+
const result = formatError(error);
|
|
39
|
+
expect(result).toContain('Error');
|
|
40
|
+
});
|
|
41
|
+
it('should handle Error objects with custom name correctly', () => {
|
|
42
|
+
const error = Object.assign(new Error(), { name: 'NetworkError' });
|
|
43
|
+
const result = formatError(error);
|
|
44
|
+
expect(result).toContain('NetworkError');
|
|
45
|
+
});
|
|
46
|
+
it('should handle string errors correctly', () => {
|
|
47
|
+
const error = 'string error';
|
|
48
|
+
const result = formatError(error);
|
|
49
|
+
expect(result).toBe('string error');
|
|
50
|
+
});
|
|
51
|
+
it('should handle empty objects correctly', () => {
|
|
52
|
+
const error = {};
|
|
53
|
+
const result = formatError(error);
|
|
54
|
+
expect(result).toBe('{}');
|
|
55
|
+
});
|
|
56
|
+
it('should handle null values correctly', () => {
|
|
57
|
+
const error = null;
|
|
58
|
+
const result = formatError(error);
|
|
59
|
+
expect(result).toBe('null');
|
|
60
|
+
});
|
|
61
|
+
it('should handle undefined values correctly', () => {
|
|
62
|
+
const error = undefined;
|
|
63
|
+
const result = formatError(error);
|
|
64
|
+
expect(result).toBe('undefined');
|
|
65
|
+
});
|
|
66
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parameter-validator.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/utils/parameter-validator.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { validateParameters } from '../../../src/utils/parameter-validator.js';
|
|
3
|
+
describe('Parameter Validator', () => {
|
|
4
|
+
it('should return null for valid parameters', () => {
|
|
5
|
+
const schema = {
|
|
6
|
+
type: 'object',
|
|
7
|
+
properties: {
|
|
8
|
+
name: { type: 'string' },
|
|
9
|
+
age: { type: 'number' }
|
|
10
|
+
},
|
|
11
|
+
required: ['name']
|
|
12
|
+
};
|
|
13
|
+
const args = { name: 'test', age: 25 };
|
|
14
|
+
const result = validateParameters(args, schema);
|
|
15
|
+
expect(result).toBeNull();
|
|
16
|
+
});
|
|
17
|
+
it('should return error for missing required parameter', () => {
|
|
18
|
+
const schema = {
|
|
19
|
+
type: 'object',
|
|
20
|
+
properties: {
|
|
21
|
+
name: { type: 'string' },
|
|
22
|
+
age: { type: 'number' }
|
|
23
|
+
},
|
|
24
|
+
required: ['name', 'age']
|
|
25
|
+
};
|
|
26
|
+
const args = { name: 'test' };
|
|
27
|
+
const result = validateParameters(args, schema);
|
|
28
|
+
expect(result).toContain('Missing required parameter');
|
|
29
|
+
expect(result).toContain('age');
|
|
30
|
+
});
|
|
31
|
+
it('should return error for invalid parameter type', () => {
|
|
32
|
+
const schema = {
|
|
33
|
+
type: 'object',
|
|
34
|
+
properties: {
|
|
35
|
+
name: { type: 'string' },
|
|
36
|
+
age: { type: 'number' }
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const args = { name: 'test', age: '25' }; // age should be number, not string
|
|
40
|
+
const result = validateParameters(args, schema);
|
|
41
|
+
expect(result).toContain('Invalid type for parameter');
|
|
42
|
+
expect(result).toContain('Expected: number');
|
|
43
|
+
});
|
|
44
|
+
it('should handle schema without required fields', () => {
|
|
45
|
+
const schema = {
|
|
46
|
+
type: 'object',
|
|
47
|
+
properties: {
|
|
48
|
+
optionalField: { type: 'string' }
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const args = {};
|
|
52
|
+
const result = validateParameters(args, schema);
|
|
53
|
+
expect(result).toBeNull();
|
|
54
|
+
});
|
|
55
|
+
it('should handle schema without properties', () => {
|
|
56
|
+
const schema = {
|
|
57
|
+
type: 'object'
|
|
58
|
+
};
|
|
59
|
+
const args = { any: 'value' };
|
|
60
|
+
const result = validateParameters(args, schema);
|
|
61
|
+
expect(result).toBeNull();
|
|
62
|
+
});
|
|
63
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-tree.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/utils/process-tree.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { getChildren, getProcessTree, isAnyInTreeRunning, getWorkingProcessPid, killProcessTree } from '../../../src/utils/process-tree.js';
|
|
3
|
+
// Mock child_process module
|
|
4
|
+
vi.mock('child_process', () => ({
|
|
5
|
+
spawn: vi.fn()
|
|
6
|
+
}));
|
|
7
|
+
describe('process-tree (non-Windows platform)', () => {
|
|
8
|
+
// Save original platform
|
|
9
|
+
const originalPlatform = process.platform;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
// Mock non-Windows platform
|
|
12
|
+
Object.defineProperty(process, 'platform', {
|
|
13
|
+
value: 'linux',
|
|
14
|
+
configurable: true
|
|
15
|
+
});
|
|
16
|
+
vi.clearAllMocks();
|
|
17
|
+
});
|
|
18
|
+
describe('getChildren', () => {
|
|
19
|
+
it('should return empty array on non-Windows platform', async () => {
|
|
20
|
+
const result = await getChildren(1234);
|
|
21
|
+
expect(result).toEqual([]);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
describe('getProcessTree', () => {
|
|
25
|
+
it('should return array with just the original PID on non-Windows platform', async () => {
|
|
26
|
+
const result = await getProcessTree(1234);
|
|
27
|
+
expect(result).toEqual([1234]);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe('getWorkingProcessPid', () => {
|
|
31
|
+
it('should return the original PID on non-Windows platform', async () => {
|
|
32
|
+
const result = await getWorkingProcessPid(1234);
|
|
33
|
+
expect(result).toEqual(1234);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('isAnyInTreeRunning', () => {
|
|
37
|
+
it('should check just the single process on non-Windows platform', async () => {
|
|
38
|
+
// Mock process.kill to return true (process running)
|
|
39
|
+
const originalKill = process.kill;
|
|
40
|
+
process.kill = vi.fn();
|
|
41
|
+
const result = await isAnyInTreeRunning(1234);
|
|
42
|
+
expect(result).toBeDefined();
|
|
43
|
+
// Restore original
|
|
44
|
+
process.kill = originalKill;
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('killProcessTree', () => {
|
|
48
|
+
it('should just kill the single process on non-Windows platform', async () => {
|
|
49
|
+
// Mock process.kill
|
|
50
|
+
const originalKill = process.kill;
|
|
51
|
+
process.kill = vi.fn();
|
|
52
|
+
await killProcessTree(1234);
|
|
53
|
+
// Restore original
|
|
54
|
+
process.kill = originalKill;
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
// Restore original platform after all tests
|
|
58
|
+
afterAll(() => {
|
|
59
|
+
Object.defineProperty(process, 'platform', {
|
|
60
|
+
value: originalPlatform,
|
|
61
|
+
configurable: true
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('process-tree (Windows platform)', () => {
|
|
66
|
+
// Save original platform
|
|
67
|
+
const originalPlatform = process.platform;
|
|
68
|
+
beforeEach(() => {
|
|
69
|
+
// Mock Windows platform
|
|
70
|
+
Object.defineProperty(process, 'platform', {
|
|
71
|
+
value: 'win32',
|
|
72
|
+
configurable: true
|
|
73
|
+
});
|
|
74
|
+
vi.clearAllMocks();
|
|
75
|
+
});
|
|
76
|
+
describe('isProcessRunning (internal helper behavior)', () => {
|
|
77
|
+
it('should handle process.kill correctly', async () => {
|
|
78
|
+
const originalKill = process.kill;
|
|
79
|
+
// isAnyInTreeRunning will call our mocked kill
|
|
80
|
+
// We'll test this indirectly
|
|
81
|
+
const pidToCheck = 99999; // A PID that doesn't exist
|
|
82
|
+
process.kill = vi.fn((checkPid, signal) => {
|
|
83
|
+
if (checkPid === pidToCheck && signal === 0) {
|
|
84
|
+
throw new Error('ESRCH');
|
|
85
|
+
}
|
|
86
|
+
return true;
|
|
87
|
+
});
|
|
88
|
+
const result = await isAnyInTreeRunning(pidToCheck);
|
|
89
|
+
expect(result !== undefined).toBe(true);
|
|
90
|
+
// Restore original
|
|
91
|
+
process.kill = originalKill;
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe('edge cases and error handling', () => {
|
|
95
|
+
it('should handle invalid PID gracefully', async () => {
|
|
96
|
+
const result = await getChildren(0);
|
|
97
|
+
expect(Array.isArray(result)).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
it('should handle negative PID gracefully', async () => {
|
|
100
|
+
const result = await getProcessTree(-1);
|
|
101
|
+
expect(Array.isArray(result)).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
it('should handle errors in getWorkingProcessPid gracefully', async () => {
|
|
104
|
+
const pid = 12345;
|
|
105
|
+
const result = await getWorkingProcessPid(pid);
|
|
106
|
+
// When PowerShell fails, it should fall back to returning the original PID
|
|
107
|
+
expect(result).toEqual(pid);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('killProcessTree error handling', () => {
|
|
111
|
+
it('should handle errors in killProcessTree gracefully', async () => {
|
|
112
|
+
const originalKill = process.kill;
|
|
113
|
+
process.kill = vi.fn(() => {
|
|
114
|
+
throw new Error('Access denied');
|
|
115
|
+
});
|
|
116
|
+
// This should not throw, errors should be caught
|
|
117
|
+
await expect(killProcessTree(1234)).resolves.not.toThrow();
|
|
118
|
+
// Restore original
|
|
119
|
+
process.kill = originalKill;
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
// Restore original platform after all tests
|
|
123
|
+
afterAll(() => {
|
|
124
|
+
Object.defineProperty(process, 'platform', {
|
|
125
|
+
value: originalPlatform,
|
|
126
|
+
configurable: true
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sort-utils.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/utils/sort-utils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { sortObjectKeys, sortObjectKeysCaseInsensitive, sortObjectKeysDeep, sortServerConfigEnvHeaders } from '../../../src/utils/sort-utils.js';
|
|
3
|
+
describe('sort-utils', () => {
|
|
4
|
+
describe('sortObjectKeys', () => {
|
|
5
|
+
it('should sort object keys alphabetically using localeCompare', () => {
|
|
6
|
+
const obj = {
|
|
7
|
+
zebra: 'value3',
|
|
8
|
+
apple: 'value1',
|
|
9
|
+
banana: 'value2'
|
|
10
|
+
};
|
|
11
|
+
const result = sortObjectKeys(obj);
|
|
12
|
+
expect(Object.keys(result)).toEqual(['apple', 'banana', 'zebra']);
|
|
13
|
+
expect(result).toEqual({
|
|
14
|
+
apple: 'value1',
|
|
15
|
+
banana: 'value2',
|
|
16
|
+
zebra: 'value3'
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
it('should return the same object if input is null or undefined', () => {
|
|
20
|
+
expect(sortObjectKeys(null)).toBe(null);
|
|
21
|
+
expect(sortObjectKeys(undefined)).toBe(undefined);
|
|
22
|
+
});
|
|
23
|
+
it('should return the same object if input is an array', () => {
|
|
24
|
+
const arr = [3, 1, 2];
|
|
25
|
+
expect(sortObjectKeys(arr)).toBe(arr);
|
|
26
|
+
});
|
|
27
|
+
it('should return the same object if input is not an object', () => {
|
|
28
|
+
expect(sortObjectKeys('string')).toBe('string');
|
|
29
|
+
expect(sortObjectKeys(42)).toBe(42);
|
|
30
|
+
expect(sortObjectKeys(true)).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
it('should preserve the original object (return a new object)', () => {
|
|
33
|
+
const obj = {
|
|
34
|
+
zebra: 'value3',
|
|
35
|
+
apple: 'value1'
|
|
36
|
+
};
|
|
37
|
+
const result = sortObjectKeys(obj);
|
|
38
|
+
expect(result).not.toBe(obj);
|
|
39
|
+
expect(obj).toEqual({
|
|
40
|
+
zebra: 'value3',
|
|
41
|
+
apple: 'value1'
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
it('should handle empty object', () => {
|
|
45
|
+
expect(sortObjectKeys({})).toEqual({});
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('sortObjectKeysCaseInsensitive', () => {
|
|
49
|
+
it('should sort object keys alphabetically, case-insensitive', () => {
|
|
50
|
+
const obj = {
|
|
51
|
+
Zebra: 'value3',
|
|
52
|
+
apple: 'value1',
|
|
53
|
+
Banana: 'value2'
|
|
54
|
+
};
|
|
55
|
+
const result = sortObjectKeysCaseInsensitive(obj);
|
|
56
|
+
expect(Object.keys(result)).toEqual(['apple', 'Banana', 'Zebra']);
|
|
57
|
+
expect(result).toEqual({
|
|
58
|
+
apple: 'value1',
|
|
59
|
+
Banana: 'value2',
|
|
60
|
+
Zebra: 'value3'
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
it('should preserve original key case', () => {
|
|
64
|
+
const obj = {
|
|
65
|
+
CONTENT_TYPE: 'application/json',
|
|
66
|
+
Authorization: 'Bearer token',
|
|
67
|
+
accept: 'text/plain'
|
|
68
|
+
};
|
|
69
|
+
const result = sortObjectKeysCaseInsensitive(obj);
|
|
70
|
+
expect(Object.keys(result)).toEqual(['accept', 'Authorization', 'CONTENT_TYPE']);
|
|
71
|
+
expect(result.accept).toBe('text/plain');
|
|
72
|
+
expect(result.Authorization).toBe('Bearer token');
|
|
73
|
+
expect(result.CONTENT_TYPE).toBe('application/json');
|
|
74
|
+
});
|
|
75
|
+
it('should return the same object if input is null or undefined', () => {
|
|
76
|
+
expect(sortObjectKeysCaseInsensitive(null)).toBe(null);
|
|
77
|
+
expect(sortObjectKeysCaseInsensitive(undefined)).toBe(undefined);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('sortObjectKeysDeep', () => {
|
|
81
|
+
it('should recursively sort all object keys in a nested structure', () => {
|
|
82
|
+
const obj = {
|
|
83
|
+
zebra: {
|
|
84
|
+
delta: 'value4',
|
|
85
|
+
alpha: 'value1'
|
|
86
|
+
},
|
|
87
|
+
apple: {
|
|
88
|
+
charlie: 'value3',
|
|
89
|
+
bravo: 'value2'
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const result = sortObjectKeysDeep(obj);
|
|
93
|
+
expect(Object.keys(result)).toEqual(['apple', 'zebra']);
|
|
94
|
+
expect(Object.keys(result.apple)).toEqual(['bravo', 'charlie']);
|
|
95
|
+
expect(Object.keys(result.zebra)).toEqual(['alpha', 'delta']);
|
|
96
|
+
});
|
|
97
|
+
it('should handle arrays and recursively sort objects within arrays', () => {
|
|
98
|
+
const obj = {
|
|
99
|
+
items: [
|
|
100
|
+
{ zebra: 'value3', apple: 'value1' },
|
|
101
|
+
{ delta: 'value4', alpha: 'value1' }
|
|
102
|
+
]
|
|
103
|
+
};
|
|
104
|
+
const result = sortObjectKeysDeep(obj);
|
|
105
|
+
expect(Array.isArray(result.items)).toBe(true);
|
|
106
|
+
expect(Object.keys(result.items[0])).toEqual(['apple', 'zebra']);
|
|
107
|
+
expect(Object.keys(result.items[1])).toEqual(['alpha', 'delta']);
|
|
108
|
+
});
|
|
109
|
+
it('should handle mixed types in nested structure', () => {
|
|
110
|
+
const obj = {
|
|
111
|
+
number: 42,
|
|
112
|
+
string: 'hello',
|
|
113
|
+
boolean: true,
|
|
114
|
+
array: [1, 2, 3],
|
|
115
|
+
object: {
|
|
116
|
+
nested: {
|
|
117
|
+
z: 'last',
|
|
118
|
+
a: 'first'
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
const result = sortObjectKeysDeep(obj);
|
|
123
|
+
expect(Object.keys(result)).toEqual(['array', 'boolean', 'number', 'object', 'string']);
|
|
124
|
+
expect(Object.keys(result.object.nested)).toEqual(['a', 'z']);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe('sortServerConfigEnvHeaders', () => {
|
|
128
|
+
it('should sort env and headers objects in a server configuration', () => {
|
|
129
|
+
const config = {
|
|
130
|
+
env: {
|
|
131
|
+
NODE_ENV: 'production',
|
|
132
|
+
API_KEY: 'secret',
|
|
133
|
+
DEBUG: 'false'
|
|
134
|
+
},
|
|
135
|
+
headers: {
|
|
136
|
+
'X-Custom-Header': 'value',
|
|
137
|
+
Authorization: 'Bearer token',
|
|
138
|
+
'Content-Type': 'application/json'
|
|
139
|
+
},
|
|
140
|
+
otherField: 'should not be affected'
|
|
141
|
+
};
|
|
142
|
+
const result = sortServerConfigEnvHeaders(config);
|
|
143
|
+
expect(Object.keys(result.env)).toEqual(['API_KEY', 'DEBUG', 'NODE_ENV']);
|
|
144
|
+
expect(Object.keys(result.headers)).toEqual([
|
|
145
|
+
'Authorization',
|
|
146
|
+
'Content-Type',
|
|
147
|
+
'X-Custom-Header'
|
|
148
|
+
]);
|
|
149
|
+
expect(result.otherField).toBe('should not be affected');
|
|
150
|
+
});
|
|
151
|
+
it('should handle case where env or headers is undefined', () => {
|
|
152
|
+
const config1 = { headers: { Z: '1', A: '2' } };
|
|
153
|
+
const result1 = sortServerConfigEnvHeaders(config1);
|
|
154
|
+
expect(Object.keys(result1.headers)).toEqual(['A', 'Z']);
|
|
155
|
+
expect(result1.env).toBeUndefined();
|
|
156
|
+
const config2 = { env: { Z: '1', A: '2' } };
|
|
157
|
+
const result2 = sortServerConfigEnvHeaders(config2);
|
|
158
|
+
expect(Object.keys(result2.env)).toEqual(['A', 'Z']);
|
|
159
|
+
expect(result2.headers).toBeUndefined();
|
|
160
|
+
});
|
|
161
|
+
it('should handle empty env or headers objects', () => {
|
|
162
|
+
const config = {
|
|
163
|
+
env: {},
|
|
164
|
+
headers: {}
|
|
165
|
+
};
|
|
166
|
+
const result = sortServerConfigEnvHeaders(config);
|
|
167
|
+
expect(result.env).toEqual({});
|
|
168
|
+
expect(result.headers).toEqual({});
|
|
169
|
+
});
|
|
170
|
+
it('should preserve the original object structure', () => {
|
|
171
|
+
const config = {
|
|
172
|
+
env: { B: '2', A: '1' },
|
|
173
|
+
headers: { Y: '2', X: '1' },
|
|
174
|
+
command: 'npm start',
|
|
175
|
+
args: ['--verbose']
|
|
176
|
+
};
|
|
177
|
+
const result = sortServerConfigEnvHeaders(config);
|
|
178
|
+
expect(result.command).toBe('npm start');
|
|
179
|
+
expect(result.args).toEqual(['--verbose']);
|
|
180
|
+
expect(Object.keys(result.env)).toEqual(['A', 'B']);
|
|
181
|
+
expect(Object.keys(result.headers)).toEqual(['X', 'Y']);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
describe('integration tests', () => {
|
|
185
|
+
it('should work with realistic server configuration scenario', () => {
|
|
186
|
+
const serverConfig = {
|
|
187
|
+
type: 'stdio',
|
|
188
|
+
command: 'npx mcp-server',
|
|
189
|
+
args: ['--config', 'config.json'],
|
|
190
|
+
env: {
|
|
191
|
+
NODE_PATH: '/usr/local/lib/node_modules',
|
|
192
|
+
PATH: '/usr/bin:/bin',
|
|
193
|
+
HOME: '/home/user',
|
|
194
|
+
DEBUG: 'mcp:*',
|
|
195
|
+
API_KEY: 'sk-12345'
|
|
196
|
+
},
|
|
197
|
+
headers: {
|
|
198
|
+
'User-Agent': 'MCP-Hub-Lite/1.0',
|
|
199
|
+
Accept: 'application/json',
|
|
200
|
+
Authorization: 'Bearer token123',
|
|
201
|
+
'Content-Type': 'application/json'
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
const result = sortServerConfigEnvHeaders(serverConfig);
|
|
205
|
+
// Verify env is sorted case-insensitive
|
|
206
|
+
expect(Object.keys(result.env)).toEqual(['API_KEY', 'DEBUG', 'HOME', 'NODE_PATH', 'PATH']);
|
|
207
|
+
// Verify headers is sorted case-insensitive
|
|
208
|
+
expect(Object.keys(result.headers)).toEqual([
|
|
209
|
+
'Accept',
|
|
210
|
+
'Authorization',
|
|
211
|
+
'Content-Type',
|
|
212
|
+
'User-Agent'
|
|
213
|
+
]);
|
|
214
|
+
// Verify other fields are preserved
|
|
215
|
+
expect(result.type).toBe('stdio');
|
|
216
|
+
expect(result.command).toBe('npx mcp-server');
|
|
217
|
+
expect(result.args).toEqual(['--config', 'config.json']);
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-factory.test.d.ts","sourceRoot":"","sources":["../../../../../tests/unit/utils/transport-factory.test.ts"],"names":[],"mappings":""}
|