@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,535 @@
|
|
|
1
|
+
use std::collections::{HashMap, HashSet};
|
|
2
|
+
use std::fs;
|
|
3
|
+
use std::path::Path;
|
|
4
|
+
use tempfile::TempDir;
|
|
5
|
+
|
|
6
|
+
use probe_code::search::elastic_query::parse_query_test as parse_query;
|
|
7
|
+
use probe_code::search::file_processing::filter_code_block_with_ast;
|
|
8
|
+
use probe_code::search::query::create_query_plan;
|
|
9
|
+
use probe_code::search::{perform_probe, SearchOptions};
|
|
10
|
+
|
|
11
|
+
/// Test stemming and compound word handling in block filtering with complex queries
|
|
12
|
+
#[test]
|
|
13
|
+
fn test_stemming_in_complex_queries() {
|
|
14
|
+
// Create a temporary directory for testing
|
|
15
|
+
let temp_dir = TempDir::new().unwrap();
|
|
16
|
+
let temp_path = temp_dir.path();
|
|
17
|
+
|
|
18
|
+
// Create test files with content for stemming test
|
|
19
|
+
create_test_files(temp_path);
|
|
20
|
+
|
|
21
|
+
// Test various stemming scenarios
|
|
22
|
+
test_stemming_with_and_query(temp_path);
|
|
23
|
+
test_stemming_with_or_query(temp_path);
|
|
24
|
+
test_stemming_with_complex_query(temp_path);
|
|
25
|
+
test_compound_word_splitting(temp_path);
|
|
26
|
+
test_negative_compound_word_in_existing_tests(temp_path);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/// Create test files with content for stemming tests
|
|
30
|
+
fn create_test_files(temp_dir: &Path) {
|
|
31
|
+
// File with stemming variations: "ip", "ips", "whitelist", "whitelisting"
|
|
32
|
+
let file1_path = temp_dir.join("stemming_variations.go");
|
|
33
|
+
let file1_content = r#"
|
|
34
|
+
package middleware
|
|
35
|
+
|
|
36
|
+
// IPWhiteListMiddleware handles IP whitelisting
|
|
37
|
+
// It processes IPs against the whitelist
|
|
38
|
+
type IPWhiteListMiddleware struct {
|
|
39
|
+
Whitelist []string
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Process implements whitelisting for IPs
|
|
43
|
+
func (i *IPWhiteListMiddleware) Process() {
|
|
44
|
+
// Implementation for IP whitelisting
|
|
45
|
+
}
|
|
46
|
+
"#;
|
|
47
|
+
|
|
48
|
+
// File with compound words: "whitelist", "firewall", "network"
|
|
49
|
+
let file2_path = temp_dir.join("compound_words.go");
|
|
50
|
+
let file2_content = r#"
|
|
51
|
+
package security
|
|
52
|
+
|
|
53
|
+
// FirewallConfig configures the network firewall
|
|
54
|
+
// It includes white list settings for the network
|
|
55
|
+
type FirewallConfig struct {
|
|
56
|
+
NetworkWhitelist []string
|
|
57
|
+
FirewallRules []Rule
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Rule represents a firewall rule
|
|
61
|
+
type Rule struct {
|
|
62
|
+
Name string
|
|
63
|
+
Action string
|
|
64
|
+
}
|
|
65
|
+
"#;
|
|
66
|
+
|
|
67
|
+
// Write files to disk
|
|
68
|
+
fs::write(file1_path, file1_content).unwrap();
|
|
69
|
+
fs::write(file2_path, file2_content).unwrap();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/// Test stemming with AND query: "ips AND whitelisting"
|
|
73
|
+
fn test_stemming_with_and_query(temp_path: &Path) {
|
|
74
|
+
// Enable debug mode
|
|
75
|
+
std::env::set_var("DEBUG", "1");
|
|
76
|
+
println!("\n=== Testing stemming with AND query: ips AND whitelisting ===");
|
|
77
|
+
|
|
78
|
+
// Create the query
|
|
79
|
+
let query = "ips AND whitelisting";
|
|
80
|
+
let queries = vec![query.to_string()];
|
|
81
|
+
let custom_ignores: Vec<String> = vec![];
|
|
82
|
+
|
|
83
|
+
// Create SearchOptions with stemming enabled (exact=false)
|
|
84
|
+
let options = SearchOptions {
|
|
85
|
+
path: temp_path,
|
|
86
|
+
queries: &queries,
|
|
87
|
+
files_only: false,
|
|
88
|
+
custom_ignores: &custom_ignores,
|
|
89
|
+
exclude_filenames: false,
|
|
90
|
+
language: None,
|
|
91
|
+
reranker: "hybrid",
|
|
92
|
+
frequency_search: true,
|
|
93
|
+
max_results: None,
|
|
94
|
+
max_bytes: None,
|
|
95
|
+
max_tokens: None,
|
|
96
|
+
allow_tests: true,
|
|
97
|
+
no_merge: true,
|
|
98
|
+
merge_threshold: None,
|
|
99
|
+
dry_run: false,
|
|
100
|
+
session: None,
|
|
101
|
+
timeout: 30,
|
|
102
|
+
question: None,
|
|
103
|
+
exact: false,
|
|
104
|
+
no_gitignore: false,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// Run the search
|
|
108
|
+
let search_results = perform_probe(&options).unwrap();
|
|
109
|
+
|
|
110
|
+
// Check that we got results
|
|
111
|
+
assert!(
|
|
112
|
+
!search_results.results.is_empty(),
|
|
113
|
+
"Search should return results with stemming"
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
// Check that we found the file with stemming variations
|
|
117
|
+
let found_file = search_results
|
|
118
|
+
.results
|
|
119
|
+
.iter()
|
|
120
|
+
.any(|r| r.file.contains("stemming_variations.go"));
|
|
121
|
+
assert!(
|
|
122
|
+
found_file,
|
|
123
|
+
"Should find stemming_variations.go with stemmed terms"
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
// Now test the filter_code_block_with_ast function directly
|
|
127
|
+
// Create a QueryPlan
|
|
128
|
+
let plan = create_query_plan(query, false).unwrap();
|
|
129
|
+
|
|
130
|
+
// Get the term indices from the QueryPlan
|
|
131
|
+
let term_indices = &plan.term_indices;
|
|
132
|
+
|
|
133
|
+
// Create term matches
|
|
134
|
+
let mut term_matches = HashMap::new();
|
|
135
|
+
|
|
136
|
+
// Add "ip" matches
|
|
137
|
+
let mut ip_lines = HashSet::new();
|
|
138
|
+
ip_lines.insert(4); // Line with "IPs"
|
|
139
|
+
term_matches.insert(*term_indices.get("ip").unwrap(), ip_lines);
|
|
140
|
+
|
|
141
|
+
// Add "whitelist" matches
|
|
142
|
+
let mut whitelist_lines = HashSet::new();
|
|
143
|
+
whitelist_lines.insert(5); // Line with "whitelist"
|
|
144
|
+
term_matches.insert(*term_indices.get("whitelist").unwrap(), whitelist_lines);
|
|
145
|
+
|
|
146
|
+
// Block lines
|
|
147
|
+
let block_lines = (1, 10);
|
|
148
|
+
|
|
149
|
+
// Test filtering
|
|
150
|
+
let result = filter_code_block_with_ast(block_lines, &term_matches, &plan, true);
|
|
151
|
+
assert!(result, "Block with stemmed terms 'ip' and 'whitelist' should match the query 'ips AND whitelisting'");
|
|
152
|
+
println!("✓ Block with stemmed terms matches the AND query");
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/// Test stemming with OR query: "ips OR whitelisting"
|
|
156
|
+
fn test_stemming_with_or_query(temp_path: &Path) {
|
|
157
|
+
println!("\n=== Testing stemming with OR query: ips OR whitelisting ===");
|
|
158
|
+
|
|
159
|
+
// Create the query
|
|
160
|
+
let query = "ips OR whitelisting";
|
|
161
|
+
let queries = vec![query.to_string()];
|
|
162
|
+
let custom_ignores: Vec<String> = vec![];
|
|
163
|
+
|
|
164
|
+
// Create SearchOptions with stemming enabled (exact=false)
|
|
165
|
+
let options = SearchOptions {
|
|
166
|
+
path: temp_path,
|
|
167
|
+
queries: &queries,
|
|
168
|
+
files_only: false,
|
|
169
|
+
custom_ignores: &custom_ignores,
|
|
170
|
+
exclude_filenames: false,
|
|
171
|
+
language: None,
|
|
172
|
+
reranker: "hybrid",
|
|
173
|
+
frequency_search: true,
|
|
174
|
+
max_results: None,
|
|
175
|
+
max_bytes: None,
|
|
176
|
+
max_tokens: None,
|
|
177
|
+
allow_tests: true,
|
|
178
|
+
// Use any term mode
|
|
179
|
+
no_merge: true,
|
|
180
|
+
merge_threshold: None,
|
|
181
|
+
dry_run: false,
|
|
182
|
+
session: None,
|
|
183
|
+
timeout: 30,
|
|
184
|
+
question: None,
|
|
185
|
+
exact: false,
|
|
186
|
+
no_gitignore: false,
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
// Run the search
|
|
190
|
+
let search_results = perform_probe(&options).unwrap();
|
|
191
|
+
|
|
192
|
+
// Check that we got results
|
|
193
|
+
assert!(
|
|
194
|
+
!search_results.results.is_empty(),
|
|
195
|
+
"Search should return results with stemming"
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
// Check that we found both files
|
|
199
|
+
let found_file1 = search_results
|
|
200
|
+
.results
|
|
201
|
+
.iter()
|
|
202
|
+
.any(|r| r.file.contains("stemming_variations.go"));
|
|
203
|
+
assert!(
|
|
204
|
+
found_file1,
|
|
205
|
+
"Should find stemming_variations.go with stemmed terms"
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
// Now test the filter_code_block_with_ast function directly
|
|
209
|
+
// Create a QueryPlan
|
|
210
|
+
let plan = create_query_plan(query, false).unwrap();
|
|
211
|
+
|
|
212
|
+
// Get the term indices from the QueryPlan
|
|
213
|
+
let term_indices = &plan.term_indices;
|
|
214
|
+
|
|
215
|
+
// Test case 1: Block with only "ip" (should match OR query)
|
|
216
|
+
{
|
|
217
|
+
let mut term_matches = HashMap::new();
|
|
218
|
+
|
|
219
|
+
// Add only "ip" matches
|
|
220
|
+
let mut ip_lines = HashSet::new();
|
|
221
|
+
ip_lines.insert(4);
|
|
222
|
+
term_matches.insert(*term_indices.get("ip").unwrap(), ip_lines);
|
|
223
|
+
|
|
224
|
+
// Block lines
|
|
225
|
+
let block_lines = (1, 10);
|
|
226
|
+
|
|
227
|
+
// Test filtering
|
|
228
|
+
let result = filter_code_block_with_ast(block_lines, &term_matches, &plan, true);
|
|
229
|
+
assert!(
|
|
230
|
+
result,
|
|
231
|
+
"Block with only stemmed term 'ip' should match the OR query"
|
|
232
|
+
);
|
|
233
|
+
println!("✓ Block with only stemmed term 'ip' matches the OR query");
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Test case 2: Block with only "whitelist" (should match OR query)
|
|
237
|
+
{
|
|
238
|
+
let mut term_matches = HashMap::new();
|
|
239
|
+
|
|
240
|
+
// Add only "whitelist" matches
|
|
241
|
+
let mut whitelist_lines = HashSet::new();
|
|
242
|
+
whitelist_lines.insert(5);
|
|
243
|
+
term_matches.insert(*term_indices.get("whitelist").unwrap(), whitelist_lines);
|
|
244
|
+
|
|
245
|
+
// Block lines
|
|
246
|
+
let block_lines = (1, 10);
|
|
247
|
+
|
|
248
|
+
// Test filtering
|
|
249
|
+
let result = filter_code_block_with_ast(block_lines, &term_matches, &plan, true);
|
|
250
|
+
assert!(
|
|
251
|
+
result,
|
|
252
|
+
"Block with only stemmed term 'whitelist' should match the OR query"
|
|
253
|
+
);
|
|
254
|
+
println!("✓ Block with only stemmed term 'whitelist' matches the OR query");
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/// Test stemming with complex query: "(ips OR ports) AND (whitelisting OR security) AND -blocking"
|
|
259
|
+
fn test_stemming_with_complex_query(_temp_path: &Path) {
|
|
260
|
+
println!("\n=== Testing stemming with complex query: (ips OR ports) AND (whitelisting OR security) AND -blocking ===");
|
|
261
|
+
|
|
262
|
+
// Create the query
|
|
263
|
+
let query = "(ips OR ports) AND (whitelisting OR security) AND -blocking";
|
|
264
|
+
|
|
265
|
+
// Parse the query into an AST
|
|
266
|
+
// Using standard Elasticsearch behavior (AND for implicit combinations)
|
|
267
|
+
let ast = parse_query(query).unwrap();
|
|
268
|
+
println!("Parsed AST: {ast:?}");
|
|
269
|
+
|
|
270
|
+
// Create a QueryPlan
|
|
271
|
+
let plan = create_query_plan(query, false).unwrap();
|
|
272
|
+
|
|
273
|
+
// Get the term indices from the QueryPlan
|
|
274
|
+
let term_indices = &plan.term_indices;
|
|
275
|
+
|
|
276
|
+
// Test case 1: Block with "ip" and "whitelist" (should match)
|
|
277
|
+
{
|
|
278
|
+
let mut term_matches = HashMap::new();
|
|
279
|
+
|
|
280
|
+
// Add "ip" matches
|
|
281
|
+
let mut ip_lines = HashSet::new();
|
|
282
|
+
ip_lines.insert(3);
|
|
283
|
+
term_matches.insert(*term_indices.get("ip").unwrap(), ip_lines);
|
|
284
|
+
|
|
285
|
+
// Add "whitelist" matches
|
|
286
|
+
let mut whitelist_lines = HashSet::new();
|
|
287
|
+
whitelist_lines.insert(4);
|
|
288
|
+
term_matches.insert(*term_indices.get("whitelist").unwrap(), whitelist_lines);
|
|
289
|
+
|
|
290
|
+
// Block lines
|
|
291
|
+
let block_lines = (1, 10);
|
|
292
|
+
|
|
293
|
+
// Test filtering
|
|
294
|
+
let result = filter_code_block_with_ast(block_lines, &term_matches, &plan, true);
|
|
295
|
+
assert!(
|
|
296
|
+
result,
|
|
297
|
+
"Block with stemmed terms 'ip' and 'whitelist' should match the complex query"
|
|
298
|
+
);
|
|
299
|
+
println!("✓ Block with stemmed terms 'ip' and 'whitelist' matches the complex query");
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Test case 2: Block with "port" and "security" (should match)
|
|
303
|
+
{
|
|
304
|
+
let mut term_matches = HashMap::new();
|
|
305
|
+
|
|
306
|
+
// Add "port" matches
|
|
307
|
+
let mut port_lines = HashSet::new();
|
|
308
|
+
port_lines.insert(3);
|
|
309
|
+
term_matches.insert(*term_indices.get("port").unwrap(), port_lines);
|
|
310
|
+
|
|
311
|
+
// Add "secur" matches (stemmed form of "security")
|
|
312
|
+
let mut security_lines = HashSet::new();
|
|
313
|
+
security_lines.insert(4);
|
|
314
|
+
term_matches.insert(*term_indices.get("secur").unwrap(), security_lines);
|
|
315
|
+
|
|
316
|
+
// Block lines
|
|
317
|
+
let block_lines = (1, 10);
|
|
318
|
+
|
|
319
|
+
// Test filtering
|
|
320
|
+
let result = filter_code_block_with_ast(block_lines, &term_matches, &plan, true);
|
|
321
|
+
assert!(
|
|
322
|
+
result,
|
|
323
|
+
"Block with stemmed terms 'port' and 'security' should match the complex query"
|
|
324
|
+
);
|
|
325
|
+
println!("✓ Block with stemmed terms 'port' and 'security' matches the complex query");
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Test case 3: Block with "ip", "whitelist", and "block" (should NOT match due to -blocking)
|
|
329
|
+
{
|
|
330
|
+
let mut term_matches = HashMap::new();
|
|
331
|
+
|
|
332
|
+
// Add "ip" matches
|
|
333
|
+
let mut ip_lines = HashSet::new();
|
|
334
|
+
ip_lines.insert(3);
|
|
335
|
+
term_matches.insert(*term_indices.get("ip").unwrap(), ip_lines);
|
|
336
|
+
|
|
337
|
+
// Add "whitelist" matches
|
|
338
|
+
let mut whitelist_lines = HashSet::new();
|
|
339
|
+
whitelist_lines.insert(4);
|
|
340
|
+
term_matches.insert(*term_indices.get("whitelist").unwrap(), whitelist_lines);
|
|
341
|
+
|
|
342
|
+
// Add "blocking" matches (the exact term used in the query)
|
|
343
|
+
let mut block_lines = HashSet::new();
|
|
344
|
+
block_lines.insert(5);
|
|
345
|
+
term_matches.insert(*term_indices.get("blocking").unwrap(), block_lines);
|
|
346
|
+
|
|
347
|
+
// Block lines
|
|
348
|
+
let block_lines = (1, 10);
|
|
349
|
+
|
|
350
|
+
// Test filtering
|
|
351
|
+
let result = filter_code_block_with_ast(block_lines, &term_matches, &plan, true);
|
|
352
|
+
assert!(
|
|
353
|
+
!result,
|
|
354
|
+
"Block with 'ip', 'whitelist', and 'block' should NOT match due to -blocking"
|
|
355
|
+
);
|
|
356
|
+
println!("✓ Block with 'ip', 'whitelist', and 'block' doesn't match due to -blocking");
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/// Test compound word splitting: "networkfirewall"
|
|
361
|
+
fn test_compound_word_splitting(temp_path: &Path) {
|
|
362
|
+
println!("\n=== Testing compound word splitting: networkfirewall ===");
|
|
363
|
+
|
|
364
|
+
// Create the query
|
|
365
|
+
let query = "networkfirewall";
|
|
366
|
+
let queries = vec![query.to_string()];
|
|
367
|
+
let custom_ignores: Vec<String> = vec![];
|
|
368
|
+
|
|
369
|
+
// Create SearchOptions with stemming and compound word splitting enabled
|
|
370
|
+
let options = SearchOptions {
|
|
371
|
+
path: temp_path,
|
|
372
|
+
queries: &queries,
|
|
373
|
+
files_only: false,
|
|
374
|
+
custom_ignores: &custom_ignores,
|
|
375
|
+
exclude_filenames: false,
|
|
376
|
+
language: None,
|
|
377
|
+
reranker: "hybrid",
|
|
378
|
+
frequency_search: true,
|
|
379
|
+
max_results: None,
|
|
380
|
+
max_bytes: None,
|
|
381
|
+
max_tokens: None,
|
|
382
|
+
allow_tests: true,
|
|
383
|
+
no_merge: true,
|
|
384
|
+
merge_threshold: None,
|
|
385
|
+
dry_run: false,
|
|
386
|
+
session: None,
|
|
387
|
+
timeout: 30,
|
|
388
|
+
question: None,
|
|
389
|
+
exact: false,
|
|
390
|
+
no_gitignore: false,
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
// Run the search
|
|
394
|
+
let search_results = perform_probe(&options).unwrap();
|
|
395
|
+
|
|
396
|
+
// Check that we got results
|
|
397
|
+
assert!(
|
|
398
|
+
!search_results.results.is_empty(),
|
|
399
|
+
"Search should return results with compound word splitting"
|
|
400
|
+
);
|
|
401
|
+
|
|
402
|
+
// Check that we found the file with "network" and "firewall"
|
|
403
|
+
let found_file = search_results
|
|
404
|
+
.results
|
|
405
|
+
.iter()
|
|
406
|
+
.any(|r| r.file.contains("compound_words.go"));
|
|
407
|
+
assert!(
|
|
408
|
+
found_file,
|
|
409
|
+
"Should find compound_words.go with split compound word"
|
|
410
|
+
);
|
|
411
|
+
|
|
412
|
+
// Now test with a more complex query: "network AND firewall"
|
|
413
|
+
let complex_query = "network AND firewall";
|
|
414
|
+
let complex_queries = vec![complex_query.to_string()];
|
|
415
|
+
|
|
416
|
+
let complex_options = SearchOptions {
|
|
417
|
+
path: temp_path,
|
|
418
|
+
queries: &complex_queries,
|
|
419
|
+
files_only: false,
|
|
420
|
+
custom_ignores: &custom_ignores,
|
|
421
|
+
exclude_filenames: false,
|
|
422
|
+
language: None,
|
|
423
|
+
reranker: "hybrid",
|
|
424
|
+
frequency_search: true,
|
|
425
|
+
max_results: None,
|
|
426
|
+
max_bytes: None,
|
|
427
|
+
max_tokens: None,
|
|
428
|
+
allow_tests: true,
|
|
429
|
+
// Use all terms mode
|
|
430
|
+
no_merge: true,
|
|
431
|
+
merge_threshold: None,
|
|
432
|
+
dry_run: false,
|
|
433
|
+
session: None,
|
|
434
|
+
timeout: 30,
|
|
435
|
+
question: None,
|
|
436
|
+
exact: false,
|
|
437
|
+
no_gitignore: false,
|
|
438
|
+
};
|
|
439
|
+
|
|
440
|
+
// Run the search
|
|
441
|
+
let complex_results = perform_probe(&complex_options).unwrap();
|
|
442
|
+
|
|
443
|
+
// Check that we got results
|
|
444
|
+
assert!(
|
|
445
|
+
!complex_results.results.is_empty(),
|
|
446
|
+
"Search should return results with AND query on compound words"
|
|
447
|
+
);
|
|
448
|
+
|
|
449
|
+
// Check that we found the file with both "network" and "firewall"
|
|
450
|
+
let found_complex_file = complex_results
|
|
451
|
+
.results
|
|
452
|
+
.iter()
|
|
453
|
+
.any(|r| r.file.contains("compound_words.go"));
|
|
454
|
+
assert!(
|
|
455
|
+
found_complex_file,
|
|
456
|
+
"Should find compound_words.go with AND query on compound words"
|
|
457
|
+
);
|
|
458
|
+
|
|
459
|
+
// Reset debug mode
|
|
460
|
+
std::env::remove_var("DEBUG");
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/// Test negative compound word in existing tests: "-networkfirewall"
|
|
464
|
+
fn test_negative_compound_word_in_existing_tests(temp_path: &Path) {
|
|
465
|
+
println!("\n=== Testing negative compound word in existing tests: -networkfirewall ===");
|
|
466
|
+
|
|
467
|
+
// Enable debug mode
|
|
468
|
+
std::env::set_var("DEBUG", "1");
|
|
469
|
+
|
|
470
|
+
// Create the query
|
|
471
|
+
let query = "-networkfirewall";
|
|
472
|
+
let queries = vec![query.to_string()];
|
|
473
|
+
let custom_ignores: Vec<String> = vec![];
|
|
474
|
+
|
|
475
|
+
// Create SearchOptions
|
|
476
|
+
let options = SearchOptions {
|
|
477
|
+
path: temp_path,
|
|
478
|
+
queries: &queries,
|
|
479
|
+
files_only: false,
|
|
480
|
+
custom_ignores: &custom_ignores,
|
|
481
|
+
exclude_filenames: false,
|
|
482
|
+
language: None,
|
|
483
|
+
reranker: "hybrid",
|
|
484
|
+
frequency_search: true,
|
|
485
|
+
max_results: None,
|
|
486
|
+
max_bytes: None,
|
|
487
|
+
max_tokens: None,
|
|
488
|
+
allow_tests: true,
|
|
489
|
+
no_merge: true,
|
|
490
|
+
merge_threshold: None,
|
|
491
|
+
dry_run: false,
|
|
492
|
+
session: None,
|
|
493
|
+
timeout: 30,
|
|
494
|
+
question: None,
|
|
495
|
+
exact: false,
|
|
496
|
+
no_gitignore: false,
|
|
497
|
+
};
|
|
498
|
+
|
|
499
|
+
// Run the search
|
|
500
|
+
let search_results = perform_probe(&options).unwrap();
|
|
501
|
+
|
|
502
|
+
// Check that we didn't find the file with "network" and "firewall"
|
|
503
|
+
let found_file = search_results
|
|
504
|
+
.results
|
|
505
|
+
.iter()
|
|
506
|
+
.any(|r| r.file.contains("compound_words.go"));
|
|
507
|
+
assert!(
|
|
508
|
+
!found_file,
|
|
509
|
+
"Should NOT find compound_words.go with negative compound word"
|
|
510
|
+
);
|
|
511
|
+
println!("✓ Negative compound word properly excludes files with compound parts");
|
|
512
|
+
|
|
513
|
+
// Test excluded terms extraction directly using QueryPlan
|
|
514
|
+
let plan = create_query_plan(query, false).unwrap();
|
|
515
|
+
|
|
516
|
+
// Check that the original term is in the excluded_terms set
|
|
517
|
+
assert!(
|
|
518
|
+
plan.excluded_terms.contains("networkfirewall"),
|
|
519
|
+
"Original term 'networkfirewall' should be in excluded_terms"
|
|
520
|
+
);
|
|
521
|
+
|
|
522
|
+
// We don't split excluded terms, so compound parts should not be in the excluded terms set
|
|
523
|
+
assert!(
|
|
524
|
+
!plan.excluded_terms.contains("network"),
|
|
525
|
+
"Compound part 'network' should not be in excluded_terms"
|
|
526
|
+
);
|
|
527
|
+
assert!(
|
|
528
|
+
!plan.excluded_terms.contains("firewall"),
|
|
529
|
+
"Compound part 'firewall' should not be in excluded_terms"
|
|
530
|
+
);
|
|
531
|
+
println!("✓ Excluded terms extraction properly handles compound words");
|
|
532
|
+
|
|
533
|
+
// Reset debug mode
|
|
534
|
+
std::env::remove_var("DEBUG");
|
|
535
|
+
}
|