@crownpeak/dqm-react-component-dev-mcp 1.2.0
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/README.md +138 -0
- package/data/.env.example +22 -0
- package/data/.gitattributes +47 -0
- package/data/.glfrc.json +7 -0
- package/data/.husky/pre-commit +5 -0
- package/data/.nvmrc +1 -0
- package/data/CHANGELOG.md +75 -0
- package/data/CODE_OF_CONDUCT.md +129 -0
- package/data/CONTRIBUTING.md +203 -0
- package/data/DOCS-STRUCTURE.md +307 -0
- package/data/I18N.md +292 -0
- package/data/LICENSE +22 -0
- package/data/README.md +315 -0
- package/data/SECURITY.md +125 -0
- package/data/WIKI-DEPLOYMENT.md +348 -0
- package/data/docs/AI-FEATURES.md +610 -0
- package/data/docs/API-REFERENCE.md +1022 -0
- package/data/docs/AUTHENTICATION.md +301 -0
- package/data/docs/BACKEND-API.md +468 -0
- package/data/docs/DEVELOPMENT.md +375 -0
- package/data/docs/EXAMPLES.md +622 -0
- package/data/docs/MCP-SERVER.md +307 -0
- package/data/docs/MIGRATION-GUIDE.md +367 -0
- package/data/docs/NPM-PUBLISH.md +193 -0
- package/data/docs/QUICKSTART.md +206 -0
- package/data/docs/REDIS-SETUP.md +162 -0
- package/data/docs/SERVER.md +228 -0
- package/data/docs/TROUBLESHOOTING.md +657 -0
- package/data/docs/WIDGET-GUIDE.md +638 -0
- package/data/docs/WIKI-HOME.md +58 -0
- package/data/docs/WIKI-SIDEBAR.md +39 -0
- package/data/package.json +171 -0
- package/data/playwright.config.ts +64 -0
- package/data/probe/.cargo/config.toml +10 -0
- package/data/probe/.claude/commands/performance-review.md +15 -0
- package/data/probe/.clinerules +288 -0
- package/data/probe/.dockerignore +57 -0
- package/data/probe/.githooks/post-commit +11 -0
- package/data/probe/.githooks/pre-commit +99 -0
- package/data/probe/.githooks/pre-commit-vow +9 -0
- package/data/probe/.prompts/engineer.md +41 -0
- package/data/probe/.roomodes +28 -0
- package/data/probe/.windsurfrules +0 -0
- package/data/probe/BASH_TOOL_SUMMARY.md +148 -0
- package/data/probe/BENCHMARKING.md +256 -0
- package/data/probe/CLAUDE.md +226 -0
- package/data/probe/CODE_OF_CONDUCT.md +128 -0
- package/data/probe/CONTRIBUTING.md +193 -0
- package/data/probe/Cargo.toml +120 -0
- package/data/probe/Cross.toml +10 -0
- package/data/probe/DOCKER-README.md +224 -0
- package/data/probe/Dockerfile +32 -0
- package/data/probe/ENHANCED_DEBUG_TELEMETRY.md +188 -0
- package/data/probe/LICENSE +201 -0
- package/data/probe/Makefile +210 -0
- package/data/probe/README.md +824 -0
- package/data/probe/SECURITY.md +67 -0
- package/data/probe/WINDOWS-GUIDE.md +294 -0
- package/data/probe/benches/parsing_benchmarks.rs +370 -0
- package/data/probe/benches/search_benchmarks.rs +599 -0
- package/data/probe/benches/simd_benchmarks.rs +372 -0
- package/data/probe/benches/timing_benchmarks.rs +287 -0
- package/data/probe/build-windows.bat +229 -0
- package/data/probe/codex-config/config.toml +6 -0
- package/data/probe/docs/PERFORMANCE_OPTIMIZATION.md +161 -0
- package/data/probe/examples/cache_demo.rs +46 -0
- package/data/probe/examples/chat/.dockerignore +37 -0
- package/data/probe/examples/chat/ChatSessionManager.js +295 -0
- package/data/probe/examples/chat/Dockerfile +98 -0
- package/data/probe/examples/chat/LICENSE +201 -0
- package/data/probe/examples/chat/LOCAL_IMAGE_SUPPORT.md +195 -0
- package/data/probe/examples/chat/MCP_INTEGRATION.md +400 -0
- package/data/probe/examples/chat/README.md +338 -0
- package/data/probe/examples/chat/TRACING.md +226 -0
- package/data/probe/examples/chat/appTracer.js +968 -0
- package/data/probe/examples/chat/auth.js +76 -0
- package/data/probe/examples/chat/bin/probe-chat.js +13 -0
- package/data/probe/examples/chat/build.js +104 -0
- package/data/probe/examples/chat/cancelRequest.js +84 -0
- package/data/probe/examples/chat/demo-agentic-image-flow.js +88 -0
- package/data/probe/examples/chat/demo-local-images.js +128 -0
- package/data/probe/examples/chat/fileSpanExporter.js +181 -0
- package/data/probe/examples/chat/implement/README.md +228 -0
- package/data/probe/examples/chat/implement/backends/AiderBackend.js +750 -0
- package/data/probe/examples/chat/implement/backends/BaseBackend.js +276 -0
- package/data/probe/examples/chat/implement/backends/ClaudeCodeBackend.js +767 -0
- package/data/probe/examples/chat/implement/backends/MockBackend.js +237 -0
- package/data/probe/examples/chat/implement/backends/registry.js +85 -0
- package/data/probe/examples/chat/implement/core/BackendManager.js +567 -0
- package/data/probe/examples/chat/implement/core/ImplementTool.js +354 -0
- package/data/probe/examples/chat/implement/core/config.js +428 -0
- package/data/probe/examples/chat/implement/core/timeouts.js +58 -0
- package/data/probe/examples/chat/implement/core/utils.js +496 -0
- package/data/probe/examples/chat/implement/types/BackendTypes.js +126 -0
- package/data/probe/examples/chat/index.js +669 -0
- package/data/probe/examples/chat/mcpServer.js +341 -0
- package/data/probe/examples/chat/npm/LICENSE +15 -0
- package/data/probe/examples/chat/npm/README.md +168 -0
- package/data/probe/examples/chat/npm/bin/probe-chat.js +156 -0
- package/data/probe/examples/chat/npm/index.js +259 -0
- package/data/probe/examples/chat/npm/package.json +54 -0
- package/data/probe/examples/chat/package.json +102 -0
- package/data/probe/examples/chat/probeChat.js +456 -0
- package/data/probe/examples/chat/probeTool.js +491 -0
- package/data/probe/examples/chat/storage/JsonChatStorage.js +476 -0
- package/data/probe/examples/chat/telemetry.js +281 -0
- package/data/probe/examples/chat/test/integration/chatFlows.test.js +320 -0
- package/data/probe/examples/chat/test/integration/toolCalling.test.js +471 -0
- package/data/probe/examples/chat/test/mocks/mockLLMProvider.js +269 -0
- package/data/probe/examples/chat/test/test-backends.js +90 -0
- package/data/probe/examples/chat/test/testUtils.js +530 -0
- package/data/probe/examples/chat/test/unit/backendTimeout.test.js +161 -0
- package/data/probe/examples/chat/test/unit/packageFiles.test.js +120 -0
- package/data/probe/examples/chat/test/verify-tests.js +118 -0
- package/data/probe/examples/chat/test-agentic-image-loading.js +294 -0
- package/data/probe/examples/chat/test-ai-sdk-telemetry.js +204 -0
- package/data/probe/examples/chat/test-chat-tracing.js +38 -0
- package/data/probe/examples/chat/test-direct-function.js +49 -0
- package/data/probe/examples/chat/test-file-size-validation.js +103 -0
- package/data/probe/examples/chat/test-full-mcp-integration.js +258 -0
- package/data/probe/examples/chat/test-github-context.txt +12 -0
- package/data/probe/examples/chat/test-hierarchy.js +203 -0
- package/data/probe/examples/chat/test-image-spans.js +37 -0
- package/data/probe/examples/chat/test-local-image-reading.js +176 -0
- package/data/probe/examples/chat/test-mcp-integration.js +136 -0
- package/data/probe/examples/chat/test-mcp-probe-server.js +161 -0
- package/data/probe/examples/chat/test-mcp-with-ai.js +279 -0
- package/data/probe/examples/chat/test-multiple-allowed-dirs.js +111 -0
- package/data/probe/examples/chat/test-probe-mcp-server.js +110 -0
- package/data/probe/examples/chat/test-security-validation.js +145 -0
- package/data/probe/examples/chat/test-simple-tracing.js +32 -0
- package/data/probe/examples/chat/test-trace-verification.js +235 -0
- package/data/probe/examples/chat/test-tracing.js +114 -0
- package/data/probe/examples/chat/tokenCounter.js +419 -0
- package/data/probe/examples/chat/tokenUsageDisplay.js +134 -0
- package/data/probe/examples/chat/webServer.js +1103 -0
- package/data/probe/examples/reranker/Cargo.toml +33 -0
- package/data/probe/examples/reranker/DEBUG_OUTPUT_ANALYSIS.md +71 -0
- package/data/probe/examples/reranker/MODELS.md +66 -0
- package/data/probe/examples/reranker/MODEL_COMPARISON.md +60 -0
- package/data/probe/examples/reranker/MULTI_MODEL_ANALYSIS.md +176 -0
- package/data/probe/examples/reranker/PERFORMANCE_SUMMARY.md +156 -0
- package/data/probe/examples/reranker/README.md +347 -0
- package/data/probe/examples/reranker/RUST_BERT_COMPARISON.md +82 -0
- package/data/probe/examples/reranker/TOKENIZATION_GUIDE.md +120 -0
- package/data/probe/examples/reranker/check_rust_tokenizer.py +108 -0
- package/data/probe/examples/reranker/convert_to_torchscript.py +109 -0
- package/data/probe/examples/reranker/debug_scoring.py +189 -0
- package/data/probe/examples/reranker/debug_tokenization.py +154 -0
- package/data/probe/examples/reranker/download_models.sh +73 -0
- package/data/probe/examples/reranker/requirements.txt +13 -0
- package/data/probe/examples/reranker/run_comprehensive_benchmark.sh +83 -0
- package/data/probe/examples/reranker/rust_bert_test/Cargo.toml +12 -0
- package/data/probe/examples/reranker/rust_bert_test/README.md +54 -0
- package/data/probe/examples/reranker/simple_test.py +50 -0
- package/data/probe/examples/reranker/test_all_models.sh +63 -0
- package/data/probe/examples/reranker/test_bert_results.sh +44 -0
- package/data/probe/examples/reranker/test_cross_encoder.py +334 -0
- package/data/probe/examples/reranker/test_cross_encoder.sh +80 -0
- package/data/probe/examples/reranker/test_exact_comparison.py +151 -0
- package/data/probe/examples/reranker/test_parallel_performance.sh +56 -0
- package/data/probe/examples/reranker/test_scores.py +132 -0
- package/data/probe/install.ps1 +508 -0
- package/data/probe/install.sh +460 -0
- package/data/probe/npm/CLONE_METHOD_EXAMPLES.md +596 -0
- package/data/probe/npm/CONTEXT_COMPACTION.md +303 -0
- package/data/probe/npm/DELEGATE_TOOL_README.md +166 -0
- package/data/probe/npm/MAID_INTEGRATION.md +313 -0
- package/data/probe/npm/MCP_INTEGRATION_SUMMARY.md +241 -0
- package/data/probe/npm/README.md +824 -0
- package/data/probe/npm/bin/.gitignore +7 -0
- package/data/probe/npm/bin/.gitkeep +0 -0
- package/data/probe/npm/bin/README.md +12 -0
- package/data/probe/npm/bin/probe +167 -0
- package/data/probe/npm/docs/CLAUDE_CODE_INTEGRATION.md +414 -0
- package/data/probe/npm/docs/CODEX_INTEGRATION.md +502 -0
- package/data/probe/npm/docs/EDIT_CREATE_TOOLS.md +233 -0
- package/data/probe/npm/docs/RETRY_AND_FALLBACK.md +674 -0
- package/data/probe/npm/example-usage.js +335 -0
- package/data/probe/npm/examples/multi-engine-demo.js +117 -0
- package/data/probe/npm/examples/probe-agent-cli.js +113 -0
- package/data/probe/npm/examples/test-agent-edit.js +114 -0
- package/data/probe/npm/examples/test-edit-create.js +120 -0
- package/data/probe/npm/examples/test-edit-direct.js +114 -0
- package/data/probe/npm/index.d.ts +744 -0
- package/data/probe/npm/jest.config.js +52 -0
- package/data/probe/npm/package.json +117 -0
- package/data/probe/npm/scripts/build-agent.cjs +75 -0
- package/data/probe/npm/scripts/build-cjs.js +124 -0
- package/data/probe/npm/scripts/build-mcp.cjs +36 -0
- package/data/probe/npm/scripts/postinstall.js +216 -0
- package/data/probe/npm/test-codex-e2e.js +78 -0
- package/data/probe/npm/test-download-lock.js +109 -0
- package/data/probe/npm/test-grep-security.js +94 -0
- package/data/probe/npm/test-grep-simplified.js +63 -0
- package/data/probe/npm/test-grep.js +51 -0
- package/data/probe/npm/tests/README.md +96 -0
- package/data/probe/npm/tests/agent-compact-history.test.js +174 -0
- package/data/probe/npm/tests/allow-tests-default.test.js +151 -0
- package/data/probe/npm/tests/contextCompactor.test.js +498 -0
- package/data/probe/npm/tests/delegate-config.test.js +353 -0
- package/data/probe/npm/tests/delegate-integration.test.js +348 -0
- package/data/probe/npm/tests/extractor-integration.test.js +162 -0
- package/data/probe/npm/tests/extractor.test.js +317 -0
- package/data/probe/npm/tests/fixtures/sampleDiagrams.js +267 -0
- package/data/probe/npm/tests/integration/claude-code-auto-fallback.spec.js +148 -0
- package/data/probe/npm/tests/integration/claude-code-multi-step.spec.js +127 -0
- package/data/probe/npm/tests/integration/claude-code-tool-events.spec.js +163 -0
- package/data/probe/npm/tests/integration/codex-auto-fallback.spec.js +191 -0
- package/data/probe/npm/tests/integration/codex-tool-events.spec.js +147 -0
- package/data/probe/npm/tests/integration/examplesChatMcp.test.js +402 -0
- package/data/probe/npm/tests/integration/mcpDotenvSupport.test.js +174 -0
- package/data/probe/npm/tests/integration/mcpErrorHandling.test.js +566 -0
- package/data/probe/npm/tests/integration/mcpRobustness.test.js +564 -0
- package/data/probe/npm/tests/integration/mcpStdoutPurity.test.js +355 -0
- package/data/probe/npm/tests/integration/probeAgentMcp.test.js +398 -0
- package/data/probe/npm/tests/integration/retryFallback.test.js +368 -0
- package/data/probe/npm/tests/integration/schema-in-initial-message.test.js +318 -0
- package/data/probe/npm/tests/integration/schema-validation-loop-prevention.test.js +244 -0
- package/data/probe/npm/tests/integration/schemaRetryLogic.test.js +94 -0
- package/data/probe/npm/tests/integration/validationFlow.test.js +329 -0
- package/data/probe/npm/tests/manual/test-codex-basic.js +110 -0
- package/data/probe/npm/tests/mcp/mcpClientManager.test.js +614 -0
- package/data/probe/npm/tests/mcp/mcpConfig.test.js +359 -0
- package/data/probe/npm/tests/mcp/mcpXmlBridge.test.js +436 -0
- package/data/probe/npm/tests/mcp/mockMcpServer.js +510 -0
- package/data/probe/npm/tests/mcp-strict-syntax.test.js +319 -0
- package/data/probe/npm/tests/mermaidQuoteEscaping.test.js +214 -0
- package/data/probe/npm/tests/nestedQuoteFix.test.js +40 -0
- package/data/probe/npm/tests/setup.js +46 -0
- package/data/probe/npm/tests/unit/allowed-tools.test.js +513 -0
- package/data/probe/npm/tests/unit/attempt-completion-closing-tag-in-content.test.js +188 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonFix.test.js +238 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonIssue.test.js +128 -0
- package/data/probe/npm/tests/unit/backtickAutoFix.test.js +35 -0
- package/data/probe/npm/tests/unit/bash-probe-agent-integration.test.js +389 -0
- package/data/probe/npm/tests/unit/bash-simple-commands.test.js +324 -0
- package/data/probe/npm/tests/unit/bash-tool-comprehensive.test.js +371 -0
- package/data/probe/npm/tests/unit/bash-tool-integration.test.js +310 -0
- package/data/probe/npm/tests/unit/bash-tool.test.js +341 -0
- package/data/probe/npm/tests/unit/completion-prompt.test.js +379 -0
- package/data/probe/npm/tests/unit/cwd-path-options.test.js +287 -0
- package/data/probe/npm/tests/unit/delegate-limits.test.js +422 -0
- package/data/probe/npm/tests/unit/direct-content-attempt-completion.test.js +235 -0
- package/data/probe/npm/tests/unit/edit-create-tools.test.js +609 -0
- package/data/probe/npm/tests/unit/enhancedMermaidValidation.test.js +577 -0
- package/data/probe/npm/tests/unit/extract-content.test.js +83 -0
- package/data/probe/npm/tests/unit/extract-multiple-targets.test.js +89 -0
- package/data/probe/npm/tests/unit/fallbackManager.test.js +442 -0
- package/data/probe/npm/tests/unit/githubCompatibilityValidation.test.js +258 -0
- package/data/probe/npm/tests/unit/imageConfig.test.js +149 -0
- package/data/probe/npm/tests/unit/imagePathResolution.test.js +345 -0
- package/data/probe/npm/tests/unit/json-fixing-agent.test.js +238 -0
- package/data/probe/npm/tests/unit/json-validation-enhanced-errors.test.js +199 -0
- package/data/probe/npm/tests/unit/jsonValidationInfiniteLoopFix.test.js +228 -0
- package/data/probe/npm/tests/unit/maidIntegration.test.js +139 -0
- package/data/probe/npm/tests/unit/maxIterationsWarning.test.js +195 -0
- package/data/probe/npm/tests/unit/mermaidEdgeLabelFix.test.js +161 -0
- package/data/probe/npm/tests/unit/mermaidHtmlEntities.test.js +76 -0
- package/data/probe/npm/tests/unit/mermaidInfiniteLoopFix.test.js +64 -0
- package/data/probe/npm/tests/unit/mermaidValidation.test.js +723 -0
- package/data/probe/npm/tests/unit/mermaidValidationVisorExample.test.js +309 -0
- package/data/probe/npm/tests/unit/probe-agent-clone-realistic.test.js +643 -0
- package/data/probe/npm/tests/unit/probe-agent-clone.test.js +476 -0
- package/data/probe/npm/tests/unit/probe-agent-delegate.test.js +400 -0
- package/data/probe/npm/tests/unit/probe-agent-model-option.test.js +118 -0
- package/data/probe/npm/tests/unit/probeTool-security.test.js +283 -0
- package/data/probe/npm/tests/unit/readImageTool.test.js +418 -0
- package/data/probe/npm/tests/unit/retryManager.test.js +317 -0
- package/data/probe/npm/tests/unit/schema-aware-reminders.test.js +288 -0
- package/data/probe/npm/tests/unit/schemaDefinitionDetection.test.js +115 -0
- package/data/probe/npm/tests/unit/schemaUtils.test.js +1268 -0
- package/data/probe/npm/tests/unit/simpleTelemetry.test.js +282 -0
- package/data/probe/npm/tests/unit/simplified-attempt-completion.test.js +274 -0
- package/data/probe/npm/tests/unit/single-quote-json-bug.test.js +231 -0
- package/data/probe/npm/tests/unit/subgraphAutoFix.test.js +110 -0
- package/data/probe/npm/tests/unit/system-prompt.test.js +32 -0
- package/data/probe/npm/tests/unit/types-probe-agent-options.test.js +42 -0
- package/data/probe/npm/tests/unit/xmlParsing.test.js +720 -0
- package/data/probe/npm/tsconfig.json +21 -0
- package/data/probe/result1.txt +19 -0
- package/data/probe/result2.txt +26 -0
- package/data/probe/scripts/benchmark.sh +270 -0
- package/data/probe/scripts/cache_memory_analysis.rs +844 -0
- package/data/probe/scripts/claude-hook-wrapper.sh +56 -0
- package/data/probe/site/.env.example +10 -0
- package/data/probe/site/DEPLOYMENT.md +86 -0
- package/data/probe/site/README.md +183 -0
- package/data/probe/site/adding-languages.md +135 -0
- package/data/probe/site/ai-chat.md +427 -0
- package/data/probe/site/ai-integration.md +1488 -0
- package/data/probe/site/blog/agentic-flow-custom-xml-protocol.md +407 -0
- package/data/probe/site/blog/index.md +118 -0
- package/data/probe/site/blog/v0.6.0-release.md +426 -0
- package/data/probe/site/blog.md +8 -0
- package/data/probe/site/changelog.md +200 -0
- package/data/probe/site/cli-mode.md +437 -0
- package/data/probe/site/code-extraction.md +436 -0
- package/data/probe/site/contributing/README.md +9 -0
- package/data/probe/site/contributing/documentation-cross-references.md +215 -0
- package/data/probe/site/contributing/documentation-maintenance.md +275 -0
- package/data/probe/site/contributing/documentation-structure.md +75 -0
- package/data/probe/site/documentation-cross-references.md +215 -0
- package/data/probe/site/documentation-guide.md +132 -0
- package/data/probe/site/documentation-maintenance.md +275 -0
- package/data/probe/site/features.md +147 -0
- package/data/probe/site/how-it-works.md +118 -0
- package/data/probe/site/index.md +175 -0
- package/data/probe/site/index.md.bak +133 -0
- package/data/probe/site/installation.md +235 -0
- package/data/probe/site/integrations/docker.md +248 -0
- package/data/probe/site/integrations/github-actions.md +413 -0
- package/data/probe/site/language-support-overview.md +168 -0
- package/data/probe/site/mcp-integration.md +587 -0
- package/data/probe/site/mcp-server.md +304 -0
- package/data/probe/site/navigation-structure.md +76 -0
- package/data/probe/site/nodejs-sdk.md +798 -0
- package/data/probe/site/output-formats.md +625 -0
- package/data/probe/site/package.json +21 -0
- package/data/probe/site/public/_headers +28 -0
- package/data/probe/site/public/_redirects +11 -0
- package/data/probe/site/quick-start.md +289 -0
- package/data/probe/site/search-functionality.md +291 -0
- package/data/probe/site/search-reference.md +291 -0
- package/data/probe/site/supported-languages.md +215 -0
- package/data/probe/site/use-cases/README.md +8 -0
- package/data/probe/site/use-cases/advanced-cli.md +253 -0
- package/data/probe/site/use-cases/ai-code-editors.md +239 -0
- package/data/probe/site/use-cases/building-ai-tools.md +529 -0
- package/data/probe/site/use-cases/cli-ai-workflows.md +285 -0
- package/data/probe/site/use-cases/deploying-probe-web-interface.md +255 -0
- package/data/probe/site/use-cases/integrating-probe-into-ai-code-editors.md +161 -0
- package/data/probe/site/use-cases/nodejs-sdk.md +596 -0
- package/data/probe/site/use-cases/team-chat.md +350 -0
- package/data/probe/site/web-interface.md +434 -0
- package/data/probe/site/wrangler.toml +9 -0
- package/data/probe/test-api-key.sh +1 -0
- package/data/probe/test-probe-implementation/hello.js +7 -0
- package/data/probe/test_cases/demonstrate_early_termination_issues.sh +176 -0
- package/data/probe/test_cases/early_termination_issues.rs +533 -0
- package/data/probe/test_data/test_nested_struct.go +26 -0
- package/data/probe/tests/README.md +286 -0
- package/data/probe/tests/README_search_determinism_tests.md +116 -0
- package/data/probe/tests/adjacent_comment_test.rs +152 -0
- package/data/probe/tests/apostrophe_handling_tests.rs +132 -0
- package/data/probe/tests/block_filtering_with_ast_tests.rs +669 -0
- package/data/probe/tests/block_merging_tests.rs +396 -0
- package/data/probe/tests/c_outline_format_tests.rs +2179 -0
- package/data/probe/tests/cache_invalidation_issues.rs.disabled +682 -0
- package/data/probe/tests/cache_order_tests.rs +147 -0
- package/data/probe/tests/cache_query_scoping_tests.rs +221 -0
- package/data/probe/tests/cli_tests.rs +680 -0
- package/data/probe/tests/comment_context_integration_test.rs +240 -0
- package/data/probe/tests/common.rs +33 -0
- package/data/probe/tests/complex_block_merging_tests.rs +599 -0
- package/data/probe/tests/complex_query_block_filtering_tests.rs +422 -0
- package/data/probe/tests/control_flow_closing_braces_test.rs +91 -0
- package/data/probe/tests/cpp_outline_format_tests.rs +1507 -0
- package/data/probe/tests/csharp_outline_format_tests.rs +941 -0
- package/data/probe/tests/elastic_query_integration_tests.rs +922 -0
- package/data/probe/tests/extract_command_tests.rs +1848 -0
- package/data/probe/tests/extract_deduplication_tests.rs +146 -0
- package/data/probe/tests/extract_input_file_tests.rs +84 -0
- package/data/probe/tests/extract_prompt_tests.rs +102 -0
- package/data/probe/tests/filename_search_tests.rs +96 -0
- package/data/probe/tests/fixtures/user/AssemblyInfo.cs +3 -0
- package/data/probe/tests/github_extract_tests.rs +234 -0
- package/data/probe/tests/go_comment_test.rs +253 -0
- package/data/probe/tests/go_outline_format_tests.rs +2587 -0
- package/data/probe/tests/go_path_resolver_tests.rs +96 -0
- package/data/probe/tests/html_outline_format_tests.rs +637 -0
- package/data/probe/tests/integration_tests.rs +837 -0
- package/data/probe/tests/ip_whitelist_test.rs +148 -0
- package/data/probe/tests/java_outline_format_tests.rs +1611 -0
- package/data/probe/tests/javascript_extract_tests.rs +315 -0
- package/data/probe/tests/javascript_outline_format_tests.rs +1464 -0
- package/data/probe/tests/json_format_tests.rs +436 -0
- package/data/probe/tests/json_schema_validation_tests.rs +450 -0
- package/data/probe/tests/lib_usage.rs +60 -0
- package/data/probe/tests/line_comment_context_extension_test.rs +459 -0
- package/data/probe/tests/line_map_cache_tests.rs +114 -0
- package/data/probe/tests/markdown_integration_tests.rs +190 -0
- package/data/probe/tests/mocks/test_ip_whitelist.go +11 -0
- package/data/probe/tests/mocks/test_object.js +27 -0
- package/data/probe/tests/mocks/test_struct.go +50 -0
- package/data/probe/tests/multi_keyword_pattern_tests.rs +464 -0
- package/data/probe/tests/multi_language_syntax_integration_tests.rs +218 -0
- package/data/probe/tests/multiple_capture_groups_tests.rs +169 -0
- package/data/probe/tests/negative_compound_word_tests.rs +246 -0
- package/data/probe/tests/nested_symbol_extraction_tests.rs +99 -0
- package/data/probe/tests/outline_cross_file_interference_test.rs +335 -0
- package/data/probe/tests/outline_keyword_preservation_test.rs +67 -0
- package/data/probe/tests/output_format_edge_cases_tests.rs +693 -0
- package/data/probe/tests/parallel_extraction_tests.rs +178 -0
- package/data/probe/tests/parallel_search_tests.rs +355 -0
- package/data/probe/tests/path_resolver_tests.rs +698 -0
- package/data/probe/tests/php_outline_format_extended_tests.rs +928 -0
- package/data/probe/tests/php_outline_format_tests.rs +768 -0
- package/data/probe/tests/property_tests.proptest-regressions +9 -0
- package/data/probe/tests/property_tests.rs +118 -0
- package/data/probe/tests/python_outline_format_tests.rs +1538 -0
- package/data/probe/tests/query_command_json_tests.rs +438 -0
- package/data/probe/tests/query_command_tests.rs +232 -0
- package/data/probe/tests/query_command_xml_tests.rs +569 -0
- package/data/probe/tests/quoted_term_with_negative_keyword_tests.rs +216 -0
- package/data/probe/tests/required_terms_filename_tests.rs +116 -0
- package/data/probe/tests/ruby_outline_format_tests.rs +1011 -0
- package/data/probe/tests/rust_line_comment_context_test.rs +151 -0
- package/data/probe/tests/rust_outline_format_enhanced_tests.rs +725 -0
- package/data/probe/tests/rust_outline_format_tests.rs +843 -0
- package/data/probe/tests/schemas/xml_output_schema.xsd +38 -0
- package/data/probe/tests/search_determinism_tests.rs +451 -0
- package/data/probe/tests/search_hints_tests.rs +253 -0
- package/data/probe/tests/special_character_escaping_tests.rs +417 -0
- package/data/probe/tests/stemming_compound_word_filtering_tests.rs +535 -0
- package/data/probe/tests/strict_elastic_syntax_tests.rs +404 -0
- package/data/probe/tests/swift_outline_format_tests.rs +3319 -0
- package/data/probe/tests/symbols_tests.rs +166 -0
- package/data/probe/tests/test_file.rs +45 -0
- package/data/probe/tests/test_tokenize.rs +28 -0
- package/data/probe/tests/timeout_tests.rs +82 -0
- package/data/probe/tests/tokenization_tests.rs +195 -0
- package/data/probe/tests/tokenized_block_filtering_tests.rs +174 -0
- package/data/probe/tests/typescript_extract_tests.rs +214 -0
- package/data/probe/tests/typescript_outline_format_tests.rs +2188 -0
- package/data/probe/tests/xml_format_tests.rs +568 -0
- package/data/probe/tests/xml_schema_validation_tests.rs +497 -0
- package/data/scripts/postinstall.mjs +9 -0
- package/data/scripts/set-version.js +0 -0
- package/data/scripts/wiki-build.sh +111 -0
- package/data/scripts/wiki-deploy.sh +73 -0
- package/data/serve.json +12 -0
- package/data/test/demo-dynamic.html +134 -0
- package/data/test/demo-esm.html +105 -0
- package/data/test/demo-iife.html +78 -0
- package/data/tsconfig.json +7 -0
- package/data/vite.server.ts +483 -0
- package/data/vitest.config.ts +40 -0
- package/data/wiki/Home.md +58 -0
- package/data/wiki/_Sidebar.md +39 -0
- package/docs-mcp.config.json +20 -0
- package/package.json +56 -0
- package/src/config.js +111 -0
- package/src/index.js +395 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for GitHub-specific Mermaid diagram compatibility
|
|
3
|
+
* These tests ensure our validator catches the same errors that cause GitHub to fail with "got 'PS'" errors
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, test, expect } from '@jest/globals';
|
|
7
|
+
import { validateMermaidDiagram } from '../../src/agent/schemaUtils.js';
|
|
8
|
+
|
|
9
|
+
describe('GitHub Mermaid Compatibility Validation', () => {
|
|
10
|
+
describe('GitHub-incompatible patterns that cause "got PS" errors', () => {
|
|
11
|
+
test('should reject single quotes in node labels', async () => {
|
|
12
|
+
const diagramWithSingleQuotes = `graph TD
|
|
13
|
+
A[Start] --> B[Process]
|
|
14
|
+
B --> C{spawn('npx probe-chat')}
|
|
15
|
+
C --> D[End]`;
|
|
16
|
+
|
|
17
|
+
const result = await validateMermaidDiagram(diagramWithSingleQuotes);
|
|
18
|
+
expect(result.isValid).toBe(false);
|
|
19
|
+
// Maid detects this as: "Unclosed '{'. Add a matching '}'."
|
|
20
|
+
expect(result.error).toBeTruthy();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('should reject parentheses in square bracket node labels', async () => {
|
|
24
|
+
const diagramWithParensInBrackets = `flowchart TD
|
|
25
|
+
A[Start] --> B{Read Check Config}
|
|
26
|
+
B --> C[Load Prompt<br/>(file or content)]
|
|
27
|
+
C --> D[End]`;
|
|
28
|
+
|
|
29
|
+
const result = await validateMermaidDiagram(diagramWithParensInBrackets);
|
|
30
|
+
expect(result.isValid).toBe(false);
|
|
31
|
+
// Maid detects HTML tag issue: "unexpected character: -><<-"
|
|
32
|
+
expect(result.error).toBeTruthy();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// REMOVED for maid 0.0.6: This test expected {process<complex>} to be invalid,
|
|
36
|
+
// but maid 0.0.6 now accepts this pattern as valid Mermaid syntax.
|
|
37
|
+
// This is a behavior change in maid 0.0.6 - the parser is more lenient with angle brackets in diamond nodes.
|
|
38
|
+
// Note: This pattern still causes "got PS" errors on GitHub, but maid 0.0.6 validates it as syntactically correct.
|
|
39
|
+
// See: https://github.com/probelabs/maid/issues/18
|
|
40
|
+
|
|
41
|
+
test('should reject multiple problematic patterns in single diagram', async () => {
|
|
42
|
+
const diagramWithMultipleIssues = `graph TD
|
|
43
|
+
A[Start] --> B{spawn('command')}
|
|
44
|
+
B --> C[Process (with details)]
|
|
45
|
+
C --> D{check('<>')}
|
|
46
|
+
D --> E[End]`;
|
|
47
|
+
|
|
48
|
+
const result = await validateMermaidDiagram(diagramWithMultipleIssues);
|
|
49
|
+
expect(result.isValid).toBe(false);
|
|
50
|
+
// Maid detects multiple issues including unclosed braces
|
|
51
|
+
expect(result.error).toBeTruthy();
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
describe('GitHub-compatible patterns', () => {
|
|
56
|
+
test('should accept node labels with double quotes', async () => {
|
|
57
|
+
const compatibleDiagram = `graph TD
|
|
58
|
+
A[Start] --> B["Process with (details)"]
|
|
59
|
+
B --> C{spawn command}
|
|
60
|
+
C --> D[End]`;
|
|
61
|
+
|
|
62
|
+
const result = await validateMermaidDiagram(compatibleDiagram);
|
|
63
|
+
expect(result.isValid).toBe(true);
|
|
64
|
+
expect(result.diagramType).toBe('flowchart');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test('should accept simplified node labels', async () => {
|
|
68
|
+
const simplifiedDiagram = `graph TD
|
|
69
|
+
A[Start] --> B[Process]
|
|
70
|
+
B --> C{spawn npx probe-chat}
|
|
71
|
+
C --> D[End]`;
|
|
72
|
+
|
|
73
|
+
const result = await validateMermaidDiagram(simplifiedDiagram);
|
|
74
|
+
expect(result.isValid).toBe(true);
|
|
75
|
+
expect(result.diagramType).toBe('flowchart');
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test('should accept alternative syntax for complex labels', async () => {
|
|
79
|
+
const alternativeSyntax = `flowchart TD
|
|
80
|
+
A["Start: .visor.yaml"] --> B{Read Check Config}
|
|
81
|
+
B --> C["Load Prompt<br/>from file or content"]
|
|
82
|
+
C --> D{Render Template}
|
|
83
|
+
D --> E[End]`;
|
|
84
|
+
|
|
85
|
+
const result = await validateMermaidDiagram(alternativeSyntax);
|
|
86
|
+
expect(result.isValid).toBe(true);
|
|
87
|
+
expect(result.diagramType).toBe('flowchart');
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('should accept HTML breaks in labels', async () => {
|
|
91
|
+
const diagramWithBreaks = `flowchart TD
|
|
92
|
+
A[Start] --> B["Load Template<br/>Process Data<br/>Generate Output"]
|
|
93
|
+
B --> C[End]`;
|
|
94
|
+
|
|
95
|
+
const result = await validateMermaidDiagram(diagramWithBreaks);
|
|
96
|
+
expect(result.isValid).toBe(true);
|
|
97
|
+
expect(result.diagramType).toBe('flowchart');
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test('should accept subgraph structures', async () => {
|
|
101
|
+
const subgraphDiagram = `graph TD
|
|
102
|
+
subgraph "Before: CLI-based"
|
|
103
|
+
A[Provider] --> B[Service]
|
|
104
|
+
B --> C{spawn command}
|
|
105
|
+
end
|
|
106
|
+
subgraph "After: SDK-based"
|
|
107
|
+
D[Provider] --> E[Service]
|
|
108
|
+
E --> F[SDK]
|
|
109
|
+
end`;
|
|
110
|
+
|
|
111
|
+
const result = await validateMermaidDiagram(subgraphDiagram);
|
|
112
|
+
expect(result.isValid).toBe(true);
|
|
113
|
+
expect(result.diagramType).toBe('flowchart');
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
describe('Real-world GitHub failure cases', () => {
|
|
118
|
+
test('should identify Visor component interaction diagram issues', async () => {
|
|
119
|
+
// This is the actual diagram that fails on GitHub
|
|
120
|
+
const visorComponentDiagram = `graph TD
|
|
121
|
+
subgraph "Before: CLI-based Approach"
|
|
122
|
+
A[AICheckProvider] --> B[AIReviewService]
|
|
123
|
+
B --> C{spawn('npx probe-chat')}
|
|
124
|
+
C --> D[AI API]
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
subgraph "After: Integrated SDK Approach"
|
|
128
|
+
E[AICheckProvider] --> F[AIReviewService]
|
|
129
|
+
F --> G[ProbeAgent SDK]
|
|
130
|
+
G --> H[AI API]
|
|
131
|
+
end`;
|
|
132
|
+
|
|
133
|
+
const result = await validateMermaidDiagram(visorComponentDiagram);
|
|
134
|
+
expect(result.isValid).toBe(false);
|
|
135
|
+
// Maid detects single quotes issue
|
|
136
|
+
expect(result.error).toBeTruthy();
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test('should identify Visor data flow chart issues', async () => {
|
|
140
|
+
// This is the actual diagram that fails on GitHub
|
|
141
|
+
const visorDataFlowDiagram = `flowchart TD
|
|
142
|
+
A[Start: .visor.yaml] --> B{Read Check Config};
|
|
143
|
+
B --> C[Load Prompt<br/>(file or content)];
|
|
144
|
+
C --> D{Render Prompt Template<br/>with PR & Dep Context};
|
|
145
|
+
D --> E[Execute AI Check via ProbeAgent];
|
|
146
|
+
E --> F[Receive Validated JSON Result];
|
|
147
|
+
F --> G[Load Output Template<br/>(from config or default)];
|
|
148
|
+
G --> H{Render Output Template<br/>with JSON Result};
|
|
149
|
+
H --> I[Post Formatted Comment to GitHub];
|
|
150
|
+
I --> J[End];`;
|
|
151
|
+
|
|
152
|
+
const result = await validateMermaidDiagram(visorDataFlowDiagram);
|
|
153
|
+
expect(result.isValid).toBe(false);
|
|
154
|
+
// Maid detects HTML tag and parentheses issues
|
|
155
|
+
expect(result.error).toBeTruthy();
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
test('should validate Visor sequence diagram as GitHub-compatible', async () => {
|
|
159
|
+
// This diagram works fine on GitHub
|
|
160
|
+
// Note: maid 0.0.6 requires trailing newline for sequence diagrams
|
|
161
|
+
const visorSequenceDiagram = `sequenceDiagram
|
|
162
|
+
participant CEE as CheckExecutionEngine
|
|
163
|
+
participant AICP as AICheckProvider
|
|
164
|
+
participant ARS as AIReviewService
|
|
165
|
+
participant PA as ProbeAgent
|
|
166
|
+
participant AI as AI API
|
|
167
|
+
|
|
168
|
+
CEE->>+AICP: execute(checkConfig, prInfo, dependencies)
|
|
169
|
+
AICP->>AICP: Load prompt (from file or content)
|
|
170
|
+
AICP->>AICP: Render Liquid template with context (pr, files, outputs)
|
|
171
|
+
AICP->>+ARS: executeReview(processedPrompt, schema)
|
|
172
|
+
ARS->>+PA: new ProbeAgent(options)
|
|
173
|
+
ARS->>+PA: answer(prompt, { schema })
|
|
174
|
+
PA->>+AI: Send API Request
|
|
175
|
+
AI-->>-PA: Return JSON Response
|
|
176
|
+
PA->>PA: Validate response against schema
|
|
177
|
+
PA-->>-ARS: Return validated JSON
|
|
178
|
+
ARS-->>-AICP: Return ReviewSummary
|
|
179
|
+
AICP-->>-CEE: Return ReviewSummary
|
|
180
|
+
`;
|
|
181
|
+
|
|
182
|
+
const result = await validateMermaidDiagram(visorSequenceDiagram);
|
|
183
|
+
expect(result.isValid).toBe(true);
|
|
184
|
+
expect(result.diagramType).toBe('sequence');
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
describe('Error message quality', () => {
|
|
189
|
+
test('should provide specific fix suggestions', async () => {
|
|
190
|
+
const problematicDiagram = `graph TD
|
|
191
|
+
A[Start] --> B{spawn('cmd')}
|
|
192
|
+
B --> C[Process]`;
|
|
193
|
+
|
|
194
|
+
const result = await validateMermaidDiagram(problematicDiagram);
|
|
195
|
+
expect(result.isValid).toBe(false);
|
|
196
|
+
// Maid provides detailed error messages
|
|
197
|
+
expect(result.error).toBeTruthy();
|
|
198
|
+
expect(result.detailedError).toBeTruthy();
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
test('should identify exact problematic line', async () => {
|
|
202
|
+
const multiLineDiagram = `flowchart TD
|
|
203
|
+
A[Start] --> B[Good Label]
|
|
204
|
+
B --> C[Bad (parens)]
|
|
205
|
+
C --> D[End]`;
|
|
206
|
+
|
|
207
|
+
const result = await validateMermaidDiagram(multiLineDiagram);
|
|
208
|
+
expect(result.isValid).toBe(false);
|
|
209
|
+
// Maid provides line numbers in error messages
|
|
210
|
+
expect(result.error).toContain('line');
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test('should explain GitHub-specific nature of the error', async () => {
|
|
214
|
+
const githubIncompatibleDiagram = `graph TD
|
|
215
|
+
A --> B{complex('expression')}`;
|
|
216
|
+
|
|
217
|
+
const result = await validateMermaidDiagram(githubIncompatibleDiagram);
|
|
218
|
+
expect(result.isValid).toBe(false);
|
|
219
|
+
// Maid detects syntax issues
|
|
220
|
+
expect(result.error).toBeTruthy();
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
describe('Edge cases for GitHub compatibility', () => {
|
|
225
|
+
test('should handle escaped characters properly', async () => {
|
|
226
|
+
// Maid 0.0.5 requires HTML entities instead of escaped quotes
|
|
227
|
+
const diagramWithEscaping = `graph TD
|
|
228
|
+
A[Start] --> B["Process with "quotes""]
|
|
229
|
+
B --> C[End]`;
|
|
230
|
+
|
|
231
|
+
const result = await validateMermaidDiagram(diagramWithEscaping);
|
|
232
|
+
expect(result.isValid).toBe(true);
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
test('should allow text in link labels', async () => {
|
|
236
|
+
// Link labels can contain text (maid 0.0.6 doesn't support parentheses in link labels)
|
|
237
|
+
const diagramWithLinkLabel = `graph TD
|
|
238
|
+
A[Start] --> B[Process]
|
|
239
|
+
B --> C[End]
|
|
240
|
+
A -.->|optional external| C`;
|
|
241
|
+
|
|
242
|
+
const result = await validateMermaidDiagram(diagramWithLinkLabel);
|
|
243
|
+
expect(result.isValid).toBe(true);
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
test('should handle complex but valid patterns', async () => {
|
|
247
|
+
const complexValidDiagram = `flowchart TD
|
|
248
|
+
A["System Start"] --> B{"Decision Point"}
|
|
249
|
+
B -->|Yes| C["Process A"]
|
|
250
|
+
B -->|No| D["Process B"]
|
|
251
|
+
C --> E["Output"]
|
|
252
|
+
D --> E`;
|
|
253
|
+
|
|
254
|
+
const result = await validateMermaidDiagram(complexValidDiagram);
|
|
255
|
+
expect(result.isValid).toBe(true);
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
});
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { describe, test, expect } from '@jest/globals';
|
|
2
|
+
import {
|
|
3
|
+
SUPPORTED_IMAGE_EXTENSIONS,
|
|
4
|
+
IMAGE_MIME_TYPES,
|
|
5
|
+
PROVIDER_UNSUPPORTED_FORMATS,
|
|
6
|
+
getMimeType,
|
|
7
|
+
isFormatSupportedByProvider,
|
|
8
|
+
getSupportedExtensionsForProvider,
|
|
9
|
+
getExtensionPattern
|
|
10
|
+
} from '../../src/agent/imageConfig.js';
|
|
11
|
+
|
|
12
|
+
describe('imageConfig', () => {
|
|
13
|
+
describe('Constants', () => {
|
|
14
|
+
test('SUPPORTED_IMAGE_EXTENSIONS should include standard formats', () => {
|
|
15
|
+
expect(SUPPORTED_IMAGE_EXTENSIONS).toContain('png');
|
|
16
|
+
expect(SUPPORTED_IMAGE_EXTENSIONS).toContain('jpg');
|
|
17
|
+
expect(SUPPORTED_IMAGE_EXTENSIONS).toContain('jpeg');
|
|
18
|
+
expect(SUPPORTED_IMAGE_EXTENSIONS).toContain('webp');
|
|
19
|
+
expect(SUPPORTED_IMAGE_EXTENSIONS).toContain('bmp');
|
|
20
|
+
expect(SUPPORTED_IMAGE_EXTENSIONS).toContain('svg');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('IMAGE_MIME_TYPES should map extensions to correct MIME types', () => {
|
|
24
|
+
expect(IMAGE_MIME_TYPES.png).toBe('image/png');
|
|
25
|
+
expect(IMAGE_MIME_TYPES.jpg).toBe('image/jpeg');
|
|
26
|
+
expect(IMAGE_MIME_TYPES.jpeg).toBe('image/jpeg');
|
|
27
|
+
expect(IMAGE_MIME_TYPES.webp).toBe('image/webp');
|
|
28
|
+
expect(IMAGE_MIME_TYPES.bmp).toBe('image/bmp');
|
|
29
|
+
expect(IMAGE_MIME_TYPES.svg).toBe('image/svg+xml');
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('PROVIDER_UNSUPPORTED_FORMATS should have google provider restrictions', () => {
|
|
33
|
+
expect(PROVIDER_UNSUPPORTED_FORMATS.google).toBeDefined();
|
|
34
|
+
expect(PROVIDER_UNSUPPORTED_FORMATS.google).toContain('svg');
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
describe('getMimeType', () => {
|
|
39
|
+
test('should return correct MIME type for supported extensions', () => {
|
|
40
|
+
expect(getMimeType('png')).toBe('image/png');
|
|
41
|
+
expect(getMimeType('jpg')).toBe('image/jpeg');
|
|
42
|
+
expect(getMimeType('svg')).toBe('image/svg+xml');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('should handle case-insensitive extensions', () => {
|
|
46
|
+
expect(getMimeType('PNG')).toBe('image/png');
|
|
47
|
+
expect(getMimeType('JPG')).toBe('image/jpeg');
|
|
48
|
+
expect(getMimeType('SVG')).toBe('image/svg+xml');
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('should return undefined for unsupported extensions', () => {
|
|
52
|
+
expect(getMimeType('gif')).toBeUndefined();
|
|
53
|
+
expect(getMimeType('tiff')).toBeUndefined();
|
|
54
|
+
expect(getMimeType('pdf')).toBeUndefined();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe('isFormatSupportedByProvider', () => {
|
|
59
|
+
test('should return true for formats supported by all providers', () => {
|
|
60
|
+
expect(isFormatSupportedByProvider('png', 'google')).toBe(true);
|
|
61
|
+
expect(isFormatSupportedByProvider('jpg', 'google')).toBe(true);
|
|
62
|
+
expect(isFormatSupportedByProvider('jpeg', 'google')).toBe(true);
|
|
63
|
+
expect(isFormatSupportedByProvider('webp', 'google')).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('should return false for SVG with Google provider (GitHub issue #305)', () => {
|
|
67
|
+
expect(isFormatSupportedByProvider('svg', 'google')).toBe(false);
|
|
68
|
+
expect(isFormatSupportedByProvider('SVG', 'google')).toBe(false);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test('should return true for SVG with providers that support it', () => {
|
|
72
|
+
expect(isFormatSupportedByProvider('svg', 'anthropic')).toBe(true);
|
|
73
|
+
expect(isFormatSupportedByProvider('svg', 'openai')).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test('should return true for SVG with unknown providers (permissive default)', () => {
|
|
77
|
+
expect(isFormatSupportedByProvider('svg', 'unknown-provider')).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test('should return false for completely unsupported formats', () => {
|
|
81
|
+
expect(isFormatSupportedByProvider('gif', 'google')).toBe(false);
|
|
82
|
+
expect(isFormatSupportedByProvider('tiff', 'anthropic')).toBe(false);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('should handle case-insensitive extensions', () => {
|
|
86
|
+
expect(isFormatSupportedByProvider('PNG', 'google')).toBe(true);
|
|
87
|
+
expect(isFormatSupportedByProvider('SVG', 'google')).toBe(false);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('should handle null/undefined provider gracefully', () => {
|
|
91
|
+
expect(isFormatSupportedByProvider('png', null)).toBe(true);
|
|
92
|
+
expect(isFormatSupportedByProvider('png', undefined)).toBe(true);
|
|
93
|
+
expect(isFormatSupportedByProvider('svg', null)).toBe(true);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('should reject invalid extension parameters', () => {
|
|
97
|
+
expect(isFormatSupportedByProvider(null, 'google')).toBe(false);
|
|
98
|
+
expect(isFormatSupportedByProvider(undefined, 'google')).toBe(false);
|
|
99
|
+
expect(isFormatSupportedByProvider('', 'google')).toBe(false);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test('should reject path traversal attempts in extension', () => {
|
|
103
|
+
expect(isFormatSupportedByProvider('../../../etc/passwd', 'google')).toBe(false);
|
|
104
|
+
expect(isFormatSupportedByProvider('png/../../../etc/passwd', 'google')).toBe(false);
|
|
105
|
+
expect(isFormatSupportedByProvider('..\\..\\windows\\system32', 'google')).toBe(false);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
describe('getSupportedExtensionsForProvider', () => {
|
|
110
|
+
test('should return all extensions for providers without restrictions', () => {
|
|
111
|
+
const anthropicExtensions = getSupportedExtensionsForProvider('anthropic');
|
|
112
|
+
expect(anthropicExtensions).toEqual(SUPPORTED_IMAGE_EXTENSIONS);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test('should exclude SVG for Google provider', () => {
|
|
116
|
+
const googleExtensions = getSupportedExtensionsForProvider('google');
|
|
117
|
+
expect(googleExtensions).not.toContain('svg');
|
|
118
|
+
expect(googleExtensions).toContain('png');
|
|
119
|
+
expect(googleExtensions).toContain('jpg');
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('should return all extensions for unknown providers', () => {
|
|
123
|
+
const unknownExtensions = getSupportedExtensionsForProvider('unknown');
|
|
124
|
+
expect(unknownExtensions).toEqual(SUPPORTED_IMAGE_EXTENSIONS);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test('should handle null/undefined provider gracefully', () => {
|
|
128
|
+
const nullExtensions = getSupportedExtensionsForProvider(null);
|
|
129
|
+
const undefinedExtensions = getSupportedExtensionsForProvider(undefined);
|
|
130
|
+
expect(nullExtensions).toEqual(SUPPORTED_IMAGE_EXTENSIONS);
|
|
131
|
+
expect(undefinedExtensions).toEqual(SUPPORTED_IMAGE_EXTENSIONS);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
describe('getExtensionPattern', () => {
|
|
136
|
+
test('should generate regex pattern for default extensions', () => {
|
|
137
|
+
const pattern = getExtensionPattern();
|
|
138
|
+
expect(pattern).toContain('png');
|
|
139
|
+
expect(pattern).toContain('jpg');
|
|
140
|
+
expect(pattern).toContain('svg');
|
|
141
|
+
expect(pattern).toBe('png|jpg|jpeg|webp|bmp|svg');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test('should generate pattern for custom extensions', () => {
|
|
145
|
+
const pattern = getExtensionPattern(['png', 'jpg']);
|
|
146
|
+
expect(pattern).toBe('png|jpg');
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
});
|