@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,693 @@
|
|
|
1
|
+
use roxmltree::{Document, Node};
|
|
2
|
+
use serde_json::Value;
|
|
3
|
+
use std::fs::{self, File};
|
|
4
|
+
use std::io::Write;
|
|
5
|
+
use std::path::PathBuf;
|
|
6
|
+
use std::process::Command;
|
|
7
|
+
use tempfile::TempDir;
|
|
8
|
+
|
|
9
|
+
// Helper function to extract JSON from command output
|
|
10
|
+
fn extract_json_from_output(output: &str) -> &str {
|
|
11
|
+
// Find the first occurrence of '{'
|
|
12
|
+
if let Some(start_index) = output.find('{') {
|
|
13
|
+
// Return the substring from the first '{' to the end
|
|
14
|
+
&output[start_index..]
|
|
15
|
+
} else {
|
|
16
|
+
// If no '{' is found, return the original string
|
|
17
|
+
output
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Helper function to extract XML from command output
|
|
22
|
+
fn extract_xml_from_output(output: &str) -> &str {
|
|
23
|
+
// Find the first occurrence of '<?xml'
|
|
24
|
+
if let Some(start_index) = output.find("<?xml") {
|
|
25
|
+
// Return the substring from the first '<?xml' to the end
|
|
26
|
+
&output[start_index..]
|
|
27
|
+
} else {
|
|
28
|
+
// If no '<?xml' is found, return the original string
|
|
29
|
+
output
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Helper function to create test files
|
|
34
|
+
fn create_test_file(dir: &TempDir, filename: &str, content: &str) -> PathBuf {
|
|
35
|
+
let file_path = dir.path().join(filename);
|
|
36
|
+
let parent_dir = file_path.parent().unwrap();
|
|
37
|
+
fs::create_dir_all(parent_dir).expect("Failed to create parent directories");
|
|
38
|
+
let mut file = File::create(&file_path).expect("Failed to create test file");
|
|
39
|
+
file.write_all(content.as_bytes())
|
|
40
|
+
.expect("Failed to write test content");
|
|
41
|
+
file_path
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Helper function to create a test directory with edge case files
|
|
45
|
+
fn create_edge_case_test_files(root_dir: &TempDir) {
|
|
46
|
+
// Create a source directory
|
|
47
|
+
let src_dir = root_dir.path().join("src");
|
|
48
|
+
fs::create_dir(&src_dir).expect("Failed to create src directory");
|
|
49
|
+
|
|
50
|
+
// File with extremely long lines
|
|
51
|
+
let long_line_content = format!(
|
|
52
|
+
r#"
|
|
53
|
+
// This file contains an extremely long line
|
|
54
|
+
function longLine() {{
|
|
55
|
+
const longString = "{}";
|
|
56
|
+
return longString;
|
|
57
|
+
}}
|
|
58
|
+
"#,
|
|
59
|
+
"x".repeat(10000) // Create a very long string
|
|
60
|
+
);
|
|
61
|
+
create_test_file(root_dir, "src/long_line.js", &long_line_content);
|
|
62
|
+
|
|
63
|
+
// File with a large number of short lines
|
|
64
|
+
let mut many_lines_content = String::from(
|
|
65
|
+
r#"
|
|
66
|
+
// This file contains many short lines
|
|
67
|
+
function manyLines() {
|
|
68
|
+
const lines = [
|
|
69
|
+
"#,
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
for i in 0..1000 {
|
|
73
|
+
many_lines_content.push_str(&format!(" \"Line {i}\",\n"));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
many_lines_content.push_str(
|
|
77
|
+
r#" ];
|
|
78
|
+
return lines;
|
|
79
|
+
}
|
|
80
|
+
"#,
|
|
81
|
+
);
|
|
82
|
+
create_test_file(root_dir, "src/many_lines.js", &many_lines_content);
|
|
83
|
+
|
|
84
|
+
// File with nested structures
|
|
85
|
+
let nested_content = r#"
|
|
86
|
+
// This file contains deeply nested structures
|
|
87
|
+
function nestedStructure() {
|
|
88
|
+
const nested = {
|
|
89
|
+
level1: {
|
|
90
|
+
level2: {
|
|
91
|
+
level3: {
|
|
92
|
+
level4: {
|
|
93
|
+
level5: {
|
|
94
|
+
level6: {
|
|
95
|
+
level7: {
|
|
96
|
+
level8: {
|
|
97
|
+
level9: {
|
|
98
|
+
level10: {
|
|
99
|
+
value: "deeply nested"
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
return nested;
|
|
112
|
+
}
|
|
113
|
+
"#;
|
|
114
|
+
create_test_file(root_dir, "src/nested_structure.js", nested_content);
|
|
115
|
+
|
|
116
|
+
// File with binary data representation
|
|
117
|
+
let binary_content = r#"
|
|
118
|
+
// This file contains binary data representation
|
|
119
|
+
function binaryData() {
|
|
120
|
+
const buffer = new Uint8Array([
|
|
121
|
+
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
|
122
|
+
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
|
|
123
|
+
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
|
|
124
|
+
0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
|
|
125
|
+
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
|
|
126
|
+
0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
|
|
127
|
+
0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86,
|
|
128
|
+
0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,
|
|
129
|
+
0xFF
|
|
130
|
+
]);
|
|
131
|
+
return buffer;
|
|
132
|
+
}
|
|
133
|
+
"#;
|
|
134
|
+
create_test_file(root_dir, "src/binary_data.js", binary_content);
|
|
135
|
+
|
|
136
|
+
// File with zero-width characters and other invisible characters
|
|
137
|
+
let invisible_chars_content = r#"
|
|
138
|
+
// This file contains zero-width and invisible characters
|
|
139
|
+
function invisibleChars() {
|
|
140
|
+
// Zero-width space (U+200B): "\u{200B}"
|
|
141
|
+
// Zero-width non-joiner (U+200C): ""
|
|
142
|
+
// Zero-width joiner (U+200D): ""
|
|
143
|
+
// Left-to-right mark (U+200E): ""
|
|
144
|
+
// Right-to-left mark (U+200F): ""
|
|
145
|
+
|
|
146
|
+
const text = "This\u{200B} has invisible characters in it";
|
|
147
|
+
return text;
|
|
148
|
+
}
|
|
149
|
+
"#;
|
|
150
|
+
create_test_file(root_dir, "src/invisible_chars.js", invisible_chars_content);
|
|
151
|
+
|
|
152
|
+
// File with mixed encodings
|
|
153
|
+
let mixed_encodings_content = r#"
|
|
154
|
+
// This file contains characters from different encodings
|
|
155
|
+
function mixedEncodings() {
|
|
156
|
+
// Latin: "Hello, World!"
|
|
157
|
+
// Cyrillic: "Привет, мир!"
|
|
158
|
+
// Greek: "Γειά σου, κόσμε!"
|
|
159
|
+
// Arabic: "مرحبا بالعالم!"
|
|
160
|
+
// Hebrew: "שלום, עולם!"
|
|
161
|
+
// Chinese: "你好,世界!"
|
|
162
|
+
// Japanese: "こんにちは、世界!"
|
|
163
|
+
// Korean: "안녕하세요, 세계!"
|
|
164
|
+
// Thai: "สวัสดี, โลก!"
|
|
165
|
+
|
|
166
|
+
const greetings = [
|
|
167
|
+
"Hello, World!",
|
|
168
|
+
"Привет, мир!",
|
|
169
|
+
"Γειά σου, κόσμε!",
|
|
170
|
+
"مرحبا بالعالم!",
|
|
171
|
+
"שלום, עולם!",
|
|
172
|
+
"你好,世界!",
|
|
173
|
+
"こんにちは、世界!",
|
|
174
|
+
"안녕하세요, 세계!",
|
|
175
|
+
"สวัสดี, โลก!"
|
|
176
|
+
];
|
|
177
|
+
|
|
178
|
+
return greetings;
|
|
179
|
+
}
|
|
180
|
+
"#;
|
|
181
|
+
create_test_file(root_dir, "src/mixed_encodings.js", mixed_encodings_content);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
#[test]
|
|
185
|
+
fn test_json_output_with_long_lines() {
|
|
186
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
187
|
+
create_edge_case_test_files(&temp_dir);
|
|
188
|
+
|
|
189
|
+
// Run the CLI with JSON output format, searching for "longLine"
|
|
190
|
+
let output = Command::new("cargo")
|
|
191
|
+
.args([
|
|
192
|
+
"run",
|
|
193
|
+
"--",
|
|
194
|
+
"search",
|
|
195
|
+
"longLine", // Pattern to search for
|
|
196
|
+
temp_dir.path().to_str().unwrap(),
|
|
197
|
+
"--format",
|
|
198
|
+
"json",
|
|
199
|
+
])
|
|
200
|
+
.output()
|
|
201
|
+
.expect("Failed to execute command");
|
|
202
|
+
|
|
203
|
+
// Check that the command succeeded
|
|
204
|
+
assert!(output.status.success());
|
|
205
|
+
|
|
206
|
+
// Convert stdout to string
|
|
207
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
208
|
+
|
|
209
|
+
// Extract the JSON part from the output
|
|
210
|
+
let json_str = extract_json_from_output(&stdout);
|
|
211
|
+
|
|
212
|
+
// Parse the JSON output
|
|
213
|
+
let json_result: Value =
|
|
214
|
+
serde_json::from_str(json_str).expect("Failed to parse JSON output with long lines");
|
|
215
|
+
|
|
216
|
+
// Find the result with long lines
|
|
217
|
+
let results = json_result.get("results").unwrap().as_array().unwrap();
|
|
218
|
+
let long_line_result = results.iter().find(|r| {
|
|
219
|
+
r.get("file")
|
|
220
|
+
.unwrap()
|
|
221
|
+
.as_str()
|
|
222
|
+
.unwrap()
|
|
223
|
+
.contains("long_line.js")
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
assert!(
|
|
227
|
+
long_line_result.is_some(),
|
|
228
|
+
"Should find the long_line.js file"
|
|
229
|
+
);
|
|
230
|
+
|
|
231
|
+
// Verify that the long line is properly handled in the JSON
|
|
232
|
+
let code = long_line_result
|
|
233
|
+
.unwrap()
|
|
234
|
+
.get("code")
|
|
235
|
+
.unwrap()
|
|
236
|
+
.as_str()
|
|
237
|
+
.unwrap();
|
|
238
|
+
assert!(
|
|
239
|
+
code.contains("longLine"),
|
|
240
|
+
"Should contain the function name"
|
|
241
|
+
);
|
|
242
|
+
assert!(
|
|
243
|
+
code.contains("longString"),
|
|
244
|
+
"Should contain the variable name"
|
|
245
|
+
);
|
|
246
|
+
|
|
247
|
+
// Check that the JSON is valid with the long line
|
|
248
|
+
let code_json = serde_json::json!({ "code": code });
|
|
249
|
+
let code_str = serde_json::to_string(&code_json).expect("Failed to serialize code to JSON");
|
|
250
|
+
|
|
251
|
+
// Deserialize to verify it's valid JSON
|
|
252
|
+
let _: Value = serde_json::from_str(&code_str).expect("Failed to parse serialized code JSON");
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
#[test]
|
|
256
|
+
fn test_json_output_with_many_lines() {
|
|
257
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
258
|
+
create_edge_case_test_files(&temp_dir);
|
|
259
|
+
|
|
260
|
+
// Run the CLI with JSON output format, searching for "Line"
|
|
261
|
+
let output = Command::new("cargo")
|
|
262
|
+
.args([
|
|
263
|
+
"run",
|
|
264
|
+
"--",
|
|
265
|
+
"search",
|
|
266
|
+
"Line", // Pattern to search for
|
|
267
|
+
temp_dir.path().to_str().unwrap(),
|
|
268
|
+
"--format",
|
|
269
|
+
"json",
|
|
270
|
+
])
|
|
271
|
+
.output()
|
|
272
|
+
.expect("Failed to execute command");
|
|
273
|
+
|
|
274
|
+
// Check that the command succeeded
|
|
275
|
+
assert!(output.status.success());
|
|
276
|
+
|
|
277
|
+
// Convert stdout to string
|
|
278
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
279
|
+
|
|
280
|
+
// Extract the JSON part from the output
|
|
281
|
+
let json_str = extract_json_from_output(&stdout);
|
|
282
|
+
|
|
283
|
+
// Parse the JSON output
|
|
284
|
+
let json_result: Value =
|
|
285
|
+
serde_json::from_str(json_str).expect("Failed to parse JSON output with many lines");
|
|
286
|
+
|
|
287
|
+
// Check that we have results
|
|
288
|
+
let results = json_result.get("results").unwrap().as_array().unwrap();
|
|
289
|
+
assert!(!results.is_empty(), "Should have at least one result");
|
|
290
|
+
|
|
291
|
+
// Just verify that the JSON is valid and can be parsed
|
|
292
|
+
let summary = json_result.get("summary").unwrap();
|
|
293
|
+
assert!(
|
|
294
|
+
summary.get("count").is_some(),
|
|
295
|
+
"Should have a count field in summary"
|
|
296
|
+
);
|
|
297
|
+
assert!(
|
|
298
|
+
summary.get("total_bytes").is_some(),
|
|
299
|
+
"Should have a total_bytes field in summary"
|
|
300
|
+
);
|
|
301
|
+
assert!(
|
|
302
|
+
summary.get("total_tokens").is_some(),
|
|
303
|
+
"Should have a total_tokens field in summary"
|
|
304
|
+
);
|
|
305
|
+
|
|
306
|
+
// Check that the JSON itself is valid
|
|
307
|
+
let json_str = serde_json::to_string(&json_result).expect("Failed to serialize JSON result");
|
|
308
|
+
let _: Value = serde_json::from_str(&json_str).expect("Failed to parse serialized JSON");
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
#[test]
|
|
312
|
+
fn test_json_output_with_nested_structures() {
|
|
313
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
314
|
+
create_edge_case_test_files(&temp_dir);
|
|
315
|
+
|
|
316
|
+
// Run the CLI with JSON output format, searching for "nestedStructure"
|
|
317
|
+
let output = Command::new("cargo")
|
|
318
|
+
.args([
|
|
319
|
+
"run",
|
|
320
|
+
"--",
|
|
321
|
+
"search",
|
|
322
|
+
"nestedStructure", // Pattern to search for
|
|
323
|
+
temp_dir.path().to_str().unwrap(),
|
|
324
|
+
"--format",
|
|
325
|
+
"json",
|
|
326
|
+
])
|
|
327
|
+
.output()
|
|
328
|
+
.expect("Failed to execute command");
|
|
329
|
+
|
|
330
|
+
// Check that the command succeeded
|
|
331
|
+
assert!(output.status.success());
|
|
332
|
+
|
|
333
|
+
// Convert stdout to string
|
|
334
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
335
|
+
|
|
336
|
+
// Extract the JSON part from the output
|
|
337
|
+
let json_str = extract_json_from_output(&stdout);
|
|
338
|
+
|
|
339
|
+
// Parse the JSON output
|
|
340
|
+
let json_result: Value =
|
|
341
|
+
serde_json::from_str(json_str).expect("Failed to parse JSON output with nested structures");
|
|
342
|
+
|
|
343
|
+
// Find the result with nested structures
|
|
344
|
+
let results = json_result.get("results").unwrap().as_array().unwrap();
|
|
345
|
+
let nested_result = results.iter().find(|r| {
|
|
346
|
+
r.get("file")
|
|
347
|
+
.unwrap()
|
|
348
|
+
.as_str()
|
|
349
|
+
.unwrap()
|
|
350
|
+
.contains("nested_structure.js")
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
assert!(
|
|
354
|
+
nested_result.is_some(),
|
|
355
|
+
"Should find the nested_structure.js file"
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
// Verify that the nested structures are properly handled in the JSON
|
|
359
|
+
let code = nested_result
|
|
360
|
+
.unwrap()
|
|
361
|
+
.get("code")
|
|
362
|
+
.unwrap()
|
|
363
|
+
.as_str()
|
|
364
|
+
.unwrap();
|
|
365
|
+
assert!(
|
|
366
|
+
code.contains("nestedStructure"),
|
|
367
|
+
"Should contain the function name"
|
|
368
|
+
);
|
|
369
|
+
assert!(code.contains("level1"), "Should contain level1");
|
|
370
|
+
assert!(code.contains("level10"), "Should contain level10");
|
|
371
|
+
assert!(
|
|
372
|
+
code.contains("deeply nested"),
|
|
373
|
+
"Should contain the nested value"
|
|
374
|
+
);
|
|
375
|
+
|
|
376
|
+
// Check that the JSON is valid with nested structures
|
|
377
|
+
let code_json = serde_json::json!({ "code": code });
|
|
378
|
+
let code_str = serde_json::to_string(&code_json).expect("Failed to serialize code to JSON");
|
|
379
|
+
|
|
380
|
+
// Deserialize to verify it's valid JSON
|
|
381
|
+
let _: Value = serde_json::from_str(&code_str).expect("Failed to parse serialized code JSON");
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
#[test]
|
|
385
|
+
fn test_json_output_with_mixed_encodings() {
|
|
386
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
387
|
+
create_edge_case_test_files(&temp_dir);
|
|
388
|
+
|
|
389
|
+
// Run the CLI with JSON output format, searching for "mixedEncodings"
|
|
390
|
+
let output = Command::new("cargo")
|
|
391
|
+
.args([
|
|
392
|
+
"run",
|
|
393
|
+
"--",
|
|
394
|
+
"search",
|
|
395
|
+
"mixedEncodings", // Pattern to search for
|
|
396
|
+
temp_dir.path().to_str().unwrap(),
|
|
397
|
+
"--format",
|
|
398
|
+
"json",
|
|
399
|
+
])
|
|
400
|
+
.output()
|
|
401
|
+
.expect("Failed to execute command");
|
|
402
|
+
|
|
403
|
+
// Check that the command succeeded
|
|
404
|
+
assert!(output.status.success());
|
|
405
|
+
|
|
406
|
+
// Convert stdout to string
|
|
407
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
408
|
+
|
|
409
|
+
// Extract the JSON part from the output
|
|
410
|
+
let json_str = extract_json_from_output(&stdout);
|
|
411
|
+
|
|
412
|
+
// Parse the JSON output
|
|
413
|
+
let json_result: Value =
|
|
414
|
+
serde_json::from_str(json_str).expect("Failed to parse JSON output with mixed encodings");
|
|
415
|
+
|
|
416
|
+
// Find the result with mixed encodings
|
|
417
|
+
let results = json_result.get("results").unwrap().as_array().unwrap();
|
|
418
|
+
let mixed_encodings_result = results.iter().find(|r| {
|
|
419
|
+
r.get("file")
|
|
420
|
+
.unwrap()
|
|
421
|
+
.as_str()
|
|
422
|
+
.unwrap()
|
|
423
|
+
.contains("mixed_encodings.js")
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
assert!(
|
|
427
|
+
mixed_encodings_result.is_some(),
|
|
428
|
+
"Should find the mixed_encodings.js file"
|
|
429
|
+
);
|
|
430
|
+
|
|
431
|
+
// Verify that the mixed encodings are properly handled in the JSON
|
|
432
|
+
let code = mixed_encodings_result
|
|
433
|
+
.unwrap()
|
|
434
|
+
.get("code")
|
|
435
|
+
.unwrap()
|
|
436
|
+
.as_str()
|
|
437
|
+
.unwrap();
|
|
438
|
+
assert!(
|
|
439
|
+
code.contains("mixedEncodings"),
|
|
440
|
+
"Should contain the function name"
|
|
441
|
+
);
|
|
442
|
+
assert!(code.contains("Hello, World!"), "Should contain Latin text");
|
|
443
|
+
assert!(
|
|
444
|
+
code.contains("Привет, мир!"),
|
|
445
|
+
"Should contain Cyrillic text"
|
|
446
|
+
);
|
|
447
|
+
assert!(code.contains("你好,世界!"), "Should contain Chinese text");
|
|
448
|
+
|
|
449
|
+
// Check that the JSON is valid with mixed encodings
|
|
450
|
+
let code_json = serde_json::json!({ "code": code });
|
|
451
|
+
let code_str = serde_json::to_string(&code_json).expect("Failed to serialize code to JSON");
|
|
452
|
+
|
|
453
|
+
// Deserialize to verify it's valid JSON
|
|
454
|
+
let _: Value = serde_json::from_str(&code_str).expect("Failed to parse serialized code JSON");
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
#[test]
|
|
458
|
+
fn test_xml_output_with_long_lines() {
|
|
459
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
460
|
+
create_edge_case_test_files(&temp_dir);
|
|
461
|
+
|
|
462
|
+
// Run the CLI with XML output format, searching for "longLine"
|
|
463
|
+
let output = Command::new("cargo")
|
|
464
|
+
.args([
|
|
465
|
+
"run",
|
|
466
|
+
"--",
|
|
467
|
+
"search",
|
|
468
|
+
"longLine", // Pattern to search for
|
|
469
|
+
temp_dir.path().to_str().unwrap(),
|
|
470
|
+
"--format",
|
|
471
|
+
"xml",
|
|
472
|
+
])
|
|
473
|
+
.output()
|
|
474
|
+
.expect("Failed to execute command");
|
|
475
|
+
|
|
476
|
+
// Check that the command succeeded
|
|
477
|
+
assert!(output.status.success());
|
|
478
|
+
|
|
479
|
+
// Convert stdout to string
|
|
480
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
481
|
+
|
|
482
|
+
// Extract the XML part from the output
|
|
483
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
484
|
+
|
|
485
|
+
// Parse the XML output
|
|
486
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output with long lines");
|
|
487
|
+
let root = doc.root_element();
|
|
488
|
+
|
|
489
|
+
// Find the result with long lines
|
|
490
|
+
let results: Vec<Node> = root
|
|
491
|
+
.children()
|
|
492
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
493
|
+
.collect();
|
|
494
|
+
let long_line_result = results.iter().find(|&r| {
|
|
495
|
+
if let Some(file) = r
|
|
496
|
+
.children()
|
|
497
|
+
.find(|n| n.is_element() && n.tag_name().name() == "file")
|
|
498
|
+
{
|
|
499
|
+
if let Some(text) = file.text() {
|
|
500
|
+
return text.contains("long_line.js");
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
false
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
assert!(
|
|
507
|
+
long_line_result.is_some(),
|
|
508
|
+
"Should find the long_line.js file"
|
|
509
|
+
);
|
|
510
|
+
|
|
511
|
+
// Verify that the long line is properly handled in the XML
|
|
512
|
+
if let Some(result) = long_line_result {
|
|
513
|
+
if let Some(code) = result
|
|
514
|
+
.children()
|
|
515
|
+
.find(|n| n.is_element() && n.tag_name().name() == "code")
|
|
516
|
+
{
|
|
517
|
+
if let Some(text) = code.text() {
|
|
518
|
+
assert!(
|
|
519
|
+
text.contains("longLine"),
|
|
520
|
+
"Should contain the function name"
|
|
521
|
+
);
|
|
522
|
+
assert!(
|
|
523
|
+
text.contains("longString"),
|
|
524
|
+
"Should contain the variable name"
|
|
525
|
+
);
|
|
526
|
+
} else {
|
|
527
|
+
panic!("Code element should have text content");
|
|
528
|
+
}
|
|
529
|
+
} else {
|
|
530
|
+
panic!("Result should have a code element");
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
#[test]
|
|
536
|
+
fn test_xml_output_with_nested_structures() {
|
|
537
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
538
|
+
create_edge_case_test_files(&temp_dir);
|
|
539
|
+
|
|
540
|
+
// Run the CLI with XML output format, searching for "nestedStructure"
|
|
541
|
+
let output = Command::new("cargo")
|
|
542
|
+
.args([
|
|
543
|
+
"run",
|
|
544
|
+
"--",
|
|
545
|
+
"search",
|
|
546
|
+
"nestedStructure", // Pattern to search for
|
|
547
|
+
temp_dir.path().to_str().unwrap(),
|
|
548
|
+
"--format",
|
|
549
|
+
"xml",
|
|
550
|
+
])
|
|
551
|
+
.output()
|
|
552
|
+
.expect("Failed to execute command");
|
|
553
|
+
|
|
554
|
+
// Check that the command succeeded
|
|
555
|
+
assert!(output.status.success());
|
|
556
|
+
|
|
557
|
+
// Convert stdout to string
|
|
558
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
559
|
+
|
|
560
|
+
// Extract the XML part from the output
|
|
561
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
562
|
+
|
|
563
|
+
// Parse the XML output
|
|
564
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output with nested structures");
|
|
565
|
+
let root = doc.root_element();
|
|
566
|
+
|
|
567
|
+
// Find the result with nested structures
|
|
568
|
+
let results: Vec<Node> = root
|
|
569
|
+
.children()
|
|
570
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
571
|
+
.collect();
|
|
572
|
+
let nested_result = results.iter().find(|&r| {
|
|
573
|
+
if let Some(file) = r
|
|
574
|
+
.children()
|
|
575
|
+
.find(|n| n.is_element() && n.tag_name().name() == "file")
|
|
576
|
+
{
|
|
577
|
+
if let Some(text) = file.text() {
|
|
578
|
+
return text.contains("nested_structure.js");
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
false
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
assert!(
|
|
585
|
+
nested_result.is_some(),
|
|
586
|
+
"Should find the nested_structure.js file"
|
|
587
|
+
);
|
|
588
|
+
|
|
589
|
+
// Verify that the nested structures are properly handled in the XML
|
|
590
|
+
if let Some(result) = nested_result {
|
|
591
|
+
if let Some(code) = result
|
|
592
|
+
.children()
|
|
593
|
+
.find(|n| n.is_element() && n.tag_name().name() == "code")
|
|
594
|
+
{
|
|
595
|
+
if let Some(text) = code.text() {
|
|
596
|
+
assert!(
|
|
597
|
+
text.contains("nestedStructure"),
|
|
598
|
+
"Should contain the function name"
|
|
599
|
+
);
|
|
600
|
+
assert!(text.contains("level1"), "Should contain level1");
|
|
601
|
+
assert!(text.contains("level10"), "Should contain level10");
|
|
602
|
+
assert!(
|
|
603
|
+
text.contains("deeply nested"),
|
|
604
|
+
"Should contain the nested value"
|
|
605
|
+
);
|
|
606
|
+
} else {
|
|
607
|
+
panic!("Code element should have text content");
|
|
608
|
+
}
|
|
609
|
+
} else {
|
|
610
|
+
panic!("Result should have a code element");
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
#[test]
|
|
616
|
+
fn test_xml_output_with_mixed_encodings() {
|
|
617
|
+
let temp_dir = TempDir::new().expect("Failed to create temp dir");
|
|
618
|
+
create_edge_case_test_files(&temp_dir);
|
|
619
|
+
|
|
620
|
+
// Run the CLI with XML output format, searching for "mixedEncodings"
|
|
621
|
+
let output = Command::new("cargo")
|
|
622
|
+
.args([
|
|
623
|
+
"run",
|
|
624
|
+
"--",
|
|
625
|
+
"search",
|
|
626
|
+
"mixedEncodings", // Pattern to search for
|
|
627
|
+
temp_dir.path().to_str().unwrap(),
|
|
628
|
+
"--format",
|
|
629
|
+
"xml",
|
|
630
|
+
])
|
|
631
|
+
.output()
|
|
632
|
+
.expect("Failed to execute command");
|
|
633
|
+
|
|
634
|
+
// Check that the command succeeded
|
|
635
|
+
assert!(output.status.success());
|
|
636
|
+
|
|
637
|
+
// Convert stdout to string
|
|
638
|
+
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
639
|
+
|
|
640
|
+
// Extract the XML part from the output
|
|
641
|
+
let xml_str = extract_xml_from_output(&stdout);
|
|
642
|
+
|
|
643
|
+
// Parse the XML output
|
|
644
|
+
let doc = Document::parse(xml_str).expect("Failed to parse XML output with mixed encodings");
|
|
645
|
+
let root = doc.root_element();
|
|
646
|
+
|
|
647
|
+
// Find the result with mixed encodings
|
|
648
|
+
let results: Vec<Node> = root
|
|
649
|
+
.children()
|
|
650
|
+
.filter(|n| n.is_element() && n.tag_name().name() == "result")
|
|
651
|
+
.collect();
|
|
652
|
+
let mixed_encodings_result = results.iter().find(|&r| {
|
|
653
|
+
if let Some(file) = r
|
|
654
|
+
.children()
|
|
655
|
+
.find(|n| n.is_element() && n.tag_name().name() == "file")
|
|
656
|
+
{
|
|
657
|
+
if let Some(text) = file.text() {
|
|
658
|
+
return text.contains("mixed_encodings.js");
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
false
|
|
662
|
+
});
|
|
663
|
+
|
|
664
|
+
assert!(
|
|
665
|
+
mixed_encodings_result.is_some(),
|
|
666
|
+
"Should find the mixed_encodings.js file"
|
|
667
|
+
);
|
|
668
|
+
|
|
669
|
+
// Verify that the mixed encodings are properly handled in the XML
|
|
670
|
+
if let Some(result) = mixed_encodings_result {
|
|
671
|
+
if let Some(code) = result
|
|
672
|
+
.children()
|
|
673
|
+
.find(|n| n.is_element() && n.tag_name().name() == "code")
|
|
674
|
+
{
|
|
675
|
+
if let Some(text) = code.text() {
|
|
676
|
+
assert!(
|
|
677
|
+
text.contains("mixedEncodings"),
|
|
678
|
+
"Should contain the function name"
|
|
679
|
+
);
|
|
680
|
+
assert!(text.contains("Hello, World!"), "Should contain Latin text");
|
|
681
|
+
assert!(
|
|
682
|
+
text.contains("Привет, мир!"),
|
|
683
|
+
"Should contain Cyrillic text"
|
|
684
|
+
);
|
|
685
|
+
assert!(text.contains("你好,世界!"), "Should contain Chinese text");
|
|
686
|
+
} else {
|
|
687
|
+
panic!("Code element should have text content");
|
|
688
|
+
}
|
|
689
|
+
} else {
|
|
690
|
+
panic!("Result should have a code element");
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
}
|