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,381 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search Relevance Utilities
|
|
3
|
+
*
|
|
4
|
+
* Helpers for validating search result quality and relevance.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Search result item (matches CLI output structure)
|
|
9
|
+
*/
|
|
10
|
+
export interface SearchResult {
|
|
11
|
+
/** Result ranking position (1-based) */
|
|
12
|
+
rank: number;
|
|
13
|
+
/** Relevance score (0-1) */
|
|
14
|
+
score: number;
|
|
15
|
+
/** Source file path */
|
|
16
|
+
source: string;
|
|
17
|
+
/** Content snippet */
|
|
18
|
+
content: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Expected match for relevance testing
|
|
23
|
+
*/
|
|
24
|
+
export interface ExpectedMatch {
|
|
25
|
+
/** Keywords that should appear in content (any of these) */
|
|
26
|
+
keywords?: string[];
|
|
27
|
+
/** All of these keywords must appear */
|
|
28
|
+
requiredKeywords?: string[];
|
|
29
|
+
/** Source file should contain this string */
|
|
30
|
+
sourceContains?: string;
|
|
31
|
+
/** Minimum acceptable score */
|
|
32
|
+
minScore?: number;
|
|
33
|
+
/** Maximum acceptable rank position */
|
|
34
|
+
maxRank?: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Parse CLI search output into structured results
|
|
39
|
+
*
|
|
40
|
+
* @param output - Raw CLI output from search command
|
|
41
|
+
* @returns Array of parsed search results
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* const output = cli('search "authentication"');
|
|
45
|
+
* const results = parseSearchOutput(output);
|
|
46
|
+
*/
|
|
47
|
+
export function parseSearchOutput(output: string): SearchResult[] {
|
|
48
|
+
const results: SearchResult[] = [];
|
|
49
|
+
const lines = output.split('\n');
|
|
50
|
+
|
|
51
|
+
let currentResult: Partial<SearchResult> | null = null;
|
|
52
|
+
let rank = 0;
|
|
53
|
+
let expectingLocation = false;
|
|
54
|
+
let locationSet = false;
|
|
55
|
+
|
|
56
|
+
for (const line of lines) {
|
|
57
|
+
// Match new format header: "1. [0.85] function: PROVIDERS"
|
|
58
|
+
// Or old format: "1. [0.85] path/to/file.ts"
|
|
59
|
+
const headerMatch = line.match(/^(\d+)\.\s+\[(-?[0-9.]+)\]\s+(.+)$/);
|
|
60
|
+
if (headerMatch) {
|
|
61
|
+
// Save previous result if it exists
|
|
62
|
+
if (currentResult) {
|
|
63
|
+
// If source is still empty, try to extract from content or use a placeholder
|
|
64
|
+
if (!currentResult.source) {
|
|
65
|
+
currentResult.source = 'unknown';
|
|
66
|
+
}
|
|
67
|
+
results.push(currentResult as SearchResult);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
rank++;
|
|
71
|
+
const headerContent = headerMatch[3].trim();
|
|
72
|
+
|
|
73
|
+
// Check if this is new format (contains type prefix like "function:", "class:", etc.)
|
|
74
|
+
const typeMatch = headerContent.match(/^(function|class|interface|type|const|documentation):\s+(.+)$/);
|
|
75
|
+
if (typeMatch) {
|
|
76
|
+
// New format - next line should contain the location
|
|
77
|
+
currentResult = {
|
|
78
|
+
rank,
|
|
79
|
+
score: parseFloat(headerMatch[2]),
|
|
80
|
+
source: '', // Will be filled from next line
|
|
81
|
+
content: '',
|
|
82
|
+
};
|
|
83
|
+
expectingLocation = true;
|
|
84
|
+
locationSet = false;
|
|
85
|
+
} else {
|
|
86
|
+
// Old format - source is directly in header
|
|
87
|
+
currentResult = {
|
|
88
|
+
rank,
|
|
89
|
+
score: parseFloat(headerMatch[2]),
|
|
90
|
+
source: headerContent,
|
|
91
|
+
content: '',
|
|
92
|
+
};
|
|
93
|
+
expectingLocation = false;
|
|
94
|
+
locationSet = true;
|
|
95
|
+
}
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Process indented lines
|
|
100
|
+
if (currentResult && line.startsWith(' ')) {
|
|
101
|
+
const trimmed = line.trim();
|
|
102
|
+
|
|
103
|
+
// If we're expecting location and haven't set it yet
|
|
104
|
+
if (expectingLocation && !locationSet) {
|
|
105
|
+
// First indented line after header is the location
|
|
106
|
+
// Extract just the file path, removing line numbers if present
|
|
107
|
+
const pathMatch = trimmed.match(/^([^:]+?)(?::\d+)?$/);
|
|
108
|
+
if (pathMatch) {
|
|
109
|
+
currentResult.source = pathMatch[1];
|
|
110
|
+
} else {
|
|
111
|
+
currentResult.source = trimmed;
|
|
112
|
+
}
|
|
113
|
+
locationSet = true;
|
|
114
|
+
expectingLocation = false;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Accumulate content lines (all other indented lines)
|
|
119
|
+
if (locationSet) {
|
|
120
|
+
currentResult.content += (currentResult.content ? '\n' : '') + trimmed;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Don't forget the last result
|
|
126
|
+
if (currentResult) {
|
|
127
|
+
if (!currentResult.source) {
|
|
128
|
+
currentResult.source = 'unknown';
|
|
129
|
+
}
|
|
130
|
+
results.push(currentResult as SearchResult);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return results;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Check if a result matches expected criteria
|
|
138
|
+
*
|
|
139
|
+
* @param result - Search result to check
|
|
140
|
+
* @param expected - Expected match criteria
|
|
141
|
+
* @returns true if result matches all criteria
|
|
142
|
+
*/
|
|
143
|
+
export function matchesExpectation(
|
|
144
|
+
result: SearchResult,
|
|
145
|
+
expected: ExpectedMatch
|
|
146
|
+
): boolean {
|
|
147
|
+
const contentLower = result.content.toLowerCase();
|
|
148
|
+
const sourceLower = result.source.toLowerCase();
|
|
149
|
+
|
|
150
|
+
// Check keywords (any match)
|
|
151
|
+
if (expected.keywords && expected.keywords.length > 0) {
|
|
152
|
+
const hasKeyword = expected.keywords.some((kw) =>
|
|
153
|
+
contentLower.includes(kw.toLowerCase())
|
|
154
|
+
);
|
|
155
|
+
if (!hasKeyword) return false;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Check required keywords (all must match)
|
|
159
|
+
if (expected.requiredKeywords && expected.requiredKeywords.length > 0) {
|
|
160
|
+
const hasAllRequired = expected.requiredKeywords.every((kw) =>
|
|
161
|
+
contentLower.includes(kw.toLowerCase())
|
|
162
|
+
);
|
|
163
|
+
if (!hasAllRequired) return false;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Check source path
|
|
167
|
+
if (expected.sourceContains) {
|
|
168
|
+
if (!sourceLower.includes(expected.sourceContains.toLowerCase())) {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Check minimum score
|
|
174
|
+
if (expected.minScore !== undefined && result.score < expected.minScore) {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Check maximum rank
|
|
179
|
+
if (expected.maxRank !== undefined && result.rank > expected.maxRank) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Assert that results contain at least one match for expected criteria
|
|
188
|
+
*
|
|
189
|
+
* @param results - Search results to check
|
|
190
|
+
* @param expected - Expected match criteria
|
|
191
|
+
* @returns The first matching result, or throws if none found
|
|
192
|
+
*/
|
|
193
|
+
export function assertHasMatch(
|
|
194
|
+
results: SearchResult[],
|
|
195
|
+
expected: ExpectedMatch
|
|
196
|
+
): SearchResult {
|
|
197
|
+
const match = results.find((r) => matchesExpectation(r, expected));
|
|
198
|
+
if (!match) {
|
|
199
|
+
const criteria = JSON.stringify(expected, null, 2);
|
|
200
|
+
const resultsSummary = results
|
|
201
|
+
.map((r) => ` ${r.rank}. [${r.score}] ${r.source}`)
|
|
202
|
+
.join('\n');
|
|
203
|
+
throw new Error(
|
|
204
|
+
`No result matches expected criteria:\n${criteria}\n\nResults:\n${resultsSummary}`
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
return match;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Assert that the top N results all match expected criteria
|
|
212
|
+
*
|
|
213
|
+
* @param results - Search results to check
|
|
214
|
+
* @param expected - Expected match criteria
|
|
215
|
+
* @param topN - Number of top results to check (default: 3)
|
|
216
|
+
*/
|
|
217
|
+
export function assertTopResultsMatch(
|
|
218
|
+
results: SearchResult[],
|
|
219
|
+
expected: ExpectedMatch,
|
|
220
|
+
topN = 3
|
|
221
|
+
): void {
|
|
222
|
+
const topResults = results.slice(0, topN);
|
|
223
|
+
|
|
224
|
+
for (const result of topResults) {
|
|
225
|
+
if (!matchesExpectation(result, expected)) {
|
|
226
|
+
throw new Error(
|
|
227
|
+
`Top ${topN} result at rank ${result.rank} does not match expected criteria:\n` +
|
|
228
|
+
`Expected: ${JSON.stringify(expected)}\n` +
|
|
229
|
+
`Got: ${result.source} - "${result.content.slice(0, 100)}..."`
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Calculate relevance metrics for a set of results
|
|
237
|
+
*
|
|
238
|
+
* @param results - Search results
|
|
239
|
+
* @param expected - Expected match criteria for "relevant" results
|
|
240
|
+
* @returns Relevance metrics
|
|
241
|
+
*/
|
|
242
|
+
export function calculateRelevanceMetrics(
|
|
243
|
+
results: SearchResult[],
|
|
244
|
+
expected: ExpectedMatch
|
|
245
|
+
): {
|
|
246
|
+
precision: number;
|
|
247
|
+
relevantCount: number;
|
|
248
|
+
totalCount: number;
|
|
249
|
+
averageScore: number;
|
|
250
|
+
topScore: number;
|
|
251
|
+
} {
|
|
252
|
+
const relevant = results.filter((r) => matchesExpectation(r, expected));
|
|
253
|
+
|
|
254
|
+
return {
|
|
255
|
+
precision: results.length > 0 ? relevant.length / results.length : 0,
|
|
256
|
+
relevantCount: relevant.length,
|
|
257
|
+
totalCount: results.length,
|
|
258
|
+
averageScore:
|
|
259
|
+
results.length > 0
|
|
260
|
+
? results.reduce((sum, r) => sum + r.score, 0) / results.length
|
|
261
|
+
: 0,
|
|
262
|
+
topScore: results.length > 0 ? results[0].score : 0,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Compare relevance between two search result sets
|
|
268
|
+
*
|
|
269
|
+
* @param baseline - Baseline results
|
|
270
|
+
* @param comparison - Results to compare
|
|
271
|
+
* @param expected - Expected match criteria
|
|
272
|
+
* @returns Comparison metrics
|
|
273
|
+
*/
|
|
274
|
+
export function compareRelevance(
|
|
275
|
+
baseline: SearchResult[],
|
|
276
|
+
comparison: SearchResult[],
|
|
277
|
+
expected: ExpectedMatch
|
|
278
|
+
): {
|
|
279
|
+
baselineMetrics: ReturnType<typeof calculateRelevanceMetrics>;
|
|
280
|
+
comparisonMetrics: ReturnType<typeof calculateRelevanceMetrics>;
|
|
281
|
+
precisionDiff: number;
|
|
282
|
+
scoreDiff: number;
|
|
283
|
+
} {
|
|
284
|
+
const baselineMetrics = calculateRelevanceMetrics(baseline, expected);
|
|
285
|
+
const comparisonMetrics = calculateRelevanceMetrics(comparison, expected);
|
|
286
|
+
|
|
287
|
+
return {
|
|
288
|
+
baselineMetrics,
|
|
289
|
+
comparisonMetrics,
|
|
290
|
+
precisionDiff: comparisonMetrics.precision - baselineMetrics.precision,
|
|
291
|
+
scoreDiff: comparisonMetrics.topScore - baselineMetrics.topScore,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Assert minimum relevance score for results
|
|
297
|
+
*
|
|
298
|
+
* @param results - Search results
|
|
299
|
+
* @param minScore - Minimum acceptable score
|
|
300
|
+
*/
|
|
301
|
+
export function assertMinimumScores(
|
|
302
|
+
results: SearchResult[],
|
|
303
|
+
minScore: number
|
|
304
|
+
): void {
|
|
305
|
+
for (const result of results) {
|
|
306
|
+
if (result.score < minScore) {
|
|
307
|
+
throw new Error(
|
|
308
|
+
`Result at rank ${result.rank} has score ${result.score}, ` +
|
|
309
|
+
`which is below minimum ${minScore}`
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Check if results are properly ordered by score (descending)
|
|
317
|
+
*/
|
|
318
|
+
export function assertProperOrdering(results: SearchResult[]): void {
|
|
319
|
+
for (let i = 1; i < results.length; i++) {
|
|
320
|
+
if (results[i].score > results[i - 1].score) {
|
|
321
|
+
throw new Error(
|
|
322
|
+
`Results not properly ordered: rank ${i} has higher score ` +
|
|
323
|
+
`(${results[i].score}) than rank ${i - 1} (${results[i - 1].score})`
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Common keyword sets for testing
|
|
331
|
+
*/
|
|
332
|
+
export const CommonKeywords = {
|
|
333
|
+
AUTHENTICATION: [
|
|
334
|
+
'auth',
|
|
335
|
+
'login',
|
|
336
|
+
'jwt',
|
|
337
|
+
'token',
|
|
338
|
+
'password',
|
|
339
|
+
'session',
|
|
340
|
+
'oauth',
|
|
341
|
+
'credential',
|
|
342
|
+
],
|
|
343
|
+
API: [
|
|
344
|
+
'endpoint',
|
|
345
|
+
'request',
|
|
346
|
+
'response',
|
|
347
|
+
'rest',
|
|
348
|
+
'http',
|
|
349
|
+
'route',
|
|
350
|
+
'controller',
|
|
351
|
+
'middleware',
|
|
352
|
+
],
|
|
353
|
+
DATABASE: [
|
|
354
|
+
'query',
|
|
355
|
+
'database',
|
|
356
|
+
'repository',
|
|
357
|
+
'entity',
|
|
358
|
+
'model',
|
|
359
|
+
'schema',
|
|
360
|
+
'sql',
|
|
361
|
+
'orm',
|
|
362
|
+
],
|
|
363
|
+
TYPESCRIPT: [
|
|
364
|
+
'typescript',
|
|
365
|
+
'type',
|
|
366
|
+
'interface',
|
|
367
|
+
'generic',
|
|
368
|
+
'compiler',
|
|
369
|
+
'tsc',
|
|
370
|
+
],
|
|
371
|
+
REACT: ['react', 'component', 'jsx', 'hook', 'state', 'props', 'render'],
|
|
372
|
+
ERROR_HANDLING: [
|
|
373
|
+
'error',
|
|
374
|
+
'exception',
|
|
375
|
+
'catch',
|
|
376
|
+
'throw',
|
|
377
|
+
'try',
|
|
378
|
+
'handler',
|
|
379
|
+
'validation',
|
|
380
|
+
],
|
|
381
|
+
} as const;
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
2
|
+
import { execSync, spawnSync } from 'node:child_process';
|
|
3
|
+
import { rm, mkdtemp, writeFile, mkdir } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* CLI Consistency Tests
|
|
9
|
+
*
|
|
10
|
+
* These tests verify:
|
|
11
|
+
* 1. Exit codes are consistent across commands
|
|
12
|
+
* 2. --format json is respected by all commands
|
|
13
|
+
* 3. --quiet suppresses non-essential output
|
|
14
|
+
* 4. Error messages follow consistent format
|
|
15
|
+
* 5. Spinners check TTY before displaying
|
|
16
|
+
* 6. store delete prompts for confirmation without --force
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* CLI Consistency Tests
|
|
21
|
+
*
|
|
22
|
+
* Tests that CLI commands have consistent behavior:
|
|
23
|
+
* - Exit codes
|
|
24
|
+
* - JSON format support
|
|
25
|
+
* - Quiet mode
|
|
26
|
+
* - Error message format
|
|
27
|
+
*
|
|
28
|
+
* The CLI now properly cleans up resources via destroyServices() which
|
|
29
|
+
* stops the PythonBridge subprocess, allowing commands to exit cleanly.
|
|
30
|
+
*/
|
|
31
|
+
describe('CLI Consistency', () => {
|
|
32
|
+
let tempDir: string;
|
|
33
|
+
let testFilesDir: string;
|
|
34
|
+
|
|
35
|
+
beforeAll(async () => {
|
|
36
|
+
tempDir = await mkdtemp(join(tmpdir(), 'cli-consistency-'));
|
|
37
|
+
testFilesDir = join(tempDir, 'files');
|
|
38
|
+
await mkdir(testFilesDir, { recursive: true });
|
|
39
|
+
await writeFile(
|
|
40
|
+
join(testFilesDir, 'test.md'),
|
|
41
|
+
'# Test\n\nContent for testing CLI consistency.'
|
|
42
|
+
);
|
|
43
|
+
}, 30000);
|
|
44
|
+
|
|
45
|
+
afterAll(async () => {
|
|
46
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Helper to run CLI and capture output + exit code
|
|
51
|
+
* Properly handles quoted arguments
|
|
52
|
+
*/
|
|
53
|
+
const runCli = (args: string, options: { expectError?: boolean; stdin?: string } = {}): {
|
|
54
|
+
stdout: string;
|
|
55
|
+
stderr: string;
|
|
56
|
+
exitCode: number;
|
|
57
|
+
} => {
|
|
58
|
+
// Parse args respecting quotes
|
|
59
|
+
const argArray: string[] = [];
|
|
60
|
+
let current = '';
|
|
61
|
+
let inQuotes = false;
|
|
62
|
+
let quoteChar = '';
|
|
63
|
+
|
|
64
|
+
for (const char of args) {
|
|
65
|
+
if ((char === '"' || char === "'") && !inQuotes) {
|
|
66
|
+
inQuotes = true;
|
|
67
|
+
quoteChar = char;
|
|
68
|
+
} else if (char === quoteChar && inQuotes) {
|
|
69
|
+
inQuotes = false;
|
|
70
|
+
quoteChar = '';
|
|
71
|
+
} else if (char === ' ' && !inQuotes) {
|
|
72
|
+
if (current) {
|
|
73
|
+
argArray.push(current);
|
|
74
|
+
current = '';
|
|
75
|
+
}
|
|
76
|
+
} else {
|
|
77
|
+
current += char;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (current) {
|
|
81
|
+
argArray.push(current);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const result = spawnSync('node', ['dist/index.js', ...argArray, '--data-dir', tempDir], {
|
|
85
|
+
encoding: 'utf-8',
|
|
86
|
+
timeout: 60000,
|
|
87
|
+
input: options.stdin,
|
|
88
|
+
});
|
|
89
|
+
return {
|
|
90
|
+
stdout: result.stdout || '',
|
|
91
|
+
stderr: result.stderr || '',
|
|
92
|
+
exitCode: result.status ?? 1,
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Helper for commands expected to succeed
|
|
98
|
+
*/
|
|
99
|
+
const cli = (args: string): string => {
|
|
100
|
+
return execSync(`node dist/index.js ${args} --data-dir "${tempDir}"`, {
|
|
101
|
+
encoding: 'utf-8',
|
|
102
|
+
timeout: 60000,
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
describe('Exit Codes', () => {
|
|
107
|
+
it('returns exit code 0 on success', () => {
|
|
108
|
+
const result = runCli('store list');
|
|
109
|
+
expect(result.exitCode).toBe(0);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('returns non-zero exit code when store not found', () => {
|
|
113
|
+
const result = runCli('store info nonexistent-store');
|
|
114
|
+
// Exit code may be 3 (expected) or 134 (SIGABRT from LanceDB cleanup)
|
|
115
|
+
expect(result.exitCode).not.toBe(0);
|
|
116
|
+
expect(result.stderr).toContain('Error: Store not found');
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('returns non-zero exit code when store not found for delete', () => {
|
|
120
|
+
const result = runCli('store delete nonexistent-store --force');
|
|
121
|
+
expect(result.exitCode).not.toBe(0);
|
|
122
|
+
expect(result.stderr).toContain('Error: Store not found');
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('returns non-zero exit code when store not found for index', () => {
|
|
126
|
+
const result = runCli('index nonexistent-store');
|
|
127
|
+
expect(result.exitCode).not.toBe(0);
|
|
128
|
+
expect(result.stderr).toContain('Error: Store not found');
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('returns non-zero exit code when store not found for search with --stores', () => {
|
|
132
|
+
const result = runCli('search "test" --stores nonexistent-store');
|
|
133
|
+
expect(result.exitCode).not.toBe(0);
|
|
134
|
+
expect(result.stderr).toContain('Error: Store not found');
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
describe('--format json Support', () => {
|
|
140
|
+
beforeAll(async () => {
|
|
141
|
+
// Create a store for testing
|
|
142
|
+
try {
|
|
143
|
+
cli(`store create json-test-store --type file --source "${testFilesDir}"`);
|
|
144
|
+
cli('index json-test-store');
|
|
145
|
+
} catch {
|
|
146
|
+
// Store may already exist
|
|
147
|
+
}
|
|
148
|
+
}, 120000);
|
|
149
|
+
|
|
150
|
+
it('store list supports --format json', () => {
|
|
151
|
+
const result = runCli('store list --format json');
|
|
152
|
+
expect(result.exitCode).toBe(0);
|
|
153
|
+
expect(() => JSON.parse(result.stdout)).not.toThrow();
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('store info supports --format json', () => {
|
|
157
|
+
const result = runCli('store info json-test-store --format json');
|
|
158
|
+
expect(result.exitCode).toBe(0);
|
|
159
|
+
const parsed = JSON.parse(result.stdout);
|
|
160
|
+
expect(parsed).toHaveProperty('name');
|
|
161
|
+
expect(parsed).toHaveProperty('id');
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it('search supports --format json', () => {
|
|
165
|
+
const result = runCli('search "test" --format json');
|
|
166
|
+
expect(result.exitCode).toBe(0);
|
|
167
|
+
const parsed = JSON.parse(result.stdout);
|
|
168
|
+
expect(parsed).toHaveProperty('results');
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('index supports --format json', () => {
|
|
172
|
+
const result = runCli('index json-test-store --format json');
|
|
173
|
+
expect(result.exitCode).toBe(0);
|
|
174
|
+
const parsed = JSON.parse(result.stdout);
|
|
175
|
+
expect(parsed).toHaveProperty('documentsIndexed');
|
|
176
|
+
}, 120000);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
describe('--quiet Flag', () => {
|
|
180
|
+
beforeAll(async () => {
|
|
181
|
+
try {
|
|
182
|
+
cli(`store create quiet-test-store --type file --source "${testFilesDir}"`);
|
|
183
|
+
} catch {
|
|
184
|
+
// Store may already exist
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('--quiet suppresses all output for index on success', () => {
|
|
189
|
+
const result = runCli('index quiet-test-store --quiet');
|
|
190
|
+
expect(result.exitCode).toBe(0);
|
|
191
|
+
// Quiet mode = no output on success
|
|
192
|
+
expect(result.stdout.trim()).toBe('');
|
|
193
|
+
}, 120000);
|
|
194
|
+
|
|
195
|
+
it('--quiet outputs only store names for store list', () => {
|
|
196
|
+
const result = runCli('store list --quiet');
|
|
197
|
+
expect(result.exitCode).toBe(0);
|
|
198
|
+
// Should not contain decorative headers
|
|
199
|
+
expect(result.stdout).not.toContain('Stores:');
|
|
200
|
+
// Should still list store names (one per line)
|
|
201
|
+
expect(result.stdout.trim().length).toBeGreaterThan(0);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it('--quiet outputs only paths for search', () => {
|
|
205
|
+
const result = runCli('search "test" --quiet');
|
|
206
|
+
expect(result.exitCode).toBe(0);
|
|
207
|
+
// Should not contain verbose headers
|
|
208
|
+
expect(result.stdout).not.toContain('Search:');
|
|
209
|
+
expect(result.stdout).not.toContain('Mode:');
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
describe('Error Message Format', () => {
|
|
214
|
+
it('uses consistent "Error:" prefix for store not found', () => {
|
|
215
|
+
const result = runCli('store info nonexistent');
|
|
216
|
+
expect(result.stderr).toMatch(/^Error: Store not found: nonexistent/m);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it('uses consistent "Error:" prefix for store delete not found', () => {
|
|
220
|
+
const result = runCli('store delete nonexistent --force');
|
|
221
|
+
expect(result.stderr).toMatch(/^Error: Store not found: nonexistent/m);
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
it('uses consistent "Error:" prefix for index not found', () => {
|
|
225
|
+
const result = runCli('index nonexistent');
|
|
226
|
+
expect(result.stderr).toMatch(/^Error: Store not found: nonexistent/m);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it('uses consistent "Error:" prefix for search store not found', () => {
|
|
230
|
+
const result = runCli('search "test" --stores nonexistent');
|
|
231
|
+
expect(result.stderr).toMatch(/^Error: Store not found: nonexistent/m);
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
it('uses consistent "Error:" prefix for crawl store not found', () => {
|
|
235
|
+
const result = runCli('crawl https://example.com nonexistent');
|
|
236
|
+
expect(result.stderr).toMatch(/^Error: /m);
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
describe('store delete Confirmation', () => {
|
|
241
|
+
beforeAll(async () => {
|
|
242
|
+
try {
|
|
243
|
+
cli(`store create delete-test-store --type file --source "${testFilesDir}"`);
|
|
244
|
+
} catch {
|
|
245
|
+
// Store may already exist
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it('prompts for confirmation without --force', () => {
|
|
250
|
+
// When run without --force and without TTY, should fail or prompt
|
|
251
|
+
const result = runCli('store delete delete-test-store');
|
|
252
|
+
// Should either prompt (and fail due to no input) or require --force
|
|
253
|
+
expect(result.exitCode).not.toBe(0);
|
|
254
|
+
expect(result.stderr + result.stdout).toMatch(/confirm|--force|cancelled/i);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it('deletes without prompt with --force', () => {
|
|
258
|
+
// First recreate the store
|
|
259
|
+
try {
|
|
260
|
+
cli(`store create delete-force-store --type file --source "${testFilesDir}"`);
|
|
261
|
+
} catch {
|
|
262
|
+
// ignore
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
const result = runCli('store delete delete-force-store --force');
|
|
266
|
+
expect(result.exitCode).toBe(0);
|
|
267
|
+
expect(result.stdout).toContain('Deleted');
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
it('accepts -y as alias for --force', () => {
|
|
271
|
+
try {
|
|
272
|
+
cli(`store create delete-y-store --type file --source "${testFilesDir}"`);
|
|
273
|
+
} catch {
|
|
274
|
+
// ignore
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const result = runCli('store delete delete-y-store -y');
|
|
278
|
+
expect(result.exitCode).toBe(0);
|
|
279
|
+
expect(result.stdout).toContain('Deleted');
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
describe('Non-TTY Spinner Behavior', () => {
|
|
284
|
+
it('does not show spinner characters in non-TTY mode for index', () => {
|
|
285
|
+
// Create a store for this test
|
|
286
|
+
try {
|
|
287
|
+
cli(`store create spinner-test --type file --source "${testFilesDir}"`);
|
|
288
|
+
} catch {
|
|
289
|
+
// ignore
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const result = runCli('index spinner-test');
|
|
293
|
+
// Should not contain ora spinner frames (⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏ or similar)
|
|
294
|
+
expect(result.stdout).not.toMatch(/[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏]/);
|
|
295
|
+
expect(result.exitCode).toBe(0);
|
|
296
|
+
}, 120000);
|
|
297
|
+
|
|
298
|
+
});
|
|
299
|
+
});
|