@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,698 @@
|
|
|
1
|
+
use probe_code::path_resolver::{
|
|
2
|
+
resolve_path, GoPathResolver, JavaScriptPathResolver, PathResolver, RustPathResolver,
|
|
3
|
+
};
|
|
4
|
+
use std::fs;
|
|
5
|
+
use std::path::PathBuf;
|
|
6
|
+
use std::process::Command;
|
|
7
|
+
|
|
8
|
+
// Helper function to check if node is installed and a module exists
|
|
9
|
+
fn check_js_module(module: &str) -> bool {
|
|
10
|
+
if Command::new("node").arg("--version").output().is_err() {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
let script = format!("try {{ require.resolve('{module}/package.json'); process.exit(0); }} catch (e) {{ process.exit(1); }}");
|
|
14
|
+
Command::new("node")
|
|
15
|
+
.arg("-e")
|
|
16
|
+
.arg(&script)
|
|
17
|
+
.status()
|
|
18
|
+
.is_ok_and(|s| s.success())
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Helper function to check if go is installed and a module exists
|
|
22
|
+
fn check_go_module(module: &str) -> bool {
|
|
23
|
+
if Command::new("go").arg("version").output().is_err() {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
Command::new("go")
|
|
27
|
+
.args(["list", module])
|
|
28
|
+
.status()
|
|
29
|
+
.is_ok_and(|s| s.success())
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
#[test]
|
|
33
|
+
fn test_regular_path_no_prefix() {
|
|
34
|
+
// Use a relative path that should exist
|
|
35
|
+
let path = "Cargo.toml"; // Assumes test runs from project root
|
|
36
|
+
let result = resolve_path(path);
|
|
37
|
+
assert!(result.is_ok());
|
|
38
|
+
// Expect it to be returned as is
|
|
39
|
+
assert_eq!(result.unwrap(), PathBuf::from(path));
|
|
40
|
+
|
|
41
|
+
// Test with an absolute path (use temp dir for reliability)
|
|
42
|
+
let temp_dir = tempfile::tempdir().unwrap();
|
|
43
|
+
let abs_path_str = temp_dir
|
|
44
|
+
.path()
|
|
45
|
+
.join("somefile")
|
|
46
|
+
.to_str()
|
|
47
|
+
.unwrap()
|
|
48
|
+
.to_string();
|
|
49
|
+
let result_abs = resolve_path(&abs_path_str);
|
|
50
|
+
assert!(result_abs.is_ok());
|
|
51
|
+
assert_eq!(result_abs.unwrap(), PathBuf::from(&abs_path_str));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// --- Go Tests ---
|
|
55
|
+
|
|
56
|
+
#[test]
|
|
57
|
+
fn test_go_stdlib_resolution_no_subpath() {
|
|
58
|
+
if !check_go_module("fmt") {
|
|
59
|
+
println!("Skipping test_go_stdlib_resolution_no_subpath: Go or 'fmt' module not available");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
let result = resolve_path("go:fmt");
|
|
63
|
+
assert!(result.is_ok(), "Failed to resolve 'go:fmt': {result:?}");
|
|
64
|
+
let path = result.unwrap();
|
|
65
|
+
assert!(path.exists(), "Path does not exist: {path:?}");
|
|
66
|
+
assert!(path.is_dir(), "Path is not a directory: {path:?}");
|
|
67
|
+
assert!(
|
|
68
|
+
path.join("print.go").exists(),
|
|
69
|
+
"fmt/print.go not found in {path:?}"
|
|
70
|
+
); // Check a known file
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
#[test]
|
|
74
|
+
fn test_go_stdlib_resolution_with_subpath_file() {
|
|
75
|
+
if !check_go_module("net/http") {
|
|
76
|
+
// Need a stdlib package with known files/subdirs
|
|
77
|
+
println!(
|
|
78
|
+
"Skipping test_go_stdlib_resolution_with_subpath_file: Go or 'net/http' not available"
|
|
79
|
+
);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
let result = resolve_path("go:net/http/server.go"); // Path is module=net/http, sub=server.go
|
|
83
|
+
assert!(
|
|
84
|
+
result.is_ok(),
|
|
85
|
+
"Failed to resolve 'go:net/http/server.go': {result:?}"
|
|
86
|
+
);
|
|
87
|
+
let path = result.unwrap();
|
|
88
|
+
assert!(path.exists(), "Path does not exist: {path:?}");
|
|
89
|
+
assert!(path.is_file(), "Path is not a file: {path:?}");
|
|
90
|
+
assert_eq!(path.file_name().unwrap(), "server.go");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
#[test]
|
|
94
|
+
fn test_go_stdlib_resolution_with_subpath_dir() {
|
|
95
|
+
if !check_go_module("net/http/pprof") {
|
|
96
|
+
// Check if pprof sub-package is resolvable
|
|
97
|
+
println!("Skipping test_go_stdlib_resolution_with_subpath_dir: Go or 'net/http/pprof' not available");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Our current heuristic treats "net/http/pprof" as the module. Let's test that directly first.
|
|
101
|
+
let result_mod = resolve_path("go:net/http/pprof");
|
|
102
|
+
assert!(
|
|
103
|
+
result_mod.is_ok(),
|
|
104
|
+
"Failed to resolve 'go:net/http/pprof' as module: {result_mod:?}"
|
|
105
|
+
);
|
|
106
|
+
let path_mod = result_mod.unwrap();
|
|
107
|
+
assert!(path_mod.exists(), "Path does not exist: {path_mod:?}");
|
|
108
|
+
assert!(path_mod.is_dir(), "Path is not a directory: {path_mod:?}");
|
|
109
|
+
assert!(
|
|
110
|
+
path_mod.join("pprof.go").exists(),
|
|
111
|
+
"pprof.go not found in {path_mod:?}"
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
#[test]
|
|
116
|
+
fn test_go_external_resolution_no_subpath() {
|
|
117
|
+
let module = "github.com/stretchr/testify";
|
|
118
|
+
if !check_go_module(module) {
|
|
119
|
+
println!("Skipping test_go_external_resolution_no_subpath: Go or '{module}' not available");
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
let result = resolve_path(&format!("go:{module}"));
|
|
123
|
+
assert!(
|
|
124
|
+
result.is_ok(),
|
|
125
|
+
"Failed to resolve 'go:{module}': {result:?}"
|
|
126
|
+
);
|
|
127
|
+
let path = result.unwrap();
|
|
128
|
+
assert!(path.exists(), "Path does not exist: {path:?}");
|
|
129
|
+
assert!(path.is_dir(), "Path is not a directory: {path:?}");
|
|
130
|
+
assert!(
|
|
131
|
+
path.join("assert").exists(),
|
|
132
|
+
"'assert' subdir not found in {path:?}"
|
|
133
|
+
); // Check subdir
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
#[test]
|
|
137
|
+
fn test_go_external_resolution_with_subpath() {
|
|
138
|
+
let module = "github.com/stretchr/testify";
|
|
139
|
+
let subpath = "assert";
|
|
140
|
+
let full_module_path = format!("{module}/{subpath}"); // e.g. github.com/stretchr/testify/assert
|
|
141
|
+
if !check_go_module(&full_module_path) {
|
|
142
|
+
// Check if the sub-package itself is resolvable by go list
|
|
143
|
+
if !check_go_module(module) {
|
|
144
|
+
// If not, check if base module exists before skipping entirely
|
|
145
|
+
println!("Skipping test_go_external_resolution_with_subpath: Go or base module '{module}' not available");
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// Base module exists, but sub-package doesn't resolve directly. Our split logic should handle this.
|
|
149
|
+
println!(
|
|
150
|
+
"Note: '{full_module_path}' not directly resolvable by 'go list', testing split logic."
|
|
151
|
+
);
|
|
152
|
+
} else if !check_go_module(module) {
|
|
153
|
+
println!("Skipping test_go_external_resolution_with_subpath: Go or base module '{module}' not available");
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
let input_path = format!("go:{module}/{subpath}"); // "go:github.com/stretchr/testify/assert"
|
|
158
|
+
let result = resolve_path(&input_path);
|
|
159
|
+
assert!(
|
|
160
|
+
result.is_ok(),
|
|
161
|
+
"Failed to resolve '{input_path}': {result:?}"
|
|
162
|
+
);
|
|
163
|
+
let path = result.unwrap();
|
|
164
|
+
assert!(path.exists(), "Path does not exist: {path:?}");
|
|
165
|
+
assert!(path.is_dir(), "Path is not a directory: {path:?}"); // assert is a directory
|
|
166
|
+
assert!(
|
|
167
|
+
path.file_name().unwrap() == subpath,
|
|
168
|
+
"Path should end with '{subpath}': {path:?}"
|
|
169
|
+
);
|
|
170
|
+
assert!(
|
|
171
|
+
path.join("assertions.go").exists(),
|
|
172
|
+
"assertions.go not found in {path:?}"
|
|
173
|
+
); // Check known file
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
#[test]
|
|
177
|
+
fn test_go_nonexistent_package() {
|
|
178
|
+
if Command::new("go").arg("version").output().is_err() {
|
|
179
|
+
println!("Skipping test_go_nonexistent_package: Go not installed");
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
let result = resolve_path("go:nonexistent_gopkg_xyz_123_abc");
|
|
183
|
+
assert!(
|
|
184
|
+
result.is_err(),
|
|
185
|
+
"Expected error for non-existent package, got Ok: {result:?}"
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// --- JavaScript Tests ---
|
|
190
|
+
|
|
191
|
+
#[test]
|
|
192
|
+
fn test_js_resolution_no_subpath() {
|
|
193
|
+
// Use a commonly installed package like 'npm' itself or a dev dependency
|
|
194
|
+
let module = "npm"; // Or change to a dev dep of *this* project if available
|
|
195
|
+
if !check_js_module(module) {
|
|
196
|
+
println!("Skipping test_js_resolution_no_subpath: Node or '{module}' module not available");
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
let result = resolve_path(&format!("js:{module}"));
|
|
200
|
+
assert!(
|
|
201
|
+
result.is_ok(),
|
|
202
|
+
"Failed to resolve 'js:{module}': {result:?}"
|
|
203
|
+
);
|
|
204
|
+
let path = result.unwrap();
|
|
205
|
+
assert!(path.exists(), "Path does not exist: {path:?}");
|
|
206
|
+
assert!(path.is_dir(), "Path is not a directory: {path:?}");
|
|
207
|
+
assert!(
|
|
208
|
+
path.join("package.json").exists(),
|
|
209
|
+
"package.json not found in {path:?}"
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
#[test]
|
|
214
|
+
fn test_js_resolution_with_subpath_file() {
|
|
215
|
+
let module = "npm"; // Assuming npm has a known file/structure
|
|
216
|
+
let subpath = "index.js"; // Common entry point, might exist
|
|
217
|
+
if !check_js_module(module) {
|
|
218
|
+
println!(
|
|
219
|
+
"Skipping test_js_resolution_with_subpath_file: Node or '{module}' module not available"
|
|
220
|
+
);
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
let input_path = format!("js:{module}/{subpath}");
|
|
225
|
+
let result = resolve_path(&input_path);
|
|
226
|
+
|
|
227
|
+
// Check if the subpath *actually* exists before asserting Ok
|
|
228
|
+
let expected_path = match resolve_path(&format!("js:{module}")) {
|
|
229
|
+
Ok(p) => p.join(subpath),
|
|
230
|
+
Err(_) => {
|
|
231
|
+
// Can't resolve base module
|
|
232
|
+
println!(
|
|
233
|
+
"Skipping test_js_resolution_with_subpath_file: Cannot resolve base module '{module}'"
|
|
234
|
+
);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
if !expected_path.exists() {
|
|
240
|
+
println!("Skipping test_js_resolution_with_subpath_file: Expected subpath '{}' does not exist in module '{}'", expected_path.display(), module);
|
|
241
|
+
// Optional: Assert error instead? Or just skip? Let's skip.
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
assert!(
|
|
246
|
+
result.is_ok(),
|
|
247
|
+
"Failed to resolve '{input_path}': {result:?}"
|
|
248
|
+
);
|
|
249
|
+
let path = result.unwrap();
|
|
250
|
+
assert!(path.exists(), "Path does not exist: {path:?}");
|
|
251
|
+
assert!(path.is_file(), "Path is not a file: {path:?}"); // Check if it's a file
|
|
252
|
+
assert!(
|
|
253
|
+
path.file_name().unwrap() == subpath,
|
|
254
|
+
"Path should end with '{subpath}': {path:?}"
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
#[test]
|
|
259
|
+
fn test_js_resolution_with_subpath_dir() {
|
|
260
|
+
let module = "npm";
|
|
261
|
+
let subpath = "lib"; // npm usually has a lib directory
|
|
262
|
+
if !check_js_module(module) {
|
|
263
|
+
println!(
|
|
264
|
+
"Skipping test_js_resolution_with_subpath_dir: Node or '{module}' module not available"
|
|
265
|
+
);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
let input_path = format!("js:{module}/{subpath}");
|
|
270
|
+
let result = resolve_path(&input_path);
|
|
271
|
+
|
|
272
|
+
// Check if the subpath *actually* exists
|
|
273
|
+
let expected_path = match resolve_path(&format!("js:{module}")) {
|
|
274
|
+
Ok(p) => p.join(subpath),
|
|
275
|
+
Err(_) => {
|
|
276
|
+
println!(
|
|
277
|
+
"Skipping test_js_resolution_with_subpath_dir: Cannot resolve base module '{module}'"
|
|
278
|
+
);
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
if !expected_path.exists() || !expected_path.is_dir() {
|
|
283
|
+
println!("Skipping test_js_resolution_with_subpath_dir: Expected subpath dir '{}' does not exist in module '{}'", expected_path.display(), module);
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
assert!(
|
|
288
|
+
result.is_ok(),
|
|
289
|
+
"Failed to resolve '{input_path}': {result:?}"
|
|
290
|
+
);
|
|
291
|
+
let path = result.unwrap();
|
|
292
|
+
assert!(path.exists(), "Path does not exist: {path:?}");
|
|
293
|
+
assert!(path.is_dir(), "Path is not a directory: {path:?}");
|
|
294
|
+
assert!(
|
|
295
|
+
path.file_name().unwrap() == subpath,
|
|
296
|
+
"Path should end with '{subpath}': {path:?}"
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
#[test]
|
|
301
|
+
fn test_js_scoped_resolution_no_subpath() {
|
|
302
|
+
// Requires a globally or locally installed scoped package
|
|
303
|
+
let module = "@npmcli/config"; // Example, check if installed
|
|
304
|
+
if !check_js_module(module) {
|
|
305
|
+
println!(
|
|
306
|
+
"Skipping test_js_scoped_resolution_no_subpath: Node or '{module}' module not available"
|
|
307
|
+
);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
let result = resolve_path(&format!("js:{module}"));
|
|
311
|
+
assert!(
|
|
312
|
+
result.is_ok(),
|
|
313
|
+
"Failed to resolve 'js:{module}': {result:?}"
|
|
314
|
+
);
|
|
315
|
+
let path = result.unwrap();
|
|
316
|
+
assert!(path.exists(), "Path does not exist: {path:?}");
|
|
317
|
+
assert!(path.is_dir(), "Path is not a directory: {path:?}");
|
|
318
|
+
assert!(
|
|
319
|
+
path.join("package.json").exists(),
|
|
320
|
+
"package.json not found in {path:?}"
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
#[test]
|
|
325
|
+
fn test_js_scoped_resolution_with_subpath() {
|
|
326
|
+
let module = "@npmcli/config";
|
|
327
|
+
let subpath = "lib/index.js"; // Check actual structure if test fails
|
|
328
|
+
if !check_js_module(module) {
|
|
329
|
+
println!(
|
|
330
|
+
"Skipping test_js_scoped_resolution_with_subpath: Node or '{module}' module not available"
|
|
331
|
+
);
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
let input_path = format!("js:{module}/{subpath}");
|
|
336
|
+
let result = resolve_path(&input_path);
|
|
337
|
+
|
|
338
|
+
// Check if the subpath *actually* exists
|
|
339
|
+
let expected_path = match resolve_path(&format!("js:{module}")) {
|
|
340
|
+
Ok(p) => p.join(subpath),
|
|
341
|
+
Err(_) => {
|
|
342
|
+
println!(
|
|
343
|
+
"Skipping test_js_scoped_resolution_with_subpath: Cannot resolve base module '{module}'"
|
|
344
|
+
);
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
if !expected_path.exists() {
|
|
349
|
+
println!("Skipping test_js_scoped_resolution_with_subpath: Expected subpath '{}' does not exist in module '{}'", expected_path.display(), module);
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
assert!(
|
|
354
|
+
result.is_ok(),
|
|
355
|
+
"Failed to resolve '{input_path}': {result:?}"
|
|
356
|
+
);
|
|
357
|
+
let path = result.unwrap();
|
|
358
|
+
assert!(path.exists(), "Path does not exist: {path:?}");
|
|
359
|
+
// assert!(path.is_file(), "Path is not a file: {:?}", path); // Adjust if subpath is dir
|
|
360
|
+
assert!(
|
|
361
|
+
path.ends_with(subpath.replace('/', std::path::MAIN_SEPARATOR_STR)),
|
|
362
|
+
"Path should end with '{subpath}': {path:?}"
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
#[test]
|
|
367
|
+
fn test_js_nonexistent_package() {
|
|
368
|
+
if Command::new("node").arg("--version").output().is_err() {
|
|
369
|
+
println!("Skipping test_js_nonexistent_package: Node not installed");
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
let result = resolve_path("js:nonexistent_jspkg_xyz_123_abc");
|
|
373
|
+
assert!(
|
|
374
|
+
result.is_err(),
|
|
375
|
+
"Expected error for non-existent package, got Ok: {result:?}"
|
|
376
|
+
);
|
|
377
|
+
|
|
378
|
+
// The error message might vary depending on the environment, so just check that it's an error
|
|
379
|
+
let err_msg = result.unwrap_err();
|
|
380
|
+
println!("Error message for nonexistent JS package: {err_msg}");
|
|
381
|
+
// Could contain "not found", "Cannot find module", "Failed to resolve", etc.
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// --- Rust Tests ---
|
|
385
|
+
|
|
386
|
+
#[test]
|
|
387
|
+
fn test_rust_resolution() {
|
|
388
|
+
// Create a temporary directory with a Cargo.toml file
|
|
389
|
+
let temp_dir = tempfile::tempdir().unwrap();
|
|
390
|
+
let crate_root = temp_dir.path();
|
|
391
|
+
let cargo_toml_path = crate_root.join("Cargo.toml");
|
|
392
|
+
|
|
393
|
+
// Write a minimal Cargo.toml
|
|
394
|
+
fs::write(
|
|
395
|
+
&cargo_toml_path,
|
|
396
|
+
r#"[package]
|
|
397
|
+
name = "test-crate"
|
|
398
|
+
version = "0.1.0"
|
|
399
|
+
edition = "2021"
|
|
400
|
+
"#,
|
|
401
|
+
)
|
|
402
|
+
.expect("Failed to write Cargo.toml");
|
|
403
|
+
|
|
404
|
+
// Test with the path to the Cargo.toml file
|
|
405
|
+
// Use canonicalize to handle potential relative path issues in tests
|
|
406
|
+
let canonical_toml_path = fs::canonicalize(&cargo_toml_path).unwrap();
|
|
407
|
+
let path_str = format!("rust:{}", canonical_toml_path.to_str().unwrap());
|
|
408
|
+
let result = resolve_path(&path_str);
|
|
409
|
+
|
|
410
|
+
assert!(result.is_ok(), "Failed to resolve rust: path: {result:?}");
|
|
411
|
+
// Expect the parent directory of the Cargo.toml
|
|
412
|
+
let expected_path = fs::canonicalize(crate_root).unwrap();
|
|
413
|
+
assert_eq!(result.unwrap(), expected_path);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
#[test]
|
|
417
|
+
fn test_rust_nonexistent_toml() {
|
|
418
|
+
let path_str = "rust:/non/existent/path/to/Cargo.toml";
|
|
419
|
+
let result = resolve_path(path_str);
|
|
420
|
+
assert!(
|
|
421
|
+
result.is_err(),
|
|
422
|
+
"Expected error for non-existent Cargo.toml, got Ok: {result:?}"
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
#[test]
|
|
427
|
+
fn test_rust_path_is_not_toml() {
|
|
428
|
+
// Create a temporary directory
|
|
429
|
+
let temp_dir = tempfile::tempdir().unwrap();
|
|
430
|
+
let dir_path = temp_dir.path();
|
|
431
|
+
let canonical_dir_path = fs::canonicalize(dir_path).unwrap();
|
|
432
|
+
let path_str = format!("rust:{}", canonical_dir_path.to_str().unwrap()); // Path to dir, not file
|
|
433
|
+
|
|
434
|
+
let result = resolve_path(&path_str);
|
|
435
|
+
// Resolve should fail because the path is not a file
|
|
436
|
+
assert!(
|
|
437
|
+
result.is_err(),
|
|
438
|
+
"Expected error for path not pointing to a file, got Ok: {result:?}"
|
|
439
|
+
);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// --- Dep Prefix Tests ---
|
|
443
|
+
|
|
444
|
+
#[test]
|
|
445
|
+
fn test_dep_go_resolution() {
|
|
446
|
+
if !check_go_module("fmt") {
|
|
447
|
+
println!("Skipping test_dep_go_resolution: Go or 'fmt' module not available");
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// Test with standard library package using /dep/go prefix
|
|
452
|
+
let result = resolve_path("/dep/go/fmt");
|
|
453
|
+
|
|
454
|
+
// Compare with traditional go: prefix
|
|
455
|
+
let traditional_result = resolve_path("go:fmt");
|
|
456
|
+
|
|
457
|
+
assert!(
|
|
458
|
+
result.is_ok(),
|
|
459
|
+
"Failed to resolve '/dep/go/fmt': {result:?}"
|
|
460
|
+
);
|
|
461
|
+
assert!(
|
|
462
|
+
traditional_result.is_ok(),
|
|
463
|
+
"Failed to resolve 'go:fmt': {traditional_result:?}"
|
|
464
|
+
);
|
|
465
|
+
|
|
466
|
+
// Both paths should resolve to the same location
|
|
467
|
+
assert_eq!(result.unwrap(), traditional_result.unwrap());
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
#[test]
|
|
471
|
+
fn test_dep_js_resolution() {
|
|
472
|
+
let module = "npm"; // Or change to a dev dep of *this* project if available
|
|
473
|
+
if !check_js_module(module) {
|
|
474
|
+
println!("Skipping test_dep_js_resolution: Node or '{module}' module not available");
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// Test with npm package using /dep/js prefix
|
|
479
|
+
let result = resolve_path(&format!("/dep/js/{module}"));
|
|
480
|
+
|
|
481
|
+
// Compare with traditional js: prefix
|
|
482
|
+
let traditional_result = resolve_path(&format!("js:{module}"));
|
|
483
|
+
|
|
484
|
+
assert!(
|
|
485
|
+
result.is_ok(),
|
|
486
|
+
"Failed to resolve '/dep/js/{module}': {result:?}"
|
|
487
|
+
);
|
|
488
|
+
assert!(
|
|
489
|
+
traditional_result.is_ok(),
|
|
490
|
+
"Failed to resolve 'js:{module}': {traditional_result:?}"
|
|
491
|
+
);
|
|
492
|
+
|
|
493
|
+
// Both paths should resolve to the same location
|
|
494
|
+
assert_eq!(result.unwrap(), traditional_result.unwrap());
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
#[test]
|
|
498
|
+
fn test_dep_rust_resolution() {
|
|
499
|
+
// Create a temporary directory with a Cargo.toml file
|
|
500
|
+
let temp_dir = tempfile::tempdir().unwrap();
|
|
501
|
+
let crate_root = temp_dir.path();
|
|
502
|
+
let cargo_toml_path = crate_root.join("Cargo.toml");
|
|
503
|
+
|
|
504
|
+
// Write a minimal Cargo.toml
|
|
505
|
+
fs::write(
|
|
506
|
+
&cargo_toml_path,
|
|
507
|
+
r#"[package]
|
|
508
|
+
name = "test-crate"
|
|
509
|
+
version = "0.1.0"
|
|
510
|
+
edition = "2021"
|
|
511
|
+
"#,
|
|
512
|
+
)
|
|
513
|
+
.expect("Failed to write Cargo.toml");
|
|
514
|
+
|
|
515
|
+
// Use canonicalize to handle potential relative path issues in tests
|
|
516
|
+
let canonical_toml_path = fs::canonicalize(&cargo_toml_path).unwrap();
|
|
517
|
+
|
|
518
|
+
// Test with /dep/rust prefix
|
|
519
|
+
let dep_path_str = format!("/dep/rust/{}", canonical_toml_path.to_str().unwrap());
|
|
520
|
+
let result = resolve_path(&dep_path_str);
|
|
521
|
+
|
|
522
|
+
// Compare with traditional rust: prefix
|
|
523
|
+
let traditional_path_str = format!("rust:{}", canonical_toml_path.to_str().unwrap());
|
|
524
|
+
let traditional_result = resolve_path(&traditional_path_str);
|
|
525
|
+
|
|
526
|
+
assert!(
|
|
527
|
+
result.is_ok(),
|
|
528
|
+
"Failed to resolve /dep/rust path: {result:?}"
|
|
529
|
+
);
|
|
530
|
+
assert!(
|
|
531
|
+
traditional_result.is_ok(),
|
|
532
|
+
"Failed to resolve rust: path: {traditional_result:?}"
|
|
533
|
+
);
|
|
534
|
+
|
|
535
|
+
// Both paths should resolve to the same location
|
|
536
|
+
assert_eq!(result.unwrap(), traditional_result.unwrap());
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
#[test]
|
|
540
|
+
fn test_invalid_dep_paths() {
|
|
541
|
+
// Test with invalid /dep/ path (missing language identifier)
|
|
542
|
+
let result = resolve_path("/dep/");
|
|
543
|
+
assert!(result.is_err());
|
|
544
|
+
|
|
545
|
+
// Test with unknown language identifier
|
|
546
|
+
let result = resolve_path("/dep/unknown/package");
|
|
547
|
+
assert!(result.is_err());
|
|
548
|
+
|
|
549
|
+
// Test with empty path after language identifier
|
|
550
|
+
let result = resolve_path("/dep/go/");
|
|
551
|
+
assert!(result.is_err());
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
// --- General/Error Tests ---
|
|
555
|
+
#[test]
|
|
556
|
+
fn test_invalid_prefix() {
|
|
557
|
+
let result = resolve_path("invalidprefix:some/path");
|
|
558
|
+
// Should be treated as a regular path
|
|
559
|
+
assert!(result.is_ok());
|
|
560
|
+
assert_eq!(result.unwrap(), PathBuf::from("invalidprefix:some/path"));
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
#[test]
|
|
564
|
+
fn test_empty_path_after_prefix_go() {
|
|
565
|
+
if Command::new("go").arg("version").output().is_err() {
|
|
566
|
+
return;
|
|
567
|
+
} // Skip if no go
|
|
568
|
+
let result = resolve_path("go:");
|
|
569
|
+
assert!(result.is_err());
|
|
570
|
+
assert!(result.unwrap_err().contains("cannot be empty"));
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
#[test]
|
|
574
|
+
fn test_empty_path_after_prefix_js() {
|
|
575
|
+
if Command::new("node").arg("--version").output().is_err() {
|
|
576
|
+
return;
|
|
577
|
+
} // Skip if no node
|
|
578
|
+
let result = resolve_path("js:");
|
|
579
|
+
assert!(result.is_err());
|
|
580
|
+
assert!(result.unwrap_err().contains("cannot be empty"));
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
#[test]
|
|
584
|
+
fn test_empty_path_after_prefix_rust() {
|
|
585
|
+
let result = resolve_path("rust:");
|
|
586
|
+
assert!(result.is_err());
|
|
587
|
+
assert!(result.unwrap_err().contains("cannot be empty"));
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
#[test]
|
|
591
|
+
fn test_path_with_dotdot_js() {
|
|
592
|
+
if Command::new("node").arg("--version").output().is_err() {
|
|
593
|
+
return;
|
|
594
|
+
} // Skip if no node
|
|
595
|
+
let result = resolve_path("js:lodash/../other");
|
|
596
|
+
assert!(result.is_err());
|
|
597
|
+
assert!(result.unwrap_err().contains("cannot contain '..'"));
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
#[test]
|
|
601
|
+
fn test_path_with_dotdot_go() {
|
|
602
|
+
if Command::new("go").arg("version").output().is_err() {
|
|
603
|
+
return;
|
|
604
|
+
} // Skip if no go
|
|
605
|
+
let result = resolve_path("go:fmt/../other");
|
|
606
|
+
assert!(result.is_err());
|
|
607
|
+
assert!(result.unwrap_err().contains("cannot contain '..'"));
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
// --- Split Module and Subpath Tests ---
|
|
611
|
+
|
|
612
|
+
#[test]
|
|
613
|
+
fn test_go_split_module_and_subpath() {
|
|
614
|
+
let resolver = GoPathResolver::new();
|
|
615
|
+
|
|
616
|
+
// Test stdlib
|
|
617
|
+
let (module, subpath) = resolver.split_module_and_subpath("fmt").unwrap();
|
|
618
|
+
assert_eq!(module, "fmt");
|
|
619
|
+
assert_eq!(subpath, None);
|
|
620
|
+
|
|
621
|
+
// Test stdlib with slashes
|
|
622
|
+
let (module, subpath) = resolver.split_module_and_subpath("net/http").unwrap();
|
|
623
|
+
assert_eq!(module, "net/http");
|
|
624
|
+
assert_eq!(subpath, None);
|
|
625
|
+
|
|
626
|
+
// Test GitHub repo
|
|
627
|
+
let (module, subpath) = resolver
|
|
628
|
+
.split_module_and_subpath("github.com/user/repo")
|
|
629
|
+
.unwrap();
|
|
630
|
+
assert_eq!(module, "github.com/user/repo");
|
|
631
|
+
assert_eq!(subpath, None);
|
|
632
|
+
|
|
633
|
+
// Test GitHub repo with subpath
|
|
634
|
+
let (module, subpath) = resolver
|
|
635
|
+
.split_module_and_subpath("github.com/user/repo/subpath")
|
|
636
|
+
.unwrap();
|
|
637
|
+
assert_eq!(module, "github.com/user/repo");
|
|
638
|
+
assert_eq!(subpath, Some("subpath".to_string()));
|
|
639
|
+
|
|
640
|
+
// Test GitHub repo with multi-segment subpath
|
|
641
|
+
let (module, subpath) = resolver
|
|
642
|
+
.split_module_and_subpath("github.com/user/repo/sub/path")
|
|
643
|
+
.unwrap();
|
|
644
|
+
assert_eq!(module, "github.com/user/repo");
|
|
645
|
+
assert_eq!(subpath, Some("sub/path".to_string()));
|
|
646
|
+
|
|
647
|
+
// Test error cases
|
|
648
|
+
assert!(resolver.split_module_and_subpath("").is_err());
|
|
649
|
+
assert!(resolver.split_module_and_subpath("fmt/../other").is_err());
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
#[test]
|
|
653
|
+
fn test_js_split_module_and_subpath() {
|
|
654
|
+
let resolver = JavaScriptPathResolver::new();
|
|
655
|
+
|
|
656
|
+
// Test regular package
|
|
657
|
+
let (module, subpath) = resolver.split_module_and_subpath("lodash").unwrap();
|
|
658
|
+
assert_eq!(module, "lodash");
|
|
659
|
+
assert_eq!(subpath, None);
|
|
660
|
+
|
|
661
|
+
// Test regular package with subpath
|
|
662
|
+
let (module, subpath) = resolver.split_module_and_subpath("lodash/get").unwrap();
|
|
663
|
+
assert_eq!(module, "lodash");
|
|
664
|
+
assert_eq!(subpath, Some("get".to_string()));
|
|
665
|
+
|
|
666
|
+
// Test scoped package
|
|
667
|
+
let (module, subpath) = resolver.split_module_and_subpath("@types/node").unwrap();
|
|
668
|
+
assert_eq!(module, "@types/node");
|
|
669
|
+
assert_eq!(subpath, None);
|
|
670
|
+
|
|
671
|
+
// Test scoped package with subpath
|
|
672
|
+
let (module, subpath) = resolver.split_module_and_subpath("@types/node/fs").unwrap();
|
|
673
|
+
assert_eq!(module, "@types/node");
|
|
674
|
+
assert_eq!(subpath, Some("fs".to_string()));
|
|
675
|
+
|
|
676
|
+
// Test error cases
|
|
677
|
+
assert!(resolver.split_module_and_subpath("").is_err());
|
|
678
|
+
assert!(resolver
|
|
679
|
+
.split_module_and_subpath("lodash/../other")
|
|
680
|
+
.is_err());
|
|
681
|
+
assert!(resolver.split_module_and_subpath("@types").is_err());
|
|
682
|
+
assert!(resolver.split_module_and_subpath("@/invalid").is_err());
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
#[test]
|
|
686
|
+
fn test_rust_split_module_and_subpath() {
|
|
687
|
+
let resolver = RustPathResolver::new();
|
|
688
|
+
|
|
689
|
+
// For Rust, the entire path is treated as the module identifier
|
|
690
|
+
let (module, subpath) = resolver
|
|
691
|
+
.split_module_and_subpath("/path/to/Cargo.toml")
|
|
692
|
+
.unwrap();
|
|
693
|
+
assert_eq!(module, "/path/to/Cargo.toml");
|
|
694
|
+
assert_eq!(subpath, None);
|
|
695
|
+
|
|
696
|
+
// Test error cases
|
|
697
|
+
assert!(resolver.split_module_and_subpath("").is_err());
|
|
698
|
+
}
|