bluera-knowledge 0.9.21
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/.claude/commands/commit.md +37 -0
- package/.claude/hooks/post-edit-check.sh +41 -0
- package/.claude/settings.local.json.example +40 -0
- package/.claude/skills/atomic-commits/SKILL.md +53 -0
- package/.claude-plugin/plugin.json +13 -0
- package/.editorconfig +15 -0
- package/.github/workflows/auto-release.yml +59 -0
- package/.github/workflows/ci.yml +142 -0
- package/.github/workflows/release.yml +66 -0
- package/.github/workflows/update-marketplace.yml +96 -0
- package/.husky/pre-commit +47 -0
- package/.husky/pre-push +29 -0
- package/.versionrc.json +28 -0
- package/CHANGELOG.md +410 -0
- package/CLAUDE.md +109 -0
- package/LICENSE +21 -0
- package/NOTICE +47 -0
- package/README.md +1546 -0
- package/SECURITY.md +65 -0
- package/bun.lock +1758 -0
- package/commands/add-folder.md +48 -0
- package/commands/add-repo.md +50 -0
- package/commands/cancel.md +63 -0
- package/commands/check-status.md +78 -0
- package/commands/crawl.md +51 -0
- package/commands/index.md +48 -0
- package/commands/remove-store.md +52 -0
- package/commands/search.md +79 -0
- package/commands/search.sh +63 -0
- package/commands/stores.md +54 -0
- package/commands/suggest.md +82 -0
- package/dist/chunk-5QMHZUC4.js +3617 -0
- package/dist/chunk-5QMHZUC4.js.map +1 -0
- package/dist/chunk-BICFAWMN.js +656 -0
- package/dist/chunk-BICFAWMN.js.map +1 -0
- package/dist/chunk-J7J6LXOJ.js +958 -0
- package/dist/chunk-J7J6LXOJ.js.map +1 -0
- package/dist/chunk-L2YVNC63.js +59 -0
- package/dist/chunk-L2YVNC63.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1429 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +15 -0
- package/dist/mcp/server.js +11 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/watch.service-YAIKKDCF.js +7 -0
- package/dist/watch.service-YAIKKDCF.js.map +1 -0
- package/dist/workers/background-worker-cli.d.ts +1 -0
- package/dist/workers/background-worker-cli.js +310 -0
- package/dist/workers/background-worker-cli.js.map +1 -0
- package/docs/plans/2024-12-17-ai-search-quality-implementation.md +752 -0
- package/docs/plans/2024-12-17-ai-search-quality-testing-design.md +201 -0
- package/docs/plans/2025-12-16-bluera-knowledge-cli.md +2951 -0
- package/docs/plans/2025-12-16-phase2-features.md +1518 -0
- package/docs/plans/2025-12-17-hil-implementation.md +926 -0
- package/docs/plans/2025-12-17-hil-quality-testing.md +224 -0
- package/docs/plans/2025-12-17-search-quality-phase1-implementation.md +1416 -0
- package/docs/plans/2025-12-17-search-quality-testing-v2-design.md +212 -0
- package/docs/plans/2025-12-28-ai-agent-optimization.md +1630 -0
- package/eslint-rules/require-skip-comment.js +81 -0
- package/eslint.config.js +61 -0
- package/hooks/check-dependencies.sh +110 -0
- package/hooks/format-search-results.py +132 -0
- package/hooks/hooks.json +27 -0
- package/hooks/job-status-hook.sh +51 -0
- package/knip.json +43 -0
- package/mcp.plugin.json +12 -0
- package/package.json +103 -0
- package/python/crawl_worker.py +275 -0
- package/python/requirements.txt +2 -0
- package/scripts/readme-version-updater.cjs +18 -0
- package/skills/advanced-workflows/SKILL.md +273 -0
- package/skills/atomic-commits/SKILL.md +77 -0
- package/skills/knowledge-search/SKILL.md +54 -0
- package/skills/search-optimization/SKILL.md +396 -0
- package/skills/store-lifecycle/SKILL.md +470 -0
- package/skills/when-to-query/SKILL.md +66 -0
- package/src/analysis/ast-parser.test.ts +423 -0
- package/src/analysis/ast-parser.ts +192 -0
- package/src/analysis/code-graph.test.ts +698 -0
- package/src/analysis/code-graph.ts +245 -0
- package/src/analysis/dependency-usage-analyzer.test.ts +799 -0
- package/src/analysis/dependency-usage-analyzer.ts +405 -0
- package/src/analysis/go-ast-parser.test.ts +531 -0
- package/src/analysis/go-ast-parser.ts +478 -0
- package/src/analysis/parser-factory.test.ts +132 -0
- package/src/analysis/parser-factory.ts +44 -0
- package/src/analysis/python-ast-parser.test.ts +210 -0
- package/src/analysis/python-ast-parser.ts +34 -0
- package/src/analysis/repo-url-resolver.test.ts +533 -0
- package/src/analysis/repo-url-resolver.ts +233 -0
- package/src/analysis/rust-ast-parser.test.ts +568 -0
- package/src/analysis/rust-ast-parser.ts +477 -0
- package/src/analysis/tree-sitter-parser.test.ts +297 -0
- package/src/analysis/tree-sitter-parser.ts +223 -0
- package/src/cli/commands/crawl.test.ts +942 -0
- package/src/cli/commands/crawl.ts +141 -0
- package/src/cli/commands/index-cmd.test.ts +722 -0
- package/src/cli/commands/index-cmd.ts +105 -0
- package/src/cli/commands/mcp.test.ts +218 -0
- package/src/cli/commands/mcp.ts +18 -0
- package/src/cli/commands/plugin-api.test.ts +313 -0
- package/src/cli/commands/plugin-api.ts +45 -0
- package/src/cli/commands/search.test.ts +911 -0
- package/src/cli/commands/search.ts +113 -0
- package/src/cli/commands/serve.test.ts +329 -0
- package/src/cli/commands/serve.ts +28 -0
- package/src/cli/commands/setup.test.ts +820 -0
- package/src/cli/commands/setup.ts +153 -0
- package/src/cli/commands/store.test.ts +1003 -0
- package/src/cli/commands/store.ts +167 -0
- package/src/cli/index.ts +7 -0
- package/src/cli/program.ts +59 -0
- package/src/crawl/article-converter.test.ts +604 -0
- package/src/crawl/article-converter.ts +98 -0
- package/src/crawl/bridge.test.ts +674 -0
- package/src/crawl/bridge.ts +236 -0
- package/src/crawl/claude-client.test.ts +663 -0
- package/src/crawl/claude-client.ts +234 -0
- package/src/crawl/intelligent-crawler.test.ts +931 -0
- package/src/crawl/intelligent-crawler.ts +428 -0
- package/src/crawl/markdown-utils.test.ts +703 -0
- package/src/crawl/markdown-utils.ts +228 -0
- package/src/crawl/schemas.ts +114 -0
- package/src/db/embeddings.test.ts +63 -0
- package/src/db/embeddings.ts +69 -0
- package/src/db/index.ts +2 -0
- package/src/db/lance.test.ts +390 -0
- package/src/db/lance.ts +164 -0
- package/src/defaults/repos.ts +67 -0
- package/src/index.ts +107 -0
- package/src/mcp/cache.test.ts +202 -0
- package/src/mcp/cache.ts +103 -0
- package/src/mcp/commands/index.ts +20 -0
- package/src/mcp/commands/job.commands.ts +54 -0
- package/src/mcp/commands/meta.commands.ts +54 -0
- package/src/mcp/commands/registry.ts +183 -0
- package/src/mcp/commands/store.commands.ts +75 -0
- package/src/mcp/handlers/execute.handler.test.ts +179 -0
- package/src/mcp/handlers/execute.handler.ts +24 -0
- package/src/mcp/handlers/index.ts +43 -0
- package/src/mcp/handlers/job.handler.test.ts +189 -0
- package/src/mcp/handlers/job.handler.ts +116 -0
- package/src/mcp/handlers/search.handler.test.ts +334 -0
- package/src/mcp/handlers/search.handler.ts +209 -0
- package/src/mcp/handlers/store.handler.test.ts +415 -0
- package/src/mcp/handlers/store.handler.ts +295 -0
- package/src/mcp/schemas/index.test.ts +315 -0
- package/src/mcp/schemas/index.ts +138 -0
- package/src/mcp/server.test.ts +36 -0
- package/src/mcp/server.ts +162 -0
- package/src/mcp/types.ts +41 -0
- package/src/plugin/commands.test.ts +789 -0
- package/src/plugin/commands.ts +257 -0
- package/src/plugin/dependency-analyzer.test.ts +380 -0
- package/src/plugin/dependency-analyzer.ts +147 -0
- package/src/plugin/git-clone.test.ts +332 -0
- package/src/plugin/git-clone.ts +57 -0
- package/src/server/app.test.ts +752 -0
- package/src/server/app.ts +119 -0
- package/src/server/index.test.ts +477 -0
- package/src/server/index.ts +1 -0
- package/src/services/chunking.service.test.ts +363 -0
- package/src/services/chunking.service.ts +350 -0
- package/src/services/code-graph.service.test.ts +304 -0
- package/src/services/code-graph.service.ts +302 -0
- package/src/services/code-unit.service.test.ts +596 -0
- package/src/services/code-unit.service.ts +115 -0
- package/src/services/config.service.test.ts +127 -0
- package/src/services/config.service.ts +69 -0
- package/src/services/index.service.test.ts +1002 -0
- package/src/services/index.service.ts +266 -0
- package/src/services/index.ts +75 -0
- package/src/services/job.service.test.ts +418 -0
- package/src/services/job.service.ts +246 -0
- package/src/services/project-root.service.test.ts +506 -0
- package/src/services/project-root.service.ts +112 -0
- package/src/services/search.service.test.ts +1105 -0
- package/src/services/search.service.ts +892 -0
- package/src/services/services.test.ts +38 -0
- package/src/services/snippet.service.test.ts +205 -0
- package/src/services/snippet.service.ts +166 -0
- package/src/services/store.service.test.ts +474 -0
- package/src/services/store.service.ts +225 -0
- package/src/services/watch.service.test.ts +553 -0
- package/src/services/watch.service.ts +71 -0
- package/src/types/brands.test.ts +45 -0
- package/src/types/brands.ts +32 -0
- package/src/types/config.ts +79 -0
- package/src/types/document.ts +30 -0
- package/src/types/index.ts +66 -0
- package/src/types/job.ts +46 -0
- package/src/types/progress.ts +9 -0
- package/src/types/result.test.ts +44 -0
- package/src/types/result.ts +41 -0
- package/src/types/search.ts +95 -0
- package/src/types/store.test.ts +69 -0
- package/src/types/store.ts +47 -0
- package/src/utils/type-guards.test.ts +346 -0
- package/src/utils/type-guards.ts +61 -0
- package/src/workers/background-worker-cli.ts +105 -0
- package/src/workers/background-worker.test.ts +178 -0
- package/src/workers/background-worker.ts +294 -0
- package/src/workers/spawn-worker.test.ts +128 -0
- package/src/workers/spawn-worker.ts +49 -0
- package/tests/analysis/ast-parser.test.ts +98 -0
- package/tests/analysis/code-graph.test.ts +60 -0
- package/tests/fixtures/README.md +114 -0
- package/tests/fixtures/code-snippets/api/error-handling.ts +267 -0
- package/tests/fixtures/code-snippets/api/rest-controller.ts +303 -0
- package/tests/fixtures/code-snippets/auth/jwt-auth.ts +213 -0
- package/tests/fixtures/code-snippets/auth/oauth-flow.ts +245 -0
- package/tests/fixtures/code-snippets/database/repository-pattern.ts +272 -0
- package/tests/fixtures/corpus/VERSION.md +25 -0
- package/tests/fixtures/corpus/articles/jwt-authentication.md +97 -0
- package/tests/fixtures/corpus/articles/react-hooks-patterns.md +127 -0
- package/tests/fixtures/corpus/articles/typescript-generics.md +111 -0
- package/tests/fixtures/corpus/documentation/express-middleware.md +71 -0
- package/tests/fixtures/corpus/documentation/express-routing.md +83 -0
- package/tests/fixtures/corpus/documentation/node-streams.md +78 -0
- package/tests/fixtures/corpus/oss-repos/express/History.md +3871 -0
- package/tests/fixtures/corpus/oss-repos/express/LICENSE +24 -0
- package/tests/fixtures/corpus/oss-repos/express/Readme.md +276 -0
- package/tests/fixtures/corpus/oss-repos/express/SECURITY.md +56 -0
- package/tests/fixtures/corpus/oss-repos/express/benchmarks/Makefile +17 -0
- package/tests/fixtures/corpus/oss-repos/express/benchmarks/README.md +34 -0
- package/tests/fixtures/corpus/oss-repos/express/benchmarks/middleware.js +20 -0
- package/tests/fixtures/corpus/oss-repos/express/benchmarks/run +18 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/README.md +29 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/auth/index.js +134 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/auth/views/foot.ejs +2 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/auth/views/head.ejs +20 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/auth/views/login.ejs +21 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/content-negotiation/db.js +9 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/content-negotiation/index.js +46 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/content-negotiation/users.js +19 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/cookie-sessions/index.js +25 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/cookies/index.js +53 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/downloads/files/CCTV/345/244/247/350/265/233/344/270/212/346/265/267/345/210/206/350/265/233/345/214/272.txt +2 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/downloads/files/amazing.txt +1 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/downloads/files/notes/groceries.txt +3 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/downloads/index.js +40 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/ejs/index.js +57 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/ejs/public/stylesheets/style.css +4 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/ejs/views/footer.html +2 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/ejs/views/header.html +9 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/ejs/views/users.html +10 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/error/index.js +53 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/error-pages/index.js +103 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/error-pages/views/404.ejs +3 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/error-pages/views/500.ejs +8 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/error-pages/views/error_header.ejs +10 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/error-pages/views/footer.ejs +2 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/error-pages/views/index.ejs +20 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/hello-world/index.js +15 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/markdown/index.js +44 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/markdown/views/index.md +4 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/multi-router/controllers/api_v1.js +15 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/multi-router/controllers/api_v2.js +15 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/multi-router/index.js +18 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/main/index.js +5 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/pet/index.js +31 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/pet/views/edit.ejs +17 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/pet/views/show.ejs +15 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/user/index.js +41 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/user/views/edit.hbs +27 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/user/views/list.hbs +18 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/user/views/show.hbs +31 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/user-pet/index.js +22 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/mvc/db.js +16 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/mvc/index.js +95 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/mvc/lib/boot.js +83 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/mvc/public/style.css +14 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/mvc/views/404.ejs +13 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/mvc/views/5xx.ejs +13 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/online/index.js +61 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/params/index.js +74 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/resource/index.js +95 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/route-map/index.js +75 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/route-middleware/index.js +90 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/index.js +55 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/post.js +13 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/public/style.css +24 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/site.js +5 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/user.js +47 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/views/footer.ejs +2 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/views/header.ejs +9 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/views/index.ejs +10 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/views/posts/index.ejs +12 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/views/users/edit.ejs +23 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/views/users/index.ejs +14 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/views/users/view.ejs +9 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/search/index.js +61 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/search/public/client.js +15 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/search/public/index.html +21 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/session/index.js +37 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/session/redis.js +39 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/static-files/index.js +43 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/static-files/public/css/style.css +3 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/static-files/public/hello.txt +1 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/static-files/public/js/app.js +1 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/vhost/index.js +53 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/view-constructor/github-view.js +53 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/view-constructor/index.js +48 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/view-locals/index.js +155 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/view-locals/user.js +36 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/view-locals/views/index.ejs +20 -0
- package/tests/fixtures/corpus/oss-repos/express/examples/web-service/index.js +117 -0
- package/tests/fixtures/corpus/oss-repos/express/index.js +11 -0
- package/tests/fixtures/corpus/oss-repos/express/lib/application.js +631 -0
- package/tests/fixtures/corpus/oss-repos/express/lib/express.js +81 -0
- package/tests/fixtures/corpus/oss-repos/express/lib/request.js +514 -0
- package/tests/fixtures/corpus/oss-repos/express/lib/response.js +1053 -0
- package/tests/fixtures/corpus/oss-repos/express/lib/utils.js +271 -0
- package/tests/fixtures/corpus/oss-repos/express/lib/view.js +205 -0
- package/tests/fixtures/corpus/oss-repos/express/package.json +99 -0
- package/tests/fixtures/corpus/oss-repos/express/test/Route.js +274 -0
- package/tests/fixtures/corpus/oss-repos/express/test/Router.js +636 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/auth.js +117 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/content-negotiation.js +49 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/cookie-sessions.js +38 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/cookies.js +71 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/downloads.js +47 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/ejs.js +17 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/error-pages.js +99 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/error.js +29 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/hello-world.js +21 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/markdown.js +21 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/multi-router.js +44 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/mvc.js +132 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/params.js +44 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/resource.js +68 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/route-map.js +45 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/route-separation.js +97 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/vhost.js +46 -0
- package/tests/fixtures/corpus/oss-repos/express/test/acceptance/web-service.js +105 -0
- package/tests/fixtures/corpus/oss-repos/express/test/app.all.js +38 -0
- package/tests/fixtures/corpus/oss-repos/express/test/app.engine.js +83 -0
- package/tests/fixtures/corpus/oss-repos/express/test/app.head.js +66 -0
- package/tests/fixtures/corpus/oss-repos/express/test/app.js +120 -0
- package/tests/fixtures/corpus/oss-repos/express/test/app.listen.js +55 -0
- package/tests/fixtures/corpus/oss-repos/express/test/app.locals.js +26 -0
- package/tests/fixtures/corpus/oss-repos/express/test/app.options.js +116 -0
- package/tests/fixtures/corpus/oss-repos/express/test/app.param.js +323 -0
- package/tests/fixtures/corpus/oss-repos/express/test/app.render.js +374 -0
- package/tests/fixtures/corpus/oss-repos/express/test/app.request.js +143 -0
- package/tests/fixtures/corpus/oss-repos/express/test/app.response.js +143 -0
- package/tests/fixtures/corpus/oss-repos/express/test/app.route.js +197 -0
- package/tests/fixtures/corpus/oss-repos/express/test/app.router.js +1217 -0
- package/tests/fixtures/corpus/oss-repos/express/test/app.routes.error.js +62 -0
- package/tests/fixtures/corpus/oss-repos/express/test/app.use.js +542 -0
- package/tests/fixtures/corpus/oss-repos/express/test/config.js +207 -0
- package/tests/fixtures/corpus/oss-repos/express/test/exports.js +82 -0
- package/tests/fixtures/corpus/oss-repos/express/test/express.json.js +755 -0
- package/tests/fixtures/corpus/oss-repos/express/test/express.raw.js +513 -0
- package/tests/fixtures/corpus/oss-repos/express/test/express.static.js +815 -0
- package/tests/fixtures/corpus/oss-repos/express/test/express.text.js +566 -0
- package/tests/fixtures/corpus/oss-repos/express/test/express.urlencoded.js +828 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/% of dogs.txt +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/.name +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/blog/index.html +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/blog/post/index.tmpl +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/broken.send +0 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/default_layout/name.tmpl +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/default_layout/user.tmpl +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/email.tmpl +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/empty.txt +0 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/local_layout/user.tmpl +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/name.tmpl +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/name.txt +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/nums.txt +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/pets/names.txt +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/snow /342/230/203/.gitkeep +0 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/todo.html +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/todo.txt +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/user.html +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/user.tmpl +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/users/index.html +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/fixtures/users/tobi.txt +1 -0
- package/tests/fixtures/corpus/oss-repos/express/test/middleware.basic.js +42 -0
- package/tests/fixtures/corpus/oss-repos/express/test/regression.js +20 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.accepts.js +125 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.acceptsCharsets.js +50 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.acceptsEncodings.js +39 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.acceptsLanguages.js +57 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.baseUrl.js +88 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.fresh.js +70 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.get.js +60 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.host.js +156 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.hostname.js +188 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.ip.js +113 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.ips.js +71 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.is.js +169 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.path.js +20 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.protocol.js +113 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.query.js +106 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.range.js +104 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.route.js +28 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.secure.js +101 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.signedCookies.js +37 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.stale.js +50 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.subdomains.js +173 -0
- package/tests/fixtures/corpus/oss-repos/express/test/req.xhr.js +42 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.append.js +116 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.attachment.js +79 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.clearCookie.js +62 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.cookie.js +295 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.download.js +487 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.format.js +248 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.get.js +21 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.json.js +186 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.jsonp.js +344 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.links.js +65 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.locals.js +40 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.location.js +316 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.redirect.js +214 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.render.js +367 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.send.js +569 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.sendFile.js +913 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.sendStatus.js +44 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.set.js +124 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.status.js +206 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.type.js +46 -0
- package/tests/fixtures/corpus/oss-repos/express/test/res.vary.js +90 -0
- package/tests/fixtures/corpus/oss-repos/express/test/support/env.js +3 -0
- package/tests/fixtures/corpus/oss-repos/express/test/support/tmpl.js +36 -0
- package/tests/fixtures/corpus/oss-repos/express/test/support/utils.js +86 -0
- package/tests/fixtures/corpus/oss-repos/express/test/utils.js +83 -0
- package/tests/fixtures/corpus/oss-repos/hono/.devcontainer/Dockerfile +11 -0
- package/tests/fixtures/corpus/oss-repos/hono/.devcontainer/devcontainer.json +21 -0
- package/tests/fixtures/corpus/oss-repos/hono/.devcontainer/docker-compose.yml +18 -0
- package/tests/fixtures/corpus/oss-repos/hono/.eslintignore +1 -0
- package/tests/fixtures/corpus/oss-repos/hono/.eslintrc.cjs +9 -0
- package/tests/fixtures/corpus/oss-repos/hono/.gitpod.yml +9 -0
- package/tests/fixtures/corpus/oss-repos/hono/.prettierrc +9 -0
- package/tests/fixtures/corpus/oss-repos/hono/.vitest.config/jsx-runtime-default.ts +15 -0
- package/tests/fixtures/corpus/oss-repos/hono/.vitest.config/jsx-runtime-dom.ts +15 -0
- package/tests/fixtures/corpus/oss-repos/hono/.vitest.config/setup-vitest.ts +47 -0
- package/tests/fixtures/corpus/oss-repos/hono/LICENSE +21 -0
- package/tests/fixtures/corpus/oss-repos/hono/README.md +91 -0
- package/tests/fixtures/corpus/oss-repos/hono/build.ts +80 -0
- package/tests/fixtures/corpus/oss-repos/hono/bun.lockb +0 -0
- package/tests/fixtures/corpus/oss-repos/hono/bunfig.toml +7 -0
- package/tests/fixtures/corpus/oss-repos/hono/codecov.yml +13 -0
- package/tests/fixtures/corpus/oss-repos/hono/docs/CODE_OF_CONDUCT.md +128 -0
- package/tests/fixtures/corpus/oss-repos/hono/docs/CONTRIBUTING.md +62 -0
- package/tests/fixtures/corpus/oss-repos/hono/docs/MIGRATION.md +295 -0
- package/tests/fixtures/corpus/oss-repos/hono/docs/images/hono-logo.png +0 -0
- package/tests/fixtures/corpus/oss-repos/hono/docs/images/hono-logo.pxm +0 -0
- package/tests/fixtures/corpus/oss-repos/hono/docs/images/hono-logo.svg +6 -0
- package/tests/fixtures/corpus/oss-repos/hono/docs/images/hono-title.png +0 -0
- package/tests/fixtures/corpus/oss-repos/hono/docs/images/hono-title.pxm +0 -0
- package/tests/fixtures/corpus/oss-repos/hono/jsr.json +119 -0
- package/tests/fixtures/corpus/oss-repos/hono/package.cjs.json +3 -0
- package/tests/fixtures/corpus/oss-repos/hono/package.json +650 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/aws-lambda/handler.ts +492 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/aws-lambda/index.ts +13 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/aws-lambda/types.ts +144 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/bun/conninfo.ts +28 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/bun/index.ts +9 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/bun/serve-static.ts +35 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/bun/server.ts +30 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/bun/ssg.ts +27 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/bun/websocket.ts +110 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-pages/handler.ts +120 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-pages/index.ts +7 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-workers/conninfo.ts +7 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-workers/index.ts +8 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-workers/serve-static-module.ts +12 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-workers/serve-static.ts +39 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-workers/utils.ts +50 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-workers/websocket.ts +50 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/deno/conninfo.ts +17 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/deno/deno.d.ts +28 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/deno/index.ts +9 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/deno/serve-static.ts +40 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/deno/ssg.ts +27 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/deno/websocket.ts +51 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/lambda-edge/conninfo.ts +15 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/lambda-edge/handler.ts +189 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/lambda-edge/index.ts +14 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/netlify/handler.ts +10 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/netlify/index.ts +6 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/netlify/mod.ts +1 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/service-worker/handler.ts +34 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/service-worker/index.ts +5 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/service-worker/types.ts +14 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/vercel/conninfo.ts +8 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/vercel/handler.ts +9 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/adapter/vercel/index.ts +7 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/client/client.ts +214 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/client/index.ts +14 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/client/types.ts +180 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/client/utils.ts +54 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/compose.ts +94 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/context.ts +914 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/accepts/accepts.ts +81 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/accepts/index.ts +6 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/adapter/index.ts +85 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/conninfo/index.ts +6 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/conninfo/types.ts +45 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/cookie/index.ts +130 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/css/common.ts +243 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/css/index.ts +220 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/dev/index.ts +79 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/factory/index.ts +246 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/html/index.ts +56 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/ssg/index.ts +13 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/ssg/middleware.ts +79 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/ssg/ssg.ts +388 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/ssg/utils.ts +71 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/streaming/index.ts +9 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/streaming/sse.ts +89 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/streaming/stream.ts +36 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/streaming/text.ts +15 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/testing/index.ts +26 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/helper/websocket/index.ts +57 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/hono-base.ts +523 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/hono.ts +34 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/http-exception.ts +78 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/index.ts +51 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/base.ts +419 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/children.ts +20 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/components.ts +195 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/constants.ts +5 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/context.ts +50 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/client.ts +89 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/components.ts +39 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/context.ts +52 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/css.ts +246 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/hooks/index.ts +91 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/index.ts +159 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/intrinsic-element/components.ts +398 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/jsx-dev-runtime.ts +22 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/jsx-runtime.ts +7 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/render.ts +772 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/server.ts +70 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/utils.ts +7 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/hooks/index.ts +426 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/index.ts +114 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/intrinsic-element/common.ts +11 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/intrinsic-element/components.ts +196 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/intrinsic-elements.ts +924 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/jsx-dev-runtime.ts +26 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/jsx-runtime.ts +18 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/streaming.ts +184 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/types.ts +41 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/jsx/utils.ts +36 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/basic-auth/index.ts +128 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/bearer-auth/index.ts +159 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/body-limit/index.ts +115 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/cache/index.ts +127 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/combine/index.ts +153 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/compress/index.ts +79 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/context-storage/index.ts +55 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/cors/index.ts +141 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/csrf/index.ts +90 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/etag/index.ts +88 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/ip-restriction/index.ts +178 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/jsx-renderer/index.ts +158 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/jwt/index.ts +8 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/jwt/jwt.ts +159 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/logger/index.ts +93 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/method-override/index.ts +146 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/powered-by/index.ts +13 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/pretty-json/index.ts +50 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/request-id/index.ts +8 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/request-id/request-id.ts +59 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/secure-headers/index.ts +8 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/secure-headers/permissions-policy.ts +86 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/secure-headers/secure-headers.ts +319 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/serve-static/index.ts +140 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/timeout/index.ts +58 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/timing/index.ts +7 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/timing/timing.ts +225 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/middleware/trailing-slash/index.ts +71 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/preset/quick.ts +24 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/preset/tiny.ts +20 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/request.ts +403 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/router/linear-router/index.ts +6 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/router/linear-router/router.ts +132 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/router/pattern-router/index.ts +6 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/router/pattern-router/router.ts +54 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/router/reg-exp-router/index.ts +6 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/router/reg-exp-router/node.ts +159 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/router/reg-exp-router/router.ts +274 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/router/reg-exp-router/trie.ts +74 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/router/smart-router/index.ts +6 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/router/smart-router/router.ts +69 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/router/trie-router/index.ts +6 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/router/trie-router/node.ts +205 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/router/trie-router/router.ts +28 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/router.ts +103 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/types.ts +2009 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/basic-auth.ts +26 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/body.ts +225 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/buffer.ts +65 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/color.ts +26 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/concurrent.ts +55 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/cookie.ts +230 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/crypto.ts +65 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/encode.ts +34 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/filepath.ts +56 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/handler.ts +15 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/html.ts +182 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/http-status.ts +69 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/ipaddr.ts +113 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/jwt/index.ts +7 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/jwt/jwa.ts +23 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/jwt/jws.ts +226 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/jwt/jwt.ts +114 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/jwt/types.ts +83 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/jwt/utf8.ts +7 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/mime.ts +142 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/stream.ts +96 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/types.ts +105 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/utils/url.ts +310 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/validator/index.ts +7 -0
- package/tests/fixtures/corpus/oss-repos/hono/src/validator/validator.ts +151 -0
- package/tests/fixtures/corpus/oss-repos/hono/tsconfig.build.json +23 -0
- package/tests/fixtures/corpus/oss-repos/hono/tsconfig.json +28 -0
- package/tests/fixtures/corpus/oss-repos/hono/vitest.config.ts +34 -0
- package/tests/fixtures/corpus/oss-repos/hono/yarn.lock +6232 -0
- package/tests/fixtures/documentation/api-reference.md +412 -0
- package/tests/fixtures/documentation/architecture.md +214 -0
- package/tests/fixtures/documentation/deployment-guide.md +420 -0
- package/tests/fixtures/github-readmes/express.md +133 -0
- package/tests/fixtures/github-readmes/nextjs.md +106 -0
- package/tests/fixtures/github-readmes/react.md +74 -0
- package/tests/fixtures/github-readmes/typescript.md +93 -0
- package/tests/fixtures/github-readmes/vite.md +79 -0
- package/tests/fixtures/queries/core.json +125 -0
- package/tests/fixtures/queries/extended.json +427 -0
- package/tests/fixtures/queries/generated/.gitkeep +0 -0
- package/tests/fixtures/test-server.ts +267 -0
- package/tests/helpers/performance-metrics.ts +387 -0
- package/tests/helpers/search-relevance.ts +381 -0
- package/tests/integration/cli-consistency.test.ts +299 -0
- package/tests/integration/cli.test.ts +69 -0
- package/tests/integration/e2e-workflow.test.ts +612 -0
- package/tests/integration/python-bridge.test.ts +183 -0
- package/tests/integration/search-quality.test.ts +718 -0
- package/tests/integration/stress.test.ts +326 -0
- package/tests/mcp/server.test.ts +15 -0
- package/tests/scripts/schemas/evaluation.json +44 -0
- package/tests/scripts/schemas/query-generation.json +21 -0
- package/tests/services/code-unit.service.test.ts +47 -0
- package/tests/services/search.progressive-context.test.ts +35 -0
- package/tsconfig.json +34 -0
- package/tsup.config.ts +15 -0
- package/turndown-plugin-gfm.d.ts +29 -0
- package/vitest.config.ts +79 -0
|
@@ -0,0 +1,718 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search Quality Integration Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests search result quality, relevance, and modes:
|
|
5
|
+
* - Semantic relevance validation
|
|
6
|
+
* - Search mode comparison (vector, FTS, hybrid)
|
|
7
|
+
* - Relevance scoring accuracy
|
|
8
|
+
* - Threshold filtering
|
|
9
|
+
* - Query variations
|
|
10
|
+
* - Edge cases
|
|
11
|
+
*
|
|
12
|
+
* REWRITTEN: Now uses SearchService API directly instead of CLI to avoid hanging issues.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
16
|
+
import { rm, mkdtemp, mkdir, writeFile } from 'node:fs/promises';
|
|
17
|
+
import { tmpdir } from 'node:os';
|
|
18
|
+
import { join } from 'node:path';
|
|
19
|
+
import {
|
|
20
|
+
assertHasMatch,
|
|
21
|
+
assertTopResultsMatch,
|
|
22
|
+
assertProperOrdering,
|
|
23
|
+
assertMinimumScores,
|
|
24
|
+
calculateRelevanceMetrics,
|
|
25
|
+
compareRelevance,
|
|
26
|
+
CommonKeywords,
|
|
27
|
+
type SearchResult as TestSearchResult,
|
|
28
|
+
} from '../helpers/search-relevance.js';
|
|
29
|
+
import { StoreService } from '../../src/services/store.service.js';
|
|
30
|
+
import { IndexService } from '../../src/services/index.service.js';
|
|
31
|
+
import { SearchService } from '../../src/services/search.service.js';
|
|
32
|
+
import { LanceStore } from '../../src/db/lance.js';
|
|
33
|
+
import { EmbeddingEngine } from '../../src/db/embeddings.js';
|
|
34
|
+
import type { SearchResult as APISearchResult } from '../../src/types/search.js';
|
|
35
|
+
import type { StoreId } from '../../src/types/brands.js';
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Adapter to convert API SearchResult[] to test helper format.
|
|
39
|
+
* API results don't have rank (position), so we add it based on array order.
|
|
40
|
+
*/
|
|
41
|
+
function adaptApiResults(apiResults: readonly APISearchResult[]): TestSearchResult[] {
|
|
42
|
+
return apiResults.map((result, index) => ({
|
|
43
|
+
rank: index + 1, // 1-based ranking
|
|
44
|
+
score: result.score,
|
|
45
|
+
source: result.metadata.path ?? result.metadata.url ?? 'unknown',
|
|
46
|
+
content: result.content,
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
describe('Search Quality Tests', () => {
|
|
51
|
+
let tempDir: string;
|
|
52
|
+
let fixturesDir: string;
|
|
53
|
+
let storeService: StoreService;
|
|
54
|
+
let indexService: IndexService;
|
|
55
|
+
let searchService: SearchService;
|
|
56
|
+
let lanceStore: LanceStore;
|
|
57
|
+
let embeddingEngine: EmbeddingEngine;
|
|
58
|
+
let storeId: StoreId;
|
|
59
|
+
|
|
60
|
+
beforeAll(async () => {
|
|
61
|
+
tempDir = await mkdtemp(join(tmpdir(), 'search-quality-test-'));
|
|
62
|
+
fixturesDir = join(tempDir, 'fixtures');
|
|
63
|
+
|
|
64
|
+
// Initialize services
|
|
65
|
+
const dataDir = tempDir;
|
|
66
|
+
lanceStore = new LanceStore(dataDir);
|
|
67
|
+
embeddingEngine = new EmbeddingEngine();
|
|
68
|
+
await embeddingEngine.initialize();
|
|
69
|
+
|
|
70
|
+
storeService = new StoreService(dataDir);
|
|
71
|
+
await storeService.initialize(); // Must initialize StoreService!
|
|
72
|
+
|
|
73
|
+
indexService = new IndexService(lanceStore, embeddingEngine);
|
|
74
|
+
searchService = new SearchService(lanceStore, embeddingEngine);
|
|
75
|
+
|
|
76
|
+
// Create minimal test fixtures directly (no complex fixture loader)
|
|
77
|
+
await mkdir(fixturesDir, { recursive: true });
|
|
78
|
+
|
|
79
|
+
// Minimal auth file with JWT authentication keywords
|
|
80
|
+
await writeFile(
|
|
81
|
+
join(fixturesDir, 'jwt-auth.ts'),
|
|
82
|
+
`/**
|
|
83
|
+
* JWT Authentication Module
|
|
84
|
+
* Handles user authentication with JWT tokens
|
|
85
|
+
*/
|
|
86
|
+
export interface JwtPayload {
|
|
87
|
+
userId: string;
|
|
88
|
+
email: string;
|
|
89
|
+
exp: number;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export class AuthService {
|
|
93
|
+
/**
|
|
94
|
+
* Authenticate user and generate JWT token
|
|
95
|
+
*/
|
|
96
|
+
async authenticate(username: string, password: string): Promise<string> {
|
|
97
|
+
// Verify credentials
|
|
98
|
+
const user = await this.verifyCredentials(username, password);
|
|
99
|
+
|
|
100
|
+
// Generate JWT access token
|
|
101
|
+
return this.generateToken(user);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private generateToken(user: User): string {
|
|
105
|
+
const payload: JwtPayload = {
|
|
106
|
+
userId: user.id,
|
|
107
|
+
email: user.email,
|
|
108
|
+
exp: Date.now() + 3600000,
|
|
109
|
+
};
|
|
110
|
+
return jwt.sign(payload, process.env.JWT_SECRET);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Verify JWT token and extract payload
|
|
115
|
+
*/
|
|
116
|
+
verifyAccessToken(token: string): JwtPayload {
|
|
117
|
+
return jwt.verify(token, process.env.JWT_SECRET);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
`
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
// Minimal OAuth file
|
|
124
|
+
await writeFile(
|
|
125
|
+
join(fixturesDir, 'oauth-flow.ts'),
|
|
126
|
+
`/**
|
|
127
|
+
* OAuth Flow Implementation
|
|
128
|
+
* Third party login with social providers
|
|
129
|
+
*/
|
|
130
|
+
export class OAuthProvider {
|
|
131
|
+
async authorizeUser(provider: string): Promise<string> {
|
|
132
|
+
// OAuth authorization flow
|
|
133
|
+
const authUrl = \`https://\${provider}.com/oauth/authorize\`;
|
|
134
|
+
return authUrl;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async handleCallback(code: string): Promise<User> {
|
|
138
|
+
// Exchange authorization code for access token
|
|
139
|
+
const token = await this.exchangeCode(code);
|
|
140
|
+
return this.getUserProfile(token);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
`
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
// Minimal API error handling file
|
|
147
|
+
await writeFile(
|
|
148
|
+
join(fixturesDir, 'error-handler.ts'),
|
|
149
|
+
`/**
|
|
150
|
+
* API Error Handling
|
|
151
|
+
* Manages exception responses and HTTP status codes
|
|
152
|
+
*/
|
|
153
|
+
export class ErrorHandler {
|
|
154
|
+
handleError(error: Error, req: Request, res: Response) {
|
|
155
|
+
// Error handling and exception management
|
|
156
|
+
if (error instanceof AuthError) {
|
|
157
|
+
return res.status(401).json({
|
|
158
|
+
status: 'error',
|
|
159
|
+
message: 'Unauthorized',
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (error instanceof ValidationError) {
|
|
164
|
+
return res.status(400).json({
|
|
165
|
+
status: 'error',
|
|
166
|
+
message: error.message,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// HTTP 403 forbidden
|
|
171
|
+
if (error instanceof ForbiddenError) {
|
|
172
|
+
return res.status(403).json({
|
|
173
|
+
status: 'error',
|
|
174
|
+
message: 'Forbidden',
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Catch all errors
|
|
179
|
+
return res.status(500).json({
|
|
180
|
+
status: 'error',
|
|
181
|
+
message: 'Internal Server Error',
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
`
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
// Minimal database file
|
|
189
|
+
await writeFile(
|
|
190
|
+
join(fixturesDir, 'database.ts'),
|
|
191
|
+
`/**
|
|
192
|
+
* Database Module
|
|
193
|
+
* Data persistence and storage operations
|
|
194
|
+
*/
|
|
195
|
+
export class DatabaseService {
|
|
196
|
+
/**
|
|
197
|
+
* Execute SQL query for data persistence
|
|
198
|
+
*/
|
|
199
|
+
async query(sql: string, params?: unknown[]): Promise<QueryResult> {
|
|
200
|
+
// Database query execution
|
|
201
|
+
const connection = await this.getConnection();
|
|
202
|
+
return connection.execute(sql, params);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Store data in database
|
|
207
|
+
*/
|
|
208
|
+
async save(table: string, data: Record<string, unknown>): Promise<void> {
|
|
209
|
+
// Data persistence layer
|
|
210
|
+
await this.query(\`INSERT INTO \${table} VALUES (?)\`, [data]);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
`
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
// Minimal middleware file
|
|
217
|
+
await writeFile(
|
|
218
|
+
join(fixturesDir, 'auth-middleware.ts'),
|
|
219
|
+
`/**
|
|
220
|
+
* Authentication Middleware
|
|
221
|
+
* Protects API endpoints from unauthorized access
|
|
222
|
+
*/
|
|
223
|
+
export function authMiddleware(req: Request, res: Response, next: Next) {
|
|
224
|
+
const token = req.headers.authorization?.replace('Bearer ', '');
|
|
225
|
+
|
|
226
|
+
if (!token) {
|
|
227
|
+
return res.status(401).json({ error: 'Unauthorized' });
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
try {
|
|
231
|
+
const payload = verifyAccessToken(token);
|
|
232
|
+
req.user = payload;
|
|
233
|
+
next();
|
|
234
|
+
} catch (error) {
|
|
235
|
+
return res.status(403).json({ error: 'Forbidden' });
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
`
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
// Create and index store using API
|
|
242
|
+
const storeResult = await storeService.create({
|
|
243
|
+
name: 'quality-store',
|
|
244
|
+
type: 'file',
|
|
245
|
+
path: fixturesDir,
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
if (!storeResult.success) {
|
|
249
|
+
throw storeResult.error;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const store = storeResult.data;
|
|
253
|
+
storeId = store.id;
|
|
254
|
+
|
|
255
|
+
// Initialize Lance table for this store
|
|
256
|
+
await lanceStore.initialize(storeId);
|
|
257
|
+
|
|
258
|
+
// Index the store (minimal fixtures should be very fast)
|
|
259
|
+
const indexResult = await indexService.indexStore(store);
|
|
260
|
+
|
|
261
|
+
if (!indexResult.success) {
|
|
262
|
+
throw indexResult.error;
|
|
263
|
+
}
|
|
264
|
+
}, 30000); // Reduced timeout - minimal fixtures should index in ~5-10 seconds
|
|
265
|
+
|
|
266
|
+
afterAll(async () => {
|
|
267
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
describe('Semantic Relevance', () => {
|
|
271
|
+
it('finds auth code when searching for "user authentication"', async () => {
|
|
272
|
+
const response = await searchService.search({
|
|
273
|
+
query: 'user authentication login',
|
|
274
|
+
stores: [storeId],
|
|
275
|
+
});
|
|
276
|
+
const results = adaptApiResults(response.results);
|
|
277
|
+
|
|
278
|
+
expect(results.length).toBeGreaterThan(0);
|
|
279
|
+
assertHasMatch(results, {
|
|
280
|
+
keywords: CommonKeywords.AUTHENTICATION,
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
it('finds JWT code when searching for "token generation"', async () => {
|
|
285
|
+
const response = await searchService.search({
|
|
286
|
+
query: 'token generation verification',
|
|
287
|
+
stores: [storeId],
|
|
288
|
+
});
|
|
289
|
+
const results = adaptApiResults(response.results);
|
|
290
|
+
|
|
291
|
+
expect(results.length).toBeGreaterThan(0);
|
|
292
|
+
assertHasMatch(results, {
|
|
293
|
+
keywords: ['token', 'jwt', 'generate', 'verify'],
|
|
294
|
+
sourceContains: 'jwt',
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
it('finds error handling when searching for "exception management"', async () => {
|
|
299
|
+
const response = await searchService.search({
|
|
300
|
+
query: 'exception management error responses',
|
|
301
|
+
stores: [storeId],
|
|
302
|
+
});
|
|
303
|
+
const results = adaptApiResults(response.results);
|
|
304
|
+
|
|
305
|
+
expect(results.length).toBeGreaterThan(0);
|
|
306
|
+
assertHasMatch(results, {
|
|
307
|
+
keywords: CommonKeywords.ERROR_HANDLING,
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
it('finds database code when searching for "data persistence"', async () => {
|
|
312
|
+
const response = await searchService.search({
|
|
313
|
+
query: 'data persistence storage',
|
|
314
|
+
stores: [storeId],
|
|
315
|
+
});
|
|
316
|
+
const results = adaptApiResults(response.results);
|
|
317
|
+
|
|
318
|
+
expect(results.length).toBeGreaterThan(0);
|
|
319
|
+
assertHasMatch(results, {
|
|
320
|
+
keywords: CommonKeywords.DATABASE,
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
it('finds OAuth when searching for "third party login"', async () => {
|
|
325
|
+
const response = await searchService.search({
|
|
326
|
+
query: 'third party login social auth',
|
|
327
|
+
stores: [storeId],
|
|
328
|
+
});
|
|
329
|
+
const results = adaptApiResults(response.results);
|
|
330
|
+
|
|
331
|
+
expect(results.length).toBeGreaterThan(0);
|
|
332
|
+
assertHasMatch(results, {
|
|
333
|
+
keywords: ['oauth', 'authorization', 'provider'],
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
describe('Search Mode Comparison', () => {
|
|
339
|
+
it('vector search finds semantically related content', async () => {
|
|
340
|
+
const response = await searchService.search({
|
|
341
|
+
query: 'authentication security',
|
|
342
|
+
mode: 'vector',
|
|
343
|
+
stores: [storeId],
|
|
344
|
+
});
|
|
345
|
+
const results = adaptApiResults(response.results);
|
|
346
|
+
|
|
347
|
+
expect(results.length).toBeGreaterThan(0);
|
|
348
|
+
// Vector search should find auth-related code
|
|
349
|
+
assertHasMatch(results, {
|
|
350
|
+
keywords: ['auth', 'token', 'jwt', 'login', 'password', 'credential'],
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
it('hybrid search finds keyword matches', async () => {
|
|
355
|
+
const response = await searchService.search({
|
|
356
|
+
query: 'token authentication',
|
|
357
|
+
mode: 'hybrid',
|
|
358
|
+
stores: [storeId],
|
|
359
|
+
});
|
|
360
|
+
const results = adaptApiResults(response.results);
|
|
361
|
+
|
|
362
|
+
expect(results.length).toBeGreaterThan(0);
|
|
363
|
+
// Hybrid should find token-related content
|
|
364
|
+
assertHasMatch(results, {
|
|
365
|
+
keywords: ['token', 'auth'],
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
it('hybrid search combines both approaches', async () => {
|
|
370
|
+
const response = await searchService.search({
|
|
371
|
+
query: 'JWT authentication middleware',
|
|
372
|
+
mode: 'hybrid',
|
|
373
|
+
stores: [storeId],
|
|
374
|
+
});
|
|
375
|
+
const results = adaptApiResults(response.results);
|
|
376
|
+
|
|
377
|
+
expect(results.length).toBeGreaterThan(0);
|
|
378
|
+
assertHasMatch(results, {
|
|
379
|
+
keywords: ['jwt', 'auth', 'middleware'],
|
|
380
|
+
});
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
it('hybrid finds content with common terms', async () => {
|
|
384
|
+
const response = await searchService.search({
|
|
385
|
+
query: 'error response status',
|
|
386
|
+
mode: 'hybrid',
|
|
387
|
+
stores: [storeId],
|
|
388
|
+
});
|
|
389
|
+
const results = adaptApiResults(response.results);
|
|
390
|
+
|
|
391
|
+
expect(results.length).toBeGreaterThan(0);
|
|
392
|
+
assertHasMatch(results, {
|
|
393
|
+
keywords: ['error', 'response', 'status'],
|
|
394
|
+
});
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
it('search finds auth content with natural language', async () => {
|
|
398
|
+
const response = await searchService.search({
|
|
399
|
+
query: 'how to protect API endpoints from unauthorized access',
|
|
400
|
+
stores: [storeId],
|
|
401
|
+
});
|
|
402
|
+
const results = adaptApiResults(response.results);
|
|
403
|
+
|
|
404
|
+
// Should find auth/api-related code
|
|
405
|
+
expect(results.length).toBeGreaterThan(0);
|
|
406
|
+
assertHasMatch(results, {
|
|
407
|
+
keywords: [...CommonKeywords.AUTHENTICATION, ...CommonKeywords.API, 'error', 'forbidden'],
|
|
408
|
+
});
|
|
409
|
+
});
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
describe('Relevance Scoring', () => {
|
|
413
|
+
it('results are ordered by score descending', async () => {
|
|
414
|
+
const response = await searchService.search({
|
|
415
|
+
query: 'authentication token',
|
|
416
|
+
stores: [storeId],
|
|
417
|
+
});
|
|
418
|
+
const results = adaptApiResults(response.results);
|
|
419
|
+
|
|
420
|
+
expect(results.length).toBeGreaterThan(1);
|
|
421
|
+
assertProperOrdering(results);
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
it('exact matches have higher scores', async () => {
|
|
425
|
+
const response = await searchService.search({
|
|
426
|
+
query: 'JWT Authentication Module',
|
|
427
|
+
stores: [storeId],
|
|
428
|
+
});
|
|
429
|
+
const results = adaptApiResults(response.results);
|
|
430
|
+
|
|
431
|
+
expect(results.length).toBeGreaterThan(0);
|
|
432
|
+
// The file containing exact match should rank high
|
|
433
|
+
assertHasMatch(results, {
|
|
434
|
+
keywords: ['jwt', 'authentication', 'module'],
|
|
435
|
+
maxRank: 3,
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
it('source file matches boost relevance', async () => {
|
|
440
|
+
const response = await searchService.search({
|
|
441
|
+
query: 'OAuth flow implementation',
|
|
442
|
+
stores: [storeId],
|
|
443
|
+
});
|
|
444
|
+
const results = adaptApiResults(response.results);
|
|
445
|
+
|
|
446
|
+
expect(results.length).toBeGreaterThan(0);
|
|
447
|
+
// oauth-flow.ts should be in top results
|
|
448
|
+
assertHasMatch(results, {
|
|
449
|
+
sourceContains: 'oauth',
|
|
450
|
+
maxRank: 3,
|
|
451
|
+
});
|
|
452
|
+
});
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
describe('Threshold Filtering', () => {
|
|
456
|
+
it('high threshold returns fewer results', async () => {
|
|
457
|
+
const lowResponse = await searchService.search({
|
|
458
|
+
query: 'authentication',
|
|
459
|
+
threshold: 0.3,
|
|
460
|
+
stores: [storeId],
|
|
461
|
+
});
|
|
462
|
+
const highResponse = await searchService.search({
|
|
463
|
+
query: 'authentication',
|
|
464
|
+
threshold: 0.7,
|
|
465
|
+
stores: [storeId],
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
const lowResults = adaptApiResults(lowResponse.results);
|
|
469
|
+
const highResults = adaptApiResults(highResponse.results);
|
|
470
|
+
|
|
471
|
+
// High threshold should return fewer or equal results
|
|
472
|
+
expect(highResults.length).toBeLessThanOrEqual(lowResults.length);
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
it('threshold 0.8 filters out low relevance matches', async () => {
|
|
476
|
+
const response = await searchService.search({
|
|
477
|
+
query: 'middleware',
|
|
478
|
+
threshold: 0.8,
|
|
479
|
+
stores: [storeId],
|
|
480
|
+
});
|
|
481
|
+
const results = adaptApiResults(response.results);
|
|
482
|
+
|
|
483
|
+
// All results should meet the threshold
|
|
484
|
+
if (results.length > 0) {
|
|
485
|
+
assertMinimumScores(results, 0.8);
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
|
|
489
|
+
it('lower threshold includes more results', async () => {
|
|
490
|
+
const response = await searchService.search({
|
|
491
|
+
query: 'error handling',
|
|
492
|
+
stores: [storeId],
|
|
493
|
+
});
|
|
494
|
+
const results = adaptApiResults(response.results);
|
|
495
|
+
|
|
496
|
+
// Should find error handling content
|
|
497
|
+
expect(results.length).toBeGreaterThan(0);
|
|
498
|
+
assertHasMatch(results, {
|
|
499
|
+
keywords: ['error', 'handling', 'exception', 'catch'],
|
|
500
|
+
});
|
|
501
|
+
});
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
describe('Query Variations', () => {
|
|
505
|
+
it('different phrasings find same authentication content', async () => {
|
|
506
|
+
const queries = [
|
|
507
|
+
'user login authentication',
|
|
508
|
+
'authenticate users securely',
|
|
509
|
+
'login system implementation',
|
|
510
|
+
'user auth flow',
|
|
511
|
+
];
|
|
512
|
+
|
|
513
|
+
for (const query of queries) {
|
|
514
|
+
const response = await searchService.search({
|
|
515
|
+
query,
|
|
516
|
+
stores: [storeId],
|
|
517
|
+
});
|
|
518
|
+
const results = adaptApiResults(response.results);
|
|
519
|
+
|
|
520
|
+
expect(results.length).toBeGreaterThan(0);
|
|
521
|
+
assertHasMatch(results, {
|
|
522
|
+
keywords: CommonKeywords.AUTHENTICATION,
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
|
|
527
|
+
it('singular and plural forms find same content', async () => {
|
|
528
|
+
const singularResponse = await searchService.search({
|
|
529
|
+
query: 'error handler',
|
|
530
|
+
stores: [storeId],
|
|
531
|
+
});
|
|
532
|
+
const pluralResponse = await searchService.search({
|
|
533
|
+
query: 'error handlers',
|
|
534
|
+
stores: [storeId],
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
const singularResults = adaptApiResults(singularResponse.results);
|
|
538
|
+
const pluralResults = adaptApiResults(pluralResponse.results);
|
|
539
|
+
|
|
540
|
+
// Both should find error handling content
|
|
541
|
+
expect(singularResults.length).toBeGreaterThan(0);
|
|
542
|
+
expect(pluralResults.length).toBeGreaterThan(0);
|
|
543
|
+
|
|
544
|
+
assertHasMatch(singularResults, { keywords: ['error'] });
|
|
545
|
+
assertHasMatch(pluralResults, { keywords: ['error'] });
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
it('abbreviations find full terms', async () => {
|
|
549
|
+
const response = await searchService.search({
|
|
550
|
+
query: 'auth middleware JWT',
|
|
551
|
+
stores: [storeId],
|
|
552
|
+
});
|
|
553
|
+
const results = adaptApiResults(response.results);
|
|
554
|
+
|
|
555
|
+
expect(results.length).toBeGreaterThan(0);
|
|
556
|
+
assertHasMatch(results, {
|
|
557
|
+
keywords: ['authentication', 'jwt', 'middleware'],
|
|
558
|
+
});
|
|
559
|
+
});
|
|
560
|
+
});
|
|
561
|
+
|
|
562
|
+
describe('Edge Cases', () => {
|
|
563
|
+
it('handles queries with no results gracefully', async () => {
|
|
564
|
+
// Use high threshold to filter out low-relevance semantic matches
|
|
565
|
+
const response = await searchService.search({
|
|
566
|
+
query: 'xyznonexistent123',
|
|
567
|
+
threshold: 0.9,
|
|
568
|
+
stores: [storeId],
|
|
569
|
+
});
|
|
570
|
+
const results = adaptApiResults(response.results);
|
|
571
|
+
|
|
572
|
+
// With high threshold, semantically unrelated queries should return no results
|
|
573
|
+
expect(results.length).toBe(0);
|
|
574
|
+
});
|
|
575
|
+
|
|
576
|
+
it('handles special characters in queries', async () => {
|
|
577
|
+
const response = await searchService.search({
|
|
578
|
+
query: 'async/await Promise<T>',
|
|
579
|
+
stores: [storeId],
|
|
580
|
+
});
|
|
581
|
+
const results = adaptApiResults(response.results);
|
|
582
|
+
|
|
583
|
+
// Should not throw and may find async-related content
|
|
584
|
+
expect(Array.isArray(results)).toBe(true);
|
|
585
|
+
});
|
|
586
|
+
|
|
587
|
+
it('handles very short queries', async () => {
|
|
588
|
+
const response = await searchService.search({
|
|
589
|
+
query: 'api',
|
|
590
|
+
stores: [storeId],
|
|
591
|
+
});
|
|
592
|
+
const results = adaptApiResults(response.results);
|
|
593
|
+
|
|
594
|
+
expect(results.length).toBeGreaterThan(0);
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
it('handles long queries', async () => {
|
|
598
|
+
const longQuery =
|
|
599
|
+
'how to implement secure user authentication with JWT tokens including ' +
|
|
600
|
+
'refresh token rotation and proper error handling for expired sessions';
|
|
601
|
+
|
|
602
|
+
const response = await searchService.search({
|
|
603
|
+
query: longQuery,
|
|
604
|
+
stores: [storeId],
|
|
605
|
+
});
|
|
606
|
+
const results = adaptApiResults(response.results);
|
|
607
|
+
|
|
608
|
+
expect(results.length).toBeGreaterThan(0);
|
|
609
|
+
assertHasMatch(results, {
|
|
610
|
+
keywords: ['jwt', 'token', 'auth'],
|
|
611
|
+
});
|
|
612
|
+
});
|
|
613
|
+
|
|
614
|
+
it('handles queries with numbers', async () => {
|
|
615
|
+
const response = await searchService.search({
|
|
616
|
+
query: 'HTTP 401 403 status codes',
|
|
617
|
+
stores: [storeId],
|
|
618
|
+
});
|
|
619
|
+
const results = adaptApiResults(response.results);
|
|
620
|
+
|
|
621
|
+
expect(results.length).toBeGreaterThan(0);
|
|
622
|
+
});
|
|
623
|
+
|
|
624
|
+
it('handles mixed case queries', async () => {
|
|
625
|
+
const response = await searchService.search({
|
|
626
|
+
query: 'JwtPayload AccessToken',
|
|
627
|
+
stores: [storeId],
|
|
628
|
+
});
|
|
629
|
+
const results = adaptApiResults(response.results);
|
|
630
|
+
|
|
631
|
+
expect(results.length).toBeGreaterThan(0);
|
|
632
|
+
assertHasMatch(results, {
|
|
633
|
+
keywords: ['jwt', 'payload', 'token'],
|
|
634
|
+
});
|
|
635
|
+
});
|
|
636
|
+
});
|
|
637
|
+
|
|
638
|
+
describe('Result Quality Metrics', () => {
|
|
639
|
+
it('calculates precision for authentication queries', async () => {
|
|
640
|
+
const response = await searchService.search({
|
|
641
|
+
query: 'user authentication',
|
|
642
|
+
limit: 10,
|
|
643
|
+
stores: [storeId],
|
|
644
|
+
});
|
|
645
|
+
const results = adaptApiResults(response.results);
|
|
646
|
+
|
|
647
|
+
const metrics = calculateRelevanceMetrics(results, {
|
|
648
|
+
keywords: CommonKeywords.AUTHENTICATION,
|
|
649
|
+
});
|
|
650
|
+
|
|
651
|
+
// At least 50% of results should be relevant to authentication
|
|
652
|
+
expect(metrics.precision).toBeGreaterThanOrEqual(0.5);
|
|
653
|
+
expect(metrics.topScore).toBeGreaterThan(0);
|
|
654
|
+
});
|
|
655
|
+
|
|
656
|
+
it('compares relevance between search modes', async () => {
|
|
657
|
+
const vectorResponse = await searchService.search({
|
|
658
|
+
query: 'authentication token',
|
|
659
|
+
mode: 'vector',
|
|
660
|
+
stores: [storeId],
|
|
661
|
+
});
|
|
662
|
+
const hybridResponse = await searchService.search({
|
|
663
|
+
query: 'authentication token',
|
|
664
|
+
mode: 'hybrid',
|
|
665
|
+
stores: [storeId],
|
|
666
|
+
});
|
|
667
|
+
|
|
668
|
+
const vectorResults = adaptApiResults(vectorResponse.results);
|
|
669
|
+
const hybridResults = adaptApiResults(hybridResponse.results);
|
|
670
|
+
|
|
671
|
+
// Both modes should return results
|
|
672
|
+
expect(vectorResults.length).toBeGreaterThan(0);
|
|
673
|
+
expect(hybridResults.length).toBeGreaterThan(0);
|
|
674
|
+
|
|
675
|
+
const comparison = compareRelevance(vectorResults, hybridResults, {
|
|
676
|
+
keywords: ['auth', 'token', 'jwt', 'login', 'session'],
|
|
677
|
+
});
|
|
678
|
+
|
|
679
|
+
// Both modes should produce some relevant results
|
|
680
|
+
expect(comparison.baselineMetrics.totalCount).toBeGreaterThan(0);
|
|
681
|
+
expect(comparison.comparisonMetrics.totalCount).toBeGreaterThan(0);
|
|
682
|
+
});
|
|
683
|
+
});
|
|
684
|
+
|
|
685
|
+
describe('Limit Parameter', () => {
|
|
686
|
+
it('respects result limit', async () => {
|
|
687
|
+
const response5 = await searchService.search({
|
|
688
|
+
query: 'function',
|
|
689
|
+
limit: 5,
|
|
690
|
+
stores: [storeId],
|
|
691
|
+
});
|
|
692
|
+
const response10 = await searchService.search({
|
|
693
|
+
query: 'function',
|
|
694
|
+
limit: 10,
|
|
695
|
+
stores: [storeId],
|
|
696
|
+
});
|
|
697
|
+
|
|
698
|
+
const results5 = adaptApiResults(response5.results);
|
|
699
|
+
const results10 = adaptApiResults(response10.results);
|
|
700
|
+
|
|
701
|
+
expect(results5.length).toBeLessThanOrEqual(5);
|
|
702
|
+
expect(results10.length).toBeLessThanOrEqual(10);
|
|
703
|
+
});
|
|
704
|
+
|
|
705
|
+
it('returns all results when limit exceeds matches', async () => {
|
|
706
|
+
const response = await searchService.search({
|
|
707
|
+
query: 'verifyAccessToken',
|
|
708
|
+
limit: 100,
|
|
709
|
+
stores: [storeId],
|
|
710
|
+
});
|
|
711
|
+
const results = adaptApiResults(response.results);
|
|
712
|
+
|
|
713
|
+
// Should return actual matches, not pad to limit
|
|
714
|
+
expect(results.length).toBeGreaterThan(0);
|
|
715
|
+
expect(results.length).toBeLessThan(100);
|
|
716
|
+
});
|
|
717
|
+
});
|
|
718
|
+
});
|