github-to-mcp-monorepo 1.0.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/.env.example +8 -0
- package/.github/CODEOWNERS +6 -0
- package/.husky/pre-commit +1 -0
- package/.nvmrc +1 -0
- package/.prettierignore +5 -0
- package/.prettierrc +7 -0
- package/.vscode/settings.json +4 -0
- package/ARCHITECTURE.md +1429 -0
- package/CHANGELOG.md +167 -0
- package/CONTRIBUTING.md +327 -0
- package/LICENSE +201 -0
- package/README.md +1028 -0
- package/SECURITY.md +248 -0
- package/VISUAL_GUIDE.md +437 -0
- package/apps/vscode/IMPLEMENTATION.md +480 -0
- package/apps/vscode/README.md +248 -0
- package/apps/vscode/package.json +381 -0
- package/apps/vscode/resources/icon.png +0 -0
- package/apps/vscode/resources/icon.svg +5 -0
- package/apps/vscode/src/commands/browseRegistry.ts +211 -0
- package/apps/vscode/src/commands/configureClaudeDesktop.ts +332 -0
- package/apps/vscode/src/commands/convert.ts +82 -0
- package/apps/vscode/src/commands/convertCurrentRepo.ts +109 -0
- package/apps/vscode/src/commands/convertFromUrl.ts +138 -0
- package/apps/vscode/src/commands/index.ts +121 -0
- package/apps/vscode/src/commands/validate.ts +197 -0
- package/apps/vscode/src/extension.ts +464 -0
- package/apps/vscode/src/global.d.ts +36 -0
- package/apps/vscode/src/test/extension.test.ts +73 -0
- package/apps/vscode/src/utils/file-generator.ts +529 -0
- package/apps/vscode/src/utils/github-api.ts +335 -0
- package/apps/vscode/src/utils/index.ts +29 -0
- package/apps/vscode/src/utils/mcp-config.ts +334 -0
- package/apps/vscode/src/utils/storage.ts +87 -0
- package/apps/vscode/src/views/McpServersTreeView.ts +160 -0
- package/apps/vscode/src/views/OutputChannelView.ts +195 -0
- package/apps/vscode/src/views/StatusBarItem.ts +251 -0
- package/apps/vscode/src/views/ToolsExplorerView.ts +314 -0
- package/apps/vscode/src/views/historyProvider.ts +75 -0
- package/apps/vscode/src/views/index.ts +12 -0
- package/apps/vscode/src/views/resultsPanel.ts +330 -0
- package/apps/vscode/src/webviews/ConversionPanel.ts +350 -0
- package/apps/vscode/src/webviews/ToolDetailsPanel.ts +448 -0
- package/apps/vscode/src/webviews/index.ts +9 -0
- package/apps/vscode/src/webviews/webview-ui/styles.ts +492 -0
- package/apps/vscode/tsconfig.json +20 -0
- package/apps/web/PLAYGROUND_GUIDE.md +499 -0
- package/apps/web/README.md +505 -0
- package/apps/web/app/api/convert/route.ts +100 -0
- package/apps/web/app/api/convert/stream/route.ts +198 -0
- package/apps/web/app/api/deploy/route.ts +157 -0
- package/apps/web/app/api/edge/route.ts +308 -0
- package/apps/web/app/api/export-docker/route.ts +284 -0
- package/apps/web/app/api/generate-openapi/route.ts +119 -0
- package/apps/web/app/api/mcp/[serverId]/route.ts +263 -0
- package/apps/web/app/api/playground/connect/route.ts +143 -0
- package/apps/web/app/api/playground/disconnect/route.ts +78 -0
- package/apps/web/app/api/playground/execute/route.ts +135 -0
- package/apps/web/app/api/playground/sessions/route.ts +103 -0
- package/apps/web/app/api/playground/tools/route.ts +117 -0
- package/apps/web/app/api/playground/v2/connect/route.ts +96 -0
- package/apps/web/app/api/playground/v2/disconnect/route.ts +88 -0
- package/apps/web/app/api/playground/v2/health/route.ts +80 -0
- package/apps/web/app/api/playground/v2/prompts/route.ts +160 -0
- package/apps/web/app/api/playground/v2/resources/route.ts +159 -0
- package/apps/web/app/api/playground/v2/sessions/route.ts +184 -0
- package/apps/web/app/api/playground/v2/tools/route.ts +167 -0
- package/apps/web/app/api/stream/route.ts +232 -0
- package/apps/web/app/batch/BatchConvertClient.tsx +190 -0
- package/apps/web/app/batch/page.tsx +37 -0
- package/apps/web/app/convert/page.tsx +269 -0
- package/apps/web/app/dashboard/page.tsx +380 -0
- package/apps/web/app/globals.css +622 -0
- package/apps/web/app/layout.tsx +120 -0
- package/apps/web/app/manifest.ts +31 -0
- package/apps/web/app/opengraph-image.tsx +112 -0
- package/apps/web/app/page.old.tsx +924 -0
- package/apps/web/app/page.tsx +77 -0
- package/apps/web/app/playground/page.tsx +306 -0
- package/apps/web/app/playground/v2/error.tsx +163 -0
- package/apps/web/app/playground/v2/layout.tsx +58 -0
- package/apps/web/app/playground/v2/loading.tsx +152 -0
- package/apps/web/app/playground/v2/page.tsx +644 -0
- package/apps/web/app/playground/v2/providers.tsx +214 -0
- package/apps/web/app/playground/v2/use-shortcuts.ts +209 -0
- package/apps/web/app/playground/v2/use-url-state.ts +296 -0
- package/apps/web/app/providers.tsx +22 -0
- package/apps/web/app/sitemap.ts +32 -0
- package/apps/web/app/twitter-image.tsx +112 -0
- package/apps/web/components/BranchSelector.tsx +401 -0
- package/apps/web/components/ClaudeConfigExport.tsx +226 -0
- package/apps/web/components/Features.tsx +84 -0
- package/apps/web/components/Footer.tsx +119 -0
- package/apps/web/components/GenerationProgress.tsx +248 -0
- package/apps/web/components/GithubUrlInput.tsx +483 -0
- package/apps/web/components/Header.tsx +175 -0
- package/apps/web/components/Hero.tsx +117 -0
- package/apps/web/components/HowItWorks.tsx +119 -0
- package/apps/web/components/InstallBanner.tsx +158 -0
- package/apps/web/components/Logo.tsx +116 -0
- package/apps/web/components/ParticleBackground.tsx +105 -0
- package/apps/web/components/Playground.tsx +472 -0
- package/apps/web/components/PlaygroundToolTester.tsx +410 -0
- package/apps/web/components/ProductCards.tsx +179 -0
- package/apps/web/components/SplitView.tsx +194 -0
- package/apps/web/components/ToolFilter.tsx +260 -0
- package/apps/web/components/ToolList.tsx +325 -0
- package/apps/web/components/batch/BatchConvert.tsx +785 -0
- package/apps/web/components/batch/index.ts +7 -0
- package/apps/web/components/convert/ConfigTabs.tsx +230 -0
- package/apps/web/components/convert/ConversionResult.tsx +482 -0
- package/apps/web/components/convert/InlinePlayground.tsx +259 -0
- package/apps/web/components/convert/LoadingSteps.tsx +311 -0
- package/apps/web/components/convert/OneClickInstall.tsx +224 -0
- package/apps/web/components/convert/ToolCard.tsx +189 -0
- package/apps/web/components/convert/TryInPlayground.tsx +242 -0
- package/apps/web/components/convert/index.ts +12 -0
- package/apps/web/components/deploy/DeployButton.tsx +369 -0
- package/apps/web/components/deploy/index.ts +7 -0
- package/apps/web/components/docker/DockerExport.tsx +690 -0
- package/apps/web/components/docker/index.ts +7 -0
- package/apps/web/components/install/OneClickInstall.tsx +676 -0
- package/apps/web/components/install/index.ts +7 -0
- package/apps/web/components/playground/CapabilityTabs.tsx +150 -0
- package/apps/web/components/playground/ConnectionStatusV2.tsx +322 -0
- package/apps/web/components/playground/EmptyStates.tsx +305 -0
- package/apps/web/components/playground/ExecutionLog.tsx +260 -0
- package/apps/web/components/playground/ExecutionLogV2.tsx +378 -0
- package/apps/web/components/playground/JsonViewer.tsx +388 -0
- package/apps/web/components/playground/PlaygroundLayout.tsx +244 -0
- package/apps/web/components/playground/PromptsPanel.tsx +385 -0
- package/apps/web/components/playground/ResourcesPanel.tsx +378 -0
- package/apps/web/components/playground/SchemaForm.tsx +477 -0
- package/apps/web/components/playground/ServerStatus.tsx +151 -0
- package/apps/web/components/playground/ShareButton.tsx +239 -0
- package/apps/web/components/playground/ToolsPanel.tsx +309 -0
- package/apps/web/components/playground/TransportConfigurator.tsx +563 -0
- package/apps/web/components/playground/index.ts +74 -0
- package/apps/web/components/playground/types.ts +202 -0
- package/apps/web/components/streaming/StreamingProgress.tsx +441 -0
- package/apps/web/components/streaming/index.ts +7 -0
- package/apps/web/components/ui/badge.tsx +42 -0
- package/apps/web/components/ui/button.tsx +88 -0
- package/apps/web/components/ui/card.tsx +75 -0
- package/apps/web/components/ui/code-block.tsx +122 -0
- package/apps/web/components/ui/index.ts +12 -0
- package/apps/web/components/ui/input.tsx +55 -0
- package/apps/web/components/ui/tabs.tsx +61 -0
- package/apps/web/hooks/index.ts +85 -0
- package/apps/web/hooks/types.ts +1173 -0
- package/apps/web/hooks/use-conversion.ts +133 -0
- package/apps/web/hooks/use-execution-history.ts +376 -0
- package/apps/web/hooks/use-generation-progress.ts +147 -0
- package/apps/web/hooks/use-local-storage.ts +88 -0
- package/apps/web/hooks/use-mcp-client.ts +623 -0
- package/apps/web/hooks/use-mcp-connection.ts +500 -0
- package/apps/web/hooks/use-mcp-execution.ts +282 -0
- package/apps/web/hooks/use-mcp-prompts.ts +441 -0
- package/apps/web/hooks/use-mcp-resources.ts +430 -0
- package/apps/web/hooks/use-mcp-tools.ts +540 -0
- package/apps/web/hooks/use-playground-store.ts +299 -0
- package/apps/web/hooks/use-playground.ts +184 -0
- package/apps/web/hooks/use-streaming-conversion.ts +227 -0
- package/apps/web/hooks/useBatchConversion.ts +271 -0
- package/apps/web/hooks/useDockerConfig.ts +161 -0
- package/apps/web/hooks/usePlatformDetection.ts +80 -0
- package/apps/web/hooks/useStreaming.ts +199 -0
- package/apps/web/lib/api/errors.ts +386 -0
- package/apps/web/lib/api/index.ts +137 -0
- package/apps/web/lib/api/logger.ts +187 -0
- package/apps/web/lib/api/middleware.ts +364 -0
- package/apps/web/lib/api/openapi.ts +977 -0
- package/apps/web/lib/api/session-manager.ts +594 -0
- package/apps/web/lib/api/types.ts +433 -0
- package/apps/web/lib/api/validation.ts +523 -0
- package/apps/web/lib/constants.ts +114 -0
- package/apps/web/lib/mcp/client.ts +1137 -0
- package/apps/web/lib/mcp/events.ts +651 -0
- package/apps/web/lib/mcp/index.ts +347 -0
- package/apps/web/lib/mcp/logger.ts +428 -0
- package/apps/web/lib/mcp/metrics.ts +703 -0
- package/apps/web/lib/mcp/retry.ts +616 -0
- package/apps/web/lib/mcp/session-manager.ts +779 -0
- package/apps/web/lib/mcp/transports.ts +988 -0
- package/apps/web/lib/mcp/types.ts +594 -0
- package/apps/web/lib/mcp-client-enhanced.ts +871 -0
- package/apps/web/lib/mcp-client.ts +778 -0
- package/apps/web/lib/mcp-errors.ts +489 -0
- package/apps/web/lib/mcp-sandbox.ts +593 -0
- package/apps/web/lib/mcp-testing.ts +428 -0
- package/apps/web/lib/mcp-types.ts +448 -0
- package/apps/web/lib/playground-store.tsx +1147 -0
- package/apps/web/lib/utils.ts +439 -0
- package/apps/web/next-env.d.ts +5 -0
- package/apps/web/next.config.js +23 -0
- package/apps/web/package.json +55 -0
- package/apps/web/postcss.config.js +6 -0
- package/apps/web/public/.well-known/ai-plugin.json +17 -0
- package/apps/web/public/logo.svg +6 -0
- package/apps/web/public/robots.txt +22 -0
- package/apps/web/public/schema.json +27 -0
- package/apps/web/tailwind.config.js +26 -0
- package/apps/web/tailwind.config.ts +123 -0
- package/apps/web/tsconfig.json +20 -0
- package/apps/web/types/deploy.ts +139 -0
- package/apps/web/types/index.ts +247 -0
- package/apps/web/vercel.json +39 -0
- package/eslint.config.mjs +23 -0
- package/llms.txt +102 -0
- package/mkdocs/docs/api/core.md +318 -0
- package/mkdocs/docs/api/index.md +128 -0
- package/mkdocs/docs/api/mcp-server.md +301 -0
- package/mkdocs/docs/api/openapi-parser.md +254 -0
- package/mkdocs/docs/assets/logo.svg +7 -0
- package/mkdocs/docs/changelog.md +118 -0
- package/mkdocs/docs/cli/generate.md +148 -0
- package/mkdocs/docs/cli/index.md +52 -0
- package/mkdocs/docs/cli/inspect.md +164 -0
- package/mkdocs/docs/cli/serve.md +136 -0
- package/mkdocs/docs/concepts/classification.md +254 -0
- package/mkdocs/docs/concepts/how-it-works.md +299 -0
- package/mkdocs/docs/concepts/index.md +77 -0
- package/mkdocs/docs/concepts/mcp-protocol.md +362 -0
- package/mkdocs/docs/concepts/tool-types.md +382 -0
- package/mkdocs/docs/contributing/architecture.md +262 -0
- package/mkdocs/docs/contributing/development.md +245 -0
- package/mkdocs/docs/contributing/index.md +73 -0
- package/mkdocs/docs/contributing/testing.md +320 -0
- package/mkdocs/docs/getting-started/configuration.md +235 -0
- package/mkdocs/docs/getting-started/index.md +54 -0
- package/mkdocs/docs/getting-started/installation.md +145 -0
- package/mkdocs/docs/getting-started/quickstart.md +160 -0
- package/mkdocs/docs/guides/batch.md +375 -0
- package/mkdocs/docs/guides/claude-desktop.md +227 -0
- package/mkdocs/docs/guides/cursor.md +188 -0
- package/mkdocs/docs/guides/custom-tools.md +367 -0
- package/mkdocs/docs/guides/index.md +78 -0
- package/mkdocs/docs/guides/private-repos.md +221 -0
- package/mkdocs/docs/guides/vscode.md +247 -0
- package/mkdocs/docs/index.md +175 -0
- package/mkdocs/docs/reference/config.md +223 -0
- package/mkdocs/docs/reference/env.md +192 -0
- package/mkdocs/docs/reference/index.md +102 -0
- package/mkdocs/docs/reference/tools.md +309 -0
- package/mkdocs/docs/stylesheets/extra.css +231 -0
- package/mkdocs/mkdocs.yml +204 -0
- package/mkdocs/overrides/.gitkeep +1 -0
- package/mkdocs/overrides/main.html +7 -0
- package/mkdocs/python-deps.txt +7 -0
- package/mkdocs/vercel.json +11 -0
- package/package.json +63 -0
- package/packages/core/package.json +61 -0
- package/packages/core/src/__tests__/bitbucket-client.test.ts +366 -0
- package/packages/core/src/__tests__/cli.test.ts +235 -0
- package/packages/core/src/__tests__/code-extractor.test.ts +378 -0
- package/packages/core/src/__tests__/docker-generator.test.ts +255 -0
- package/packages/core/src/__tests__/github-client.test.ts +390 -0
- package/packages/core/src/__tests__/gitlab-client.test.ts +319 -0
- package/packages/core/src/__tests__/go-extractor.test.ts +351 -0
- package/packages/core/src/__tests__/graphql-extractor.test.ts +330 -0
- package/packages/core/src/__tests__/java-extractor.test.ts +497 -0
- package/packages/core/src/__tests__/plugins.test.ts +467 -0
- package/packages/core/src/__tests__/readme-extractor.test.ts +258 -0
- package/packages/core/src/__tests__/redis-cache.test.ts +307 -0
- package/packages/core/src/__tests__/rust-extractor.test.ts +252 -0
- package/packages/core/src/__tests__/streaming.test.ts +251 -0
- package/packages/core/src/additional-extractors.ts +333 -0
- package/packages/core/src/cache/cache-interface.ts +179 -0
- package/packages/core/src/cache/index.ts +210 -0
- package/packages/core/src/cache/redis-cache.ts +291 -0
- package/packages/core/src/cache/upstash-cache.ts +379 -0
- package/packages/core/src/cache.ts +251 -0
- package/packages/core/src/cli.ts +822 -0
- package/packages/core/src/code-extractor.ts +696 -0
- package/packages/core/src/docker-generator.ts +470 -0
- package/packages/core/src/edge-compatible.ts +491 -0
- package/packages/core/src/extractors/go-extractor.ts +791 -0
- package/packages/core/src/extractors/index.ts +9 -0
- package/packages/core/src/extractors/java-extractor.ts +937 -0
- package/packages/core/src/extractors/rust-extractor.ts +744 -0
- package/packages/core/src/github-client.ts +319 -0
- package/packages/core/src/go-generator.ts +356 -0
- package/packages/core/src/graphql-extractor.ts +358 -0
- package/packages/core/src/index.ts +797 -0
- package/packages/core/src/langchain-exporter.ts +617 -0
- package/packages/core/src/language-parsers.ts +1114 -0
- package/packages/core/src/mcp-introspector.ts +279 -0
- package/packages/core/src/monorepo-detector.ts +378 -0
- package/packages/core/src/plugins/index.ts +370 -0
- package/packages/core/src/plugins/registry.ts +404 -0
- package/packages/core/src/plugins/types.ts +215 -0
- package/packages/core/src/providers/base-provider.ts +246 -0
- package/packages/core/src/providers/bitbucket-client.ts +464 -0
- package/packages/core/src/providers/gitlab-client.ts +388 -0
- package/packages/core/src/providers/index.ts +176 -0
- package/packages/core/src/python-generator.ts +260 -0
- package/packages/core/src/queue/index.ts +100 -0
- package/packages/core/src/queue/memory-queue.ts +445 -0
- package/packages/core/src/queue/redis-queue.ts +578 -0
- package/packages/core/src/queue/types.ts +251 -0
- package/packages/core/src/readme-extractor.ts +409 -0
- package/packages/core/src/schema-generator.ts +638 -0
- package/packages/core/src/streaming.ts +999 -0
- package/packages/core/src/types.ts +289 -0
- package/packages/core/tsconfig.json +9 -0
- package/packages/core/tsup.config.ts +25 -0
- package/packages/mcp-server/README.md +297 -0
- package/packages/mcp-server/package.json +55 -0
- package/packages/mcp-server/src/__tests__/mcp-server.test.ts +177 -0
- package/packages/mcp-server/src/__tests__/tools.test.ts +217 -0
- package/packages/mcp-server/src/index.ts +1206 -0
- package/packages/mcp-server/src/prompts/index.ts +601 -0
- package/packages/mcp-server/src/tools/export-docker.ts +362 -0
- package/packages/mcp-server/src/tools/generate-openapi.ts +162 -0
- package/packages/mcp-server/src/tools/monitor-mcp-server.ts +448 -0
- package/packages/mcp-server/src/tools/stream-convert.ts +398 -0
- package/packages/mcp-server/src/tools/test-mcp-tool.ts +531 -0
- package/packages/mcp-server/tsconfig.json +12 -0
- package/packages/mcp-server/tsup.config.ts +14 -0
- package/packages/openapi-parser/package-lock.json +3028 -0
- package/packages/openapi-parser/package.json +41 -0
- package/packages/openapi-parser/src/analyzer.ts +700 -0
- package/packages/openapi-parser/src/asyncapi-parser.ts +475 -0
- package/packages/openapi-parser/src/cli.ts +302 -0
- package/packages/openapi-parser/src/generator.ts +570 -0
- package/packages/openapi-parser/src/generators/express-analyzer.ts +649 -0
- package/packages/openapi-parser/src/generators/fastapi-analyzer.ts +960 -0
- package/packages/openapi-parser/src/generators/index.ts +200 -0
- package/packages/openapi-parser/src/generators/nextjs-analyzer.ts +768 -0
- package/packages/openapi-parser/src/generators/openapi-builder.ts +527 -0
- package/packages/openapi-parser/src/generators/types.ts +298 -0
- package/packages/openapi-parser/src/graphql-parser.ts +462 -0
- package/packages/openapi-parser/src/grpc-parser.ts +649 -0
- package/packages/openapi-parser/src/har-parser.ts +723 -0
- package/packages/openapi-parser/src/index.ts +635 -0
- package/packages/openapi-parser/src/insomnia-parser.ts +614 -0
- package/packages/openapi-parser/src/parser.ts +231 -0
- package/packages/openapi-parser/src/postman-parser.ts +611 -0
- package/packages/openapi-parser/src/ref-resolver.ts +313 -0
- package/packages/openapi-parser/src/transformer.ts +459 -0
- package/packages/openapi-parser/tests/generators/express.test.ts +209 -0
- package/packages/openapi-parser/tests/generators/fastapi.test.ts +236 -0
- package/packages/openapi-parser/tests/generators/nextjs.test.ts +273 -0
- package/packages/openapi-parser/tests/parsers.test.ts +847 -0
- package/packages/openapi-parser/tsconfig.json +9 -0
- package/packages/openapi-parser/tsup.config.ts +11 -0
- package/packages/registry/package.json +59 -0
- package/packages/registry/src/cli.ts +456 -0
- package/packages/registry/src/index.ts +44 -0
- package/packages/registry/src/popular/github.json +47 -0
- package/packages/registry/src/popular/index.ts +55 -0
- package/packages/registry/src/popular/linear.json +42 -0
- package/packages/registry/src/popular/notion.json +42 -0
- package/packages/registry/src/popular/openai.json +40 -0
- package/packages/registry/src/popular/resend.json +38 -0
- package/packages/registry/src/popular/slack.json +42 -0
- package/packages/registry/src/popular/stripe.json +163 -0
- package/packages/registry/src/popular/supabase.json +42 -0
- package/packages/registry/src/popular/twilio.json +40 -0
- package/packages/registry/src/popular/vercel.json +40 -0
- package/packages/registry/src/registry.ts +492 -0
- package/packages/registry/src/storage.ts +334 -0
- package/packages/registry/src/types.ts +275 -0
- package/packages/registry/src/updater.ts +208 -0
- package/packages/registry/tsconfig.json +10 -0
- package/packages/registry/tsup.config.ts +11 -0
- package/pnpm-workspace.yaml +3 -0
- package/scripts/build-docs.sh +16 -0
- package/server.json +9 -0
- package/templates/Dockerfile.python.template +60 -0
- package/templates/Dockerfile.typescript.template +60 -0
- package/templates/docker-compose.template.yml +68 -0
- package/tests/fixtures/express-app/index.js +34 -0
- package/tests/fixtures/express-app/routes/posts.js +43 -0
- package/tests/fixtures/express-app/routes/users.js +58 -0
- package/tests/fixtures/fastapi-app/main.py +125 -0
- package/tests/fixtures/fastapi-app/routes/admin.py +42 -0
- package/tests/fixtures/graphql/simple-schema.graphql +65 -0
- package/tests/fixtures/mocks/github-api-responses.json +63 -0
- package/tests/fixtures/nextjs-app/app/api/posts/route.ts +55 -0
- package/tests/fixtures/nextjs-app/app/api/users/[id]/route.ts +63 -0
- package/tests/fixtures/nextjs-app/app/api/users/route.ts +44 -0
- package/tests/fixtures/nextjs-app/pages/api/health.ts +28 -0
- package/tests/fixtures/openapi/petstore.yaml +179 -0
- package/tests/integration/langchain-export.test.ts +405 -0
- package/tests/integration/openapi-conversion.test.ts +221 -0
- package/tsconfig.json +18 -0
- package/vitest.config.ts +32 -0
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Unit tests for Java extractor
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
6
|
+
import { JavaExtractor } from '../extractors/java-extractor';
|
|
7
|
+
|
|
8
|
+
describe('JavaExtractor', () => {
|
|
9
|
+
let extractor: JavaExtractor;
|
|
10
|
+
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
extractor = new JavaExtractor();
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
describe('extract', () => {
|
|
16
|
+
describe('Spring Boot endpoints', () => {
|
|
17
|
+
it('should extract @GetMapping endpoints', async () => {
|
|
18
|
+
const code = `
|
|
19
|
+
package com.example.controller;
|
|
20
|
+
|
|
21
|
+
import org.springframework.web.bind.annotation.*;
|
|
22
|
+
|
|
23
|
+
@RestController
|
|
24
|
+
@RequestMapping("/api")
|
|
25
|
+
public class UserController {
|
|
26
|
+
|
|
27
|
+
@GetMapping("/users/{id}")
|
|
28
|
+
public User getUser(@PathVariable String id) {
|
|
29
|
+
return userService.findById(id);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
`;
|
|
33
|
+
|
|
34
|
+
const tools = await extractor.extract(code, 'UserController.java');
|
|
35
|
+
|
|
36
|
+
expect(tools.length).toBeGreaterThan(0);
|
|
37
|
+
const tool = tools.find(t => t.name.includes('get_api_users'));
|
|
38
|
+
expect(tool).toBeDefined();
|
|
39
|
+
expect(tool?.inputSchema.properties).toHaveProperty('id');
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('should extract @PostMapping with @RequestBody', async () => {
|
|
43
|
+
const code = `
|
|
44
|
+
package com.example.controller;
|
|
45
|
+
|
|
46
|
+
import org.springframework.web.bind.annotation.*;
|
|
47
|
+
|
|
48
|
+
@RestController
|
|
49
|
+
public class UserController {
|
|
50
|
+
|
|
51
|
+
@PostMapping("/users")
|
|
52
|
+
public User createUser(@RequestBody CreateUserDto dto) {
|
|
53
|
+
return userService.create(dto);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
`;
|
|
57
|
+
|
|
58
|
+
const tools = await extractor.extract(code, 'UserController.java');
|
|
59
|
+
|
|
60
|
+
expect(tools.length).toBeGreaterThan(0);
|
|
61
|
+
const tool = tools.find(t => t.name.includes('post_users'));
|
|
62
|
+
expect(tool).toBeDefined();
|
|
63
|
+
expect(tool?.inputSchema.properties).toHaveProperty('dto');
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('should extract @RequestMapping with method attribute', async () => {
|
|
67
|
+
const code = `
|
|
68
|
+
package com.example.controller;
|
|
69
|
+
|
|
70
|
+
import org.springframework.web.bind.annotation.*;
|
|
71
|
+
|
|
72
|
+
@RestController
|
|
73
|
+
public class ItemController {
|
|
74
|
+
|
|
75
|
+
@RequestMapping(value = "/items", method = RequestMethod.GET)
|
|
76
|
+
public List<Item> listItems() {
|
|
77
|
+
return itemService.findAll();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
`;
|
|
81
|
+
|
|
82
|
+
const tools = await extractor.extract(code, 'ItemController.java');
|
|
83
|
+
|
|
84
|
+
expect(tools.length).toBeGreaterThan(0);
|
|
85
|
+
expect(tools.some(t => t.name.includes('get_items'))).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('should handle @RequestParam', async () => {
|
|
89
|
+
const code = `
|
|
90
|
+
package com.example.controller;
|
|
91
|
+
|
|
92
|
+
import org.springframework.web.bind.annotation.*;
|
|
93
|
+
|
|
94
|
+
@RestController
|
|
95
|
+
public class SearchController {
|
|
96
|
+
|
|
97
|
+
@GetMapping("/search")
|
|
98
|
+
public List<Result> search(
|
|
99
|
+
@RequestParam String query,
|
|
100
|
+
@RequestParam(required = false) Integer limit
|
|
101
|
+
) {
|
|
102
|
+
return searchService.search(query, limit);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
`;
|
|
106
|
+
|
|
107
|
+
const tools = await extractor.extract(code, 'SearchController.java');
|
|
108
|
+
|
|
109
|
+
const tool = tools.find(t => t.name.includes('search'));
|
|
110
|
+
expect(tool).toBeDefined();
|
|
111
|
+
expect(tool?.inputSchema.properties).toHaveProperty('query');
|
|
112
|
+
expect(tool?.inputSchema.required).toContain('query');
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('should combine class and method level paths', async () => {
|
|
116
|
+
const code = `
|
|
117
|
+
package com.example.controller;
|
|
118
|
+
|
|
119
|
+
import org.springframework.web.bind.annotation.*;
|
|
120
|
+
|
|
121
|
+
@RestController
|
|
122
|
+
@RequestMapping("/api/v1")
|
|
123
|
+
public class ProductController {
|
|
124
|
+
|
|
125
|
+
@GetMapping("/products")
|
|
126
|
+
public List<Product> listProducts() {
|
|
127
|
+
return productService.findAll();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
`;
|
|
131
|
+
|
|
132
|
+
const tools = await extractor.extract(code, 'ProductController.java');
|
|
133
|
+
|
|
134
|
+
const tool = tools.find(t => t.name.includes('api'));
|
|
135
|
+
expect(tool).toBeDefined();
|
|
136
|
+
// Path should be combined: /api/v1/products
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it('should extract multiple mapping annotations', async () => {
|
|
140
|
+
const code = `
|
|
141
|
+
package com.example.controller;
|
|
142
|
+
|
|
143
|
+
import org.springframework.web.bind.annotation.*;
|
|
144
|
+
|
|
145
|
+
@RestController
|
|
146
|
+
@RequestMapping("/api")
|
|
147
|
+
public class CrudController {
|
|
148
|
+
|
|
149
|
+
@GetMapping("/items")
|
|
150
|
+
public List<Item> list() { return null; }
|
|
151
|
+
|
|
152
|
+
@GetMapping("/items/{id}")
|
|
153
|
+
public Item get(@PathVariable Long id) { return null; }
|
|
154
|
+
|
|
155
|
+
@PostMapping("/items")
|
|
156
|
+
public Item create(@RequestBody Item item) { return null; }
|
|
157
|
+
|
|
158
|
+
@PutMapping("/items/{id}")
|
|
159
|
+
public Item update(@PathVariable Long id, @RequestBody Item item) { return null; }
|
|
160
|
+
|
|
161
|
+
@DeleteMapping("/items/{id}")
|
|
162
|
+
public void delete(@PathVariable Long id) { }
|
|
163
|
+
}
|
|
164
|
+
`;
|
|
165
|
+
|
|
166
|
+
const tools = await extractor.extract(code, 'CrudController.java');
|
|
167
|
+
|
|
168
|
+
expect(tools.length).toBe(5);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
describe('JAX-RS endpoints', () => {
|
|
173
|
+
it('should extract JAX-RS @Path and @GET', async () => {
|
|
174
|
+
const code = `
|
|
175
|
+
package com.example.resource;
|
|
176
|
+
|
|
177
|
+
import javax.ws.rs.*;
|
|
178
|
+
|
|
179
|
+
@Path("/users")
|
|
180
|
+
public class UserResource {
|
|
181
|
+
|
|
182
|
+
@GET
|
|
183
|
+
@Path("/{id}")
|
|
184
|
+
public User getUser(@PathParam("id") String id) {
|
|
185
|
+
return userService.findById(id);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
`;
|
|
189
|
+
|
|
190
|
+
const tools = await extractor.extract(code, 'UserResource.java');
|
|
191
|
+
|
|
192
|
+
expect(tools.length).toBeGreaterThan(0);
|
|
193
|
+
const tool = tools.find(t => t.name.includes('users'));
|
|
194
|
+
expect(tool).toBeDefined();
|
|
195
|
+
expect(tool?.inputSchema.properties).toHaveProperty('id');
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('should extract @QueryParam', async () => {
|
|
199
|
+
const code = `
|
|
200
|
+
package com.example.resource;
|
|
201
|
+
|
|
202
|
+
import javax.ws.rs.*;
|
|
203
|
+
|
|
204
|
+
@Path("/search")
|
|
205
|
+
public class SearchResource {
|
|
206
|
+
|
|
207
|
+
@GET
|
|
208
|
+
public List<Result> search(
|
|
209
|
+
@QueryParam("q") String query,
|
|
210
|
+
@QueryParam("page") Integer page
|
|
211
|
+
) {
|
|
212
|
+
return searchService.search(query, page);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
`;
|
|
216
|
+
|
|
217
|
+
const tools = await extractor.extract(code, 'SearchResource.java');
|
|
218
|
+
|
|
219
|
+
const tool = tools.find(t => t.name.includes('search'));
|
|
220
|
+
expect(tool?.inputSchema.properties).toHaveProperty('query');
|
|
221
|
+
expect(tool?.inputSchema.properties).toHaveProperty('page');
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
it('should extract @POST with request body', async () => {
|
|
225
|
+
const code = `
|
|
226
|
+
package com.example.resource;
|
|
227
|
+
|
|
228
|
+
import javax.ws.rs.*;
|
|
229
|
+
|
|
230
|
+
@Path("/items")
|
|
231
|
+
public class ItemResource {
|
|
232
|
+
|
|
233
|
+
@POST
|
|
234
|
+
public Item createItem(CreateItemDto dto) {
|
|
235
|
+
return itemService.create(dto);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
`;
|
|
239
|
+
|
|
240
|
+
const tools = await extractor.extract(code, 'ItemResource.java');
|
|
241
|
+
|
|
242
|
+
expect(tools.some(t => t.name.includes('post'))).toBe(true);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
describe('Micronaut endpoints', () => {
|
|
247
|
+
it('should extract Micronaut @Controller routes', async () => {
|
|
248
|
+
const code = `
|
|
249
|
+
package com.example.controller;
|
|
250
|
+
|
|
251
|
+
import io.micronaut.http.annotation.*;
|
|
252
|
+
|
|
253
|
+
@Controller("/api")
|
|
254
|
+
public class ApiController {
|
|
255
|
+
|
|
256
|
+
@Get("/health")
|
|
257
|
+
public String health() {
|
|
258
|
+
return "OK";
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
@Post("/data")
|
|
262
|
+
public Data saveData(@Body DataDto dto) {
|
|
263
|
+
return dataService.save(dto);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
`;
|
|
267
|
+
|
|
268
|
+
const tools = await extractor.extract(code, 'ApiController.java');
|
|
269
|
+
|
|
270
|
+
expect(tools.length).toBeGreaterThan(0);
|
|
271
|
+
expect(tools.some(t => t.name.includes('health'))).toBe(true);
|
|
272
|
+
expect(tools.some(t => t.name.includes('data'))).toBe(true);
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
describe('Public methods with Javadoc', () => {
|
|
277
|
+
it('should extract public methods with Javadoc', async () => {
|
|
278
|
+
const code = `
|
|
279
|
+
package com.example.service;
|
|
280
|
+
|
|
281
|
+
public class CalculatorService {
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Adds two numbers together.
|
|
285
|
+
*
|
|
286
|
+
* @param a First number
|
|
287
|
+
* @param b Second number
|
|
288
|
+
* @return Sum of a and b
|
|
289
|
+
*/
|
|
290
|
+
public int add(int a, int b) {
|
|
291
|
+
return a + b;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
`;
|
|
295
|
+
|
|
296
|
+
const tools = await extractor.extract(code, 'CalculatorService.java');
|
|
297
|
+
|
|
298
|
+
expect(tools.length).toBeGreaterThan(0);
|
|
299
|
+
const tool = tools.find(t => t.name === 'add');
|
|
300
|
+
expect(tool).toBeDefined();
|
|
301
|
+
expect(tool?.description).toContain('Adds two numbers');
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
it('should parse @param tags', async () => {
|
|
305
|
+
const code = `
|
|
306
|
+
package com.example.service;
|
|
307
|
+
|
|
308
|
+
public class UserService {
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Find a user by their email address.
|
|
312
|
+
*
|
|
313
|
+
* @param email The email address to search for
|
|
314
|
+
* @return The user if found
|
|
315
|
+
* @throws UserNotFoundException if no user exists
|
|
316
|
+
*/
|
|
317
|
+
public User findByEmail(String email) {
|
|
318
|
+
return userRepository.findByEmail(email);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
`;
|
|
322
|
+
|
|
323
|
+
const tools = await extractor.extract(code, 'UserService.java');
|
|
324
|
+
|
|
325
|
+
const tool = tools.find(t => t.name.includes('email') || t.name === 'find_by_email');
|
|
326
|
+
if (tool) {
|
|
327
|
+
expect(tool.inputSchema.properties.email?.description).toContain('email');
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
it('should skip methods without Javadoc', async () => {
|
|
332
|
+
const code = `
|
|
333
|
+
package com.example.service;
|
|
334
|
+
|
|
335
|
+
public class Service {
|
|
336
|
+
|
|
337
|
+
// Simple comment, not Javadoc
|
|
338
|
+
public void methodWithoutJavadoc() {
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* This method has Javadoc.
|
|
343
|
+
*/
|
|
344
|
+
public void methodWithJavadoc() {
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
`;
|
|
348
|
+
|
|
349
|
+
const tools = await extractor.extract(code, 'Service.java');
|
|
350
|
+
|
|
351
|
+
// Should only have the method with Javadoc
|
|
352
|
+
expect(tools.every(t => t.name !== 'method_without_javadoc')).toBe(true);
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
it('should skip annotated endpoints in public method extraction', async () => {
|
|
356
|
+
const code = `
|
|
357
|
+
package com.example.controller;
|
|
358
|
+
|
|
359
|
+
import org.springframework.web.bind.annotation.*;
|
|
360
|
+
|
|
361
|
+
@RestController
|
|
362
|
+
public class Controller {
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Get all items.
|
|
366
|
+
*/
|
|
367
|
+
@GetMapping("/items")
|
|
368
|
+
public List<Item> getItems() {
|
|
369
|
+
return items;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
`;
|
|
373
|
+
|
|
374
|
+
const tools = await extractor.extract(code, 'Controller.java');
|
|
375
|
+
|
|
376
|
+
// Should not have duplicate tools for the same method
|
|
377
|
+
const itemTools = tools.filter(t => t.name.includes('items') || t.name === 'get_items');
|
|
378
|
+
expect(itemTools.length).toBeLessThanOrEqual(1);
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
describe('Type conversion', () => {
|
|
383
|
+
it('should convert Java types to JSON schema types', async () => {
|
|
384
|
+
const code = `
|
|
385
|
+
package com.example.service;
|
|
386
|
+
|
|
387
|
+
public class TypeService {
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Process various types.
|
|
391
|
+
*/
|
|
392
|
+
public void process(
|
|
393
|
+
String name,
|
|
394
|
+
int count,
|
|
395
|
+
Integer nullableCount,
|
|
396
|
+
boolean enabled,
|
|
397
|
+
List<String> items,
|
|
398
|
+
Map<String, Object> config
|
|
399
|
+
) {
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
`;
|
|
403
|
+
|
|
404
|
+
const tools = await extractor.extract(code, 'TypeService.java');
|
|
405
|
+
|
|
406
|
+
const tool = tools.find(t => t.name === 'process');
|
|
407
|
+
if (tool) {
|
|
408
|
+
expect(tool.inputSchema.properties.name?.type).toBe('string');
|
|
409
|
+
expect(tool.inputSchema.properties.count?.type).toBe('integer');
|
|
410
|
+
expect(tool.inputSchema.properties.enabled?.type).toBe('boolean');
|
|
411
|
+
expect(tool.inputSchema.properties.items?.type).toBe('array');
|
|
412
|
+
expect(tool.inputSchema.properties.config?.type).toBe('object');
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
it('should handle generic types', async () => {
|
|
417
|
+
const code = `
|
|
418
|
+
package com.example.service;
|
|
419
|
+
|
|
420
|
+
public class GenericService {
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Get optional value.
|
|
424
|
+
*/
|
|
425
|
+
public void processOptional(Optional<String> value) {
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
`;
|
|
429
|
+
|
|
430
|
+
const tools = await extractor.extract(code, 'GenericService.java');
|
|
431
|
+
|
|
432
|
+
const tool = tools.find(t => t.name.includes('optional') || t.name === 'process_optional');
|
|
433
|
+
if (tool) {
|
|
434
|
+
// Optional<String> should be converted to string
|
|
435
|
+
expect(tool.inputSchema.properties.value?.type).toBe('string');
|
|
436
|
+
}
|
|
437
|
+
});
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
describe('Path parameter extraction', () => {
|
|
441
|
+
it('should extract path parameters from Spring', async () => {
|
|
442
|
+
const code = `
|
|
443
|
+
package com.example.controller;
|
|
444
|
+
|
|
445
|
+
import org.springframework.web.bind.annotation.*;
|
|
446
|
+
|
|
447
|
+
@RestController
|
|
448
|
+
public class Controller {
|
|
449
|
+
|
|
450
|
+
@GetMapping("/users/{userId}/posts/{postId}")
|
|
451
|
+
public Post getPost(
|
|
452
|
+
@PathVariable String userId,
|
|
453
|
+
@PathVariable String postId
|
|
454
|
+
) {
|
|
455
|
+
return null;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
`;
|
|
459
|
+
|
|
460
|
+
const tools = await extractor.extract(code, 'Controller.java');
|
|
461
|
+
|
|
462
|
+
const tool = tools[0];
|
|
463
|
+
expect(tool?.inputSchema.properties).toHaveProperty('userId');
|
|
464
|
+
expect(tool?.inputSchema.properties).toHaveProperty('postId');
|
|
465
|
+
expect(tool?.inputSchema.required).toContain('userId');
|
|
466
|
+
expect(tool?.inputSchema.required).toContain('postId');
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
it('should extract path parameters from JAX-RS', async () => {
|
|
470
|
+
const code = `
|
|
471
|
+
package com.example.resource;
|
|
472
|
+
|
|
473
|
+
import javax.ws.rs.*;
|
|
474
|
+
|
|
475
|
+
@Path("/orders/{orderId}")
|
|
476
|
+
public class OrderResource {
|
|
477
|
+
|
|
478
|
+
@GET
|
|
479
|
+
@Path("/items/{itemId}")
|
|
480
|
+
public Item getItem(
|
|
481
|
+
@PathParam("orderId") String orderId,
|
|
482
|
+
@PathParam("itemId") String itemId
|
|
483
|
+
) {
|
|
484
|
+
return null;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
`;
|
|
488
|
+
|
|
489
|
+
const tools = await extractor.extract(code, 'OrderResource.java');
|
|
490
|
+
|
|
491
|
+
const tool = tools[0];
|
|
492
|
+
expect(tool?.inputSchema.properties).toHaveProperty('orderId');
|
|
493
|
+
expect(tool?.inputSchema.properties).toHaveProperty('itemId');
|
|
494
|
+
});
|
|
495
|
+
});
|
|
496
|
+
});
|
|
497
|
+
});
|