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,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repository Pattern Implementation
|
|
3
|
+
*
|
|
4
|
+
* This module implements the Repository pattern for data access abstraction.
|
|
5
|
+
* It provides a clean interface for CRUD operations independent of the underlying database.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Base entity interface - all entities must have an ID
|
|
10
|
+
*/
|
|
11
|
+
export interface Entity {
|
|
12
|
+
id: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Query options for find operations
|
|
17
|
+
*/
|
|
18
|
+
export interface QueryOptions<T> {
|
|
19
|
+
where?: Partial<T>;
|
|
20
|
+
orderBy?: {
|
|
21
|
+
field: keyof T;
|
|
22
|
+
direction: 'asc' | 'desc';
|
|
23
|
+
};
|
|
24
|
+
limit?: number;
|
|
25
|
+
offset?: number;
|
|
26
|
+
include?: string[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Result of a paginated query
|
|
31
|
+
*/
|
|
32
|
+
export interface PaginatedResult<T> {
|
|
33
|
+
items: T[];
|
|
34
|
+
total: number;
|
|
35
|
+
page: number;
|
|
36
|
+
pageSize: number;
|
|
37
|
+
totalPages: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Generic Repository interface
|
|
42
|
+
* Defines the contract for all repositories
|
|
43
|
+
*/
|
|
44
|
+
export interface IRepository<T extends Entity> {
|
|
45
|
+
findById(id: string): Promise<T | null>;
|
|
46
|
+
findOne(options: QueryOptions<T>): Promise<T | null>;
|
|
47
|
+
findMany(options?: QueryOptions<T>): Promise<T[]>;
|
|
48
|
+
findPaginated(page: number, pageSize: number, options?: QueryOptions<T>): Promise<PaginatedResult<T>>;
|
|
49
|
+
create(data: Omit<T, 'id'>): Promise<T>;
|
|
50
|
+
update(id: string, data: Partial<T>): Promise<T>;
|
|
51
|
+
delete(id: string): Promise<void>;
|
|
52
|
+
count(options?: QueryOptions<T>): Promise<number>;
|
|
53
|
+
exists(id: string): Promise<boolean>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Base Repository implementation with common functionality
|
|
58
|
+
* Extend this class for specific entity repositories
|
|
59
|
+
*/
|
|
60
|
+
export abstract class BaseRepository<T extends Entity> implements IRepository<T> {
|
|
61
|
+
protected items: Map<string, T> = new Map();
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Generates a unique ID for new entities
|
|
65
|
+
*/
|
|
66
|
+
protected generateId(): string {
|
|
67
|
+
return crypto.randomUUID();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Applies query filters to an array of items
|
|
72
|
+
*/
|
|
73
|
+
protected applyFilters(items: T[], options?: QueryOptions<T>): T[] {
|
|
74
|
+
let result = [...items];
|
|
75
|
+
|
|
76
|
+
// Apply where filters
|
|
77
|
+
if (options?.where) {
|
|
78
|
+
result = result.filter(item => {
|
|
79
|
+
return Object.entries(options.where!).every(([key, value]) => {
|
|
80
|
+
return item[key as keyof T] === value;
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Apply ordering
|
|
86
|
+
if (options?.orderBy) {
|
|
87
|
+
const { field, direction } = options.orderBy;
|
|
88
|
+
result.sort((a, b) => {
|
|
89
|
+
const aVal = a[field];
|
|
90
|
+
const bVal = b[field];
|
|
91
|
+
|
|
92
|
+
if (aVal < bVal) return direction === 'asc' ? -1 : 1;
|
|
93
|
+
if (aVal > bVal) return direction === 'asc' ? 1 : -1;
|
|
94
|
+
return 0;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Apply pagination
|
|
99
|
+
if (options?.offset !== undefined) {
|
|
100
|
+
result = result.slice(options.offset);
|
|
101
|
+
}
|
|
102
|
+
if (options?.limit !== undefined) {
|
|
103
|
+
result = result.slice(0, options.limit);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async findById(id: string): Promise<T | null> {
|
|
110
|
+
return this.items.get(id) ?? null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
async findOne(options: QueryOptions<T>): Promise<T | null> {
|
|
114
|
+
const results = await this.findMany({ ...options, limit: 1 });
|
|
115
|
+
return results[0] ?? null;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async findMany(options?: QueryOptions<T>): Promise<T[]> {
|
|
119
|
+
const allItems = Array.from(this.items.values());
|
|
120
|
+
return this.applyFilters(allItems, options);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async findPaginated(
|
|
124
|
+
page: number,
|
|
125
|
+
pageSize: number,
|
|
126
|
+
options?: QueryOptions<T>
|
|
127
|
+
): Promise<PaginatedResult<T>> {
|
|
128
|
+
const allItems = Array.from(this.items.values());
|
|
129
|
+
const filtered = this.applyFilters(allItems, { ...options, limit: undefined, offset: undefined });
|
|
130
|
+
const total = filtered.length;
|
|
131
|
+
|
|
132
|
+
const offset = (page - 1) * pageSize;
|
|
133
|
+
const items = filtered.slice(offset, offset + pageSize);
|
|
134
|
+
|
|
135
|
+
return {
|
|
136
|
+
items,
|
|
137
|
+
total,
|
|
138
|
+
page,
|
|
139
|
+
pageSize,
|
|
140
|
+
totalPages: Math.ceil(total / pageSize),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async create(data: Omit<T, 'id'>): Promise<T> {
|
|
145
|
+
const id = this.generateId();
|
|
146
|
+
const item = { ...data, id } as T;
|
|
147
|
+
this.items.set(id, item);
|
|
148
|
+
return item;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async update(id: string, data: Partial<T>): Promise<T> {
|
|
152
|
+
const existing = this.items.get(id);
|
|
153
|
+
if (!existing) {
|
|
154
|
+
throw new Error(`Entity with id ${id} not found`);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const updated = { ...existing, ...data, id } as T;
|
|
158
|
+
this.items.set(id, updated);
|
|
159
|
+
return updated;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
async delete(id: string): Promise<void> {
|
|
163
|
+
if (!this.items.has(id)) {
|
|
164
|
+
throw new Error(`Entity with id ${id} not found`);
|
|
165
|
+
}
|
|
166
|
+
this.items.delete(id);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
async count(options?: QueryOptions<T>): Promise<number> {
|
|
170
|
+
const items = await this.findMany({ ...options, limit: undefined, offset: undefined });
|
|
171
|
+
return items.length;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
async exists(id: string): Promise<boolean> {
|
|
175
|
+
return this.items.has(id);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* User entity for demonstration
|
|
181
|
+
*/
|
|
182
|
+
export interface User extends Entity {
|
|
183
|
+
email: string;
|
|
184
|
+
name: string;
|
|
185
|
+
role: 'admin' | 'user';
|
|
186
|
+
createdAt: Date;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* User Repository with user-specific methods
|
|
191
|
+
*/
|
|
192
|
+
export class UserRepository extends BaseRepository<User> {
|
|
193
|
+
async findByEmail(email: string): Promise<User | null> {
|
|
194
|
+
return this.findOne({ where: { email } as Partial<User> });
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
async findAdmins(): Promise<User[]> {
|
|
198
|
+
return this.findMany({ where: { role: 'admin' } as Partial<User> });
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
async findRecentUsers(limit: number = 10): Promise<User[]> {
|
|
202
|
+
return this.findMany({
|
|
203
|
+
orderBy: { field: 'createdAt', direction: 'desc' },
|
|
204
|
+
limit,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Post entity for demonstration
|
|
211
|
+
*/
|
|
212
|
+
export interface Post extends Entity {
|
|
213
|
+
title: string;
|
|
214
|
+
content: string;
|
|
215
|
+
authorId: string;
|
|
216
|
+
published: boolean;
|
|
217
|
+
createdAt: Date;
|
|
218
|
+
updatedAt: Date;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Post Repository with post-specific methods
|
|
223
|
+
*/
|
|
224
|
+
export class PostRepository extends BaseRepository<Post> {
|
|
225
|
+
async findByAuthor(authorId: string): Promise<Post[]> {
|
|
226
|
+
return this.findMany({ where: { authorId } as Partial<Post> });
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
async findPublished(): Promise<Post[]> {
|
|
230
|
+
return this.findMany({
|
|
231
|
+
where: { published: true } as Partial<Post>,
|
|
232
|
+
orderBy: { field: 'createdAt', direction: 'desc' },
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
async publish(id: string): Promise<Post> {
|
|
237
|
+
return this.update(id, { published: true, updatedAt: new Date() } as Partial<Post>);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
async unpublish(id: string): Promise<Post> {
|
|
241
|
+
return this.update(id, { published: false, updatedAt: new Date() } as Partial<Post>);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Unit of Work pattern for coordinating multiple repositories
|
|
247
|
+
*/
|
|
248
|
+
export class UnitOfWork {
|
|
249
|
+
public readonly users: UserRepository;
|
|
250
|
+
public readonly posts: PostRepository;
|
|
251
|
+
|
|
252
|
+
constructor() {
|
|
253
|
+
this.users = new UserRepository();
|
|
254
|
+
this.posts = new PostRepository();
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* In a real implementation, this would commit a database transaction
|
|
259
|
+
*/
|
|
260
|
+
async commit(): Promise<void> {
|
|
261
|
+
// Commit transaction
|
|
262
|
+
console.log('Transaction committed');
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* In a real implementation, this would rollback a database transaction
|
|
267
|
+
*/
|
|
268
|
+
async rollback(): Promise<void> {
|
|
269
|
+
// Rollback transaction
|
|
270
|
+
console.log('Transaction rolled back');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Test Corpus Version
|
|
2
|
+
|
|
3
|
+
## Current Version: 3.0.0
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
- **oss-repos/vue**: Vue.js core repository (~593 files) - complete source
|
|
7
|
+
- **oss-repos/express**: Express.js repository (~206 files) - complete source
|
|
8
|
+
- **oss-repos/hono**: Hono v4.6.0 (~191 files) - complete source
|
|
9
|
+
- **documentation/**: Express.js and Node.js excerpts
|
|
10
|
+
- **articles/**: Technical articles (React hooks, TypeScript, JWT)
|
|
11
|
+
|
|
12
|
+
## Last Updated
|
|
13
|
+
2025-12-18
|
|
14
|
+
|
|
15
|
+
## Change Log
|
|
16
|
+
- v3.0.0: Replaced sample files with full Vue.js and Express.js repositories
|
|
17
|
+
- v2.0.0: Replaced Zod with Vue.js and Express.js for broader framework coverage
|
|
18
|
+
- v1.0.0: Initial corpus with Zod, Hono, docs, and articles
|
|
19
|
+
|
|
20
|
+
## Maintenance
|
|
21
|
+
When updating corpus:
|
|
22
|
+
1. Update version number above
|
|
23
|
+
2. Update contents list
|
|
24
|
+
3. Run `npm run test:corpus:index` to rebuild index
|
|
25
|
+
4. Run `npm run test:quality -- --update-baseline` to set new baseline
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# JWT Authentication in Node.js: A Complete Guide
|
|
2
|
+
|
|
3
|
+
## What is JWT?
|
|
4
|
+
|
|
5
|
+
JSON Web Tokens (JWT) are an open standard (RFC 7519) for securely transmitting information between parties as a JSON object. JWTs are commonly used for authentication and authorization.
|
|
6
|
+
|
|
7
|
+
## Structure of a JWT
|
|
8
|
+
|
|
9
|
+
A JWT consists of three parts separated by dots:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
header.payload.signature
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
- **Header**: Contains the token type and signing algorithm
|
|
16
|
+
- **Payload**: Contains claims (user data)
|
|
17
|
+
- **Signature**: Verifies the token hasn't been tampered with
|
|
18
|
+
|
|
19
|
+
## Implementing JWT Authentication
|
|
20
|
+
|
|
21
|
+
### Installation
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install jsonwebtoken bcryptjs
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Creating Tokens
|
|
28
|
+
|
|
29
|
+
```javascript
|
|
30
|
+
const jwt = require('jsonwebtoken')
|
|
31
|
+
|
|
32
|
+
function generateAccessToken(user) {
|
|
33
|
+
return jwt.sign(
|
|
34
|
+
{ userId: user.id, email: user.email },
|
|
35
|
+
process.env.JWT_SECRET,
|
|
36
|
+
{ expiresIn: '15m' }
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function generateRefreshToken(user) {
|
|
41
|
+
return jwt.sign(
|
|
42
|
+
{ userId: user.id },
|
|
43
|
+
process.env.JWT_REFRESH_SECRET,
|
|
44
|
+
{ expiresIn: '7d' }
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Verifying Tokens
|
|
50
|
+
|
|
51
|
+
```javascript
|
|
52
|
+
function authenticateToken(req, res, next) {
|
|
53
|
+
const authHeader = req.headers['authorization']
|
|
54
|
+
const token = authHeader && authHeader.split(' ')[1]
|
|
55
|
+
|
|
56
|
+
if (!token) {
|
|
57
|
+
return res.status(401).json({ error: 'Access token required' })
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
|
|
61
|
+
if (err) {
|
|
62
|
+
return res.status(403).json({ error: 'Invalid or expired token' })
|
|
63
|
+
}
|
|
64
|
+
req.user = user
|
|
65
|
+
next()
|
|
66
|
+
})
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Refresh Token Flow
|
|
71
|
+
|
|
72
|
+
```javascript
|
|
73
|
+
app.post('/token/refresh', (req, res) => {
|
|
74
|
+
const { refreshToken } = req.body
|
|
75
|
+
|
|
76
|
+
if (!refreshToken) {
|
|
77
|
+
return res.status(401).json({ error: 'Refresh token required' })
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
jwt.verify(refreshToken, process.env.JWT_REFRESH_SECRET, (err, user) => {
|
|
81
|
+
if (err) {
|
|
82
|
+
return res.status(403).json({ error: 'Invalid refresh token' })
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const accessToken = generateAccessToken({ id: user.userId })
|
|
86
|
+
res.json({ accessToken })
|
|
87
|
+
})
|
|
88
|
+
})
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Security Best Practices
|
|
92
|
+
|
|
93
|
+
1. **Use short expiration times** for access tokens (15 minutes)
|
|
94
|
+
2. **Store refresh tokens securely** (httpOnly cookies)
|
|
95
|
+
3. **Implement token revocation** for logout
|
|
96
|
+
4. **Use strong secrets** (at least 256 bits)
|
|
97
|
+
5. **Always use HTTPS** in production
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# React Hooks Patterns and Best Practices
|
|
2
|
+
|
|
3
|
+
## Custom Hooks
|
|
4
|
+
|
|
5
|
+
Custom hooks let you extract component logic into reusable functions.
|
|
6
|
+
|
|
7
|
+
### useLocalStorage
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
function useLocalStorage<T>(key: string, initialValue: T) {
|
|
11
|
+
const [storedValue, setStoredValue] = useState<T>(() => {
|
|
12
|
+
try {
|
|
13
|
+
const item = window.localStorage.getItem(key)
|
|
14
|
+
return item ? JSON.parse(item) : initialValue
|
|
15
|
+
} catch (error) {
|
|
16
|
+
return initialValue
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
const setValue = (value: T | ((val: T) => T)) => {
|
|
21
|
+
try {
|
|
22
|
+
const valueToStore = value instanceof Function ? value(storedValue) : value
|
|
23
|
+
setStoredValue(valueToStore)
|
|
24
|
+
window.localStorage.setItem(key, JSON.stringify(valueToStore))
|
|
25
|
+
} catch (error) {
|
|
26
|
+
console.error(error)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return [storedValue, setValue] as const
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### useDebounce
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
function useDebounce<T>(value: T, delay: number): T {
|
|
38
|
+
const [debouncedValue, setDebouncedValue] = useState(value)
|
|
39
|
+
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
const timer = setTimeout(() => {
|
|
42
|
+
setDebouncedValue(value)
|
|
43
|
+
}, delay)
|
|
44
|
+
|
|
45
|
+
return () => clearTimeout(timer)
|
|
46
|
+
}, [value, delay])
|
|
47
|
+
|
|
48
|
+
return debouncedValue
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Usage
|
|
52
|
+
function SearchComponent() {
|
|
53
|
+
const [query, setQuery] = useState('')
|
|
54
|
+
const debouncedQuery = useDebounce(query, 300)
|
|
55
|
+
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
if (debouncedQuery) {
|
|
58
|
+
searchAPI(debouncedQuery)
|
|
59
|
+
}
|
|
60
|
+
}, [debouncedQuery])
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### useFetch
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
interface FetchState<T> {
|
|
68
|
+
data: T | null
|
|
69
|
+
loading: boolean
|
|
70
|
+
error: Error | null
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function useFetch<T>(url: string): FetchState<T> {
|
|
74
|
+
const [state, setState] = useState<FetchState<T>>({
|
|
75
|
+
data: null,
|
|
76
|
+
loading: true,
|
|
77
|
+
error: null,
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
const controller = new AbortController()
|
|
82
|
+
|
|
83
|
+
async function fetchData() {
|
|
84
|
+
try {
|
|
85
|
+
setState(prev => ({ ...prev, loading: true }))
|
|
86
|
+
const response = await fetch(url, { signal: controller.signal })
|
|
87
|
+
if (!response.ok) throw new Error(response.statusText)
|
|
88
|
+
const data = await response.json()
|
|
89
|
+
setState({ data, loading: false, error: null })
|
|
90
|
+
} catch (error) {
|
|
91
|
+
if (error.name !== 'AbortError') {
|
|
92
|
+
setState({ data: null, loading: false, error })
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
fetchData()
|
|
98
|
+
return () => controller.abort()
|
|
99
|
+
}, [url])
|
|
100
|
+
|
|
101
|
+
return state
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Rules of Hooks
|
|
106
|
+
|
|
107
|
+
1. **Only call hooks at the top level** - not inside loops, conditions, or nested functions
|
|
108
|
+
2. **Only call hooks from React functions** - components or custom hooks
|
|
109
|
+
3. **Name custom hooks with "use" prefix** - enables linting rules
|
|
110
|
+
|
|
111
|
+
## Performance Patterns
|
|
112
|
+
|
|
113
|
+
### useMemo for expensive calculations
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
const expensiveResult = useMemo(() => {
|
|
117
|
+
return computeExpensiveValue(a, b)
|
|
118
|
+
}, [a, b])
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### useCallback for stable function references
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
const handleClick = useCallback(() => {
|
|
125
|
+
doSomething(id)
|
|
126
|
+
}, [id])
|
|
127
|
+
```
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# TypeScript Generics: From Basics to Advanced Patterns
|
|
2
|
+
|
|
3
|
+
## Why Generics?
|
|
4
|
+
|
|
5
|
+
Generics allow you to write reusable code that works with multiple types while maintaining type safety.
|
|
6
|
+
|
|
7
|
+
## Basic Generic Functions
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// Without generics - loses type information
|
|
11
|
+
function identity(arg: any): any {
|
|
12
|
+
return arg
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// With generics - preserves type
|
|
16
|
+
function identity<T>(arg: T): T {
|
|
17
|
+
return arg
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const str = identity<string>('hello') // string
|
|
21
|
+
const num = identity(42) // number (inferred)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Generic Constraints
|
|
25
|
+
|
|
26
|
+
Constrain generics to types with specific properties:
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
interface HasLength {
|
|
30
|
+
length: number
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function logLength<T extends HasLength>(arg: T): T {
|
|
34
|
+
console.log(arg.length)
|
|
35
|
+
return arg
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
logLength('hello') // OK
|
|
39
|
+
logLength([1, 2, 3]) // OK
|
|
40
|
+
logLength(123) // Error: number doesn't have length
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Generic Interfaces
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
interface Repository<T> {
|
|
47
|
+
find(id: string): Promise<T | null>
|
|
48
|
+
findAll(): Promise<T[]>
|
|
49
|
+
create(data: Omit<T, 'id'>): Promise<T>
|
|
50
|
+
update(id: string, data: Partial<T>): Promise<T>
|
|
51
|
+
delete(id: string): Promise<void>
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
interface User {
|
|
55
|
+
id: string
|
|
56
|
+
name: string
|
|
57
|
+
email: string
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
class UserRepository implements Repository<User> {
|
|
61
|
+
async find(id: string): Promise<User | null> {
|
|
62
|
+
// implementation
|
|
63
|
+
}
|
|
64
|
+
// ... other methods
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Conditional Types
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
type IsArray<T> = T extends any[] ? true : false
|
|
72
|
+
|
|
73
|
+
type A = IsArray<string[]> // true
|
|
74
|
+
type B = IsArray<number> // false
|
|
75
|
+
|
|
76
|
+
// Extract element type from array
|
|
77
|
+
type ElementType<T> = T extends (infer E)[] ? E : never
|
|
78
|
+
|
|
79
|
+
type C = ElementType<string[]> // string
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Mapped Types
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
type Readonly<T> = {
|
|
86
|
+
readonly [K in keyof T]: T[K]
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
type Partial<T> = {
|
|
90
|
+
[K in keyof T]?: T[K]
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
type Required<T> = {
|
|
94
|
+
[K in keyof T]-?: T[K]
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Utility Type Patterns
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// Make specific keys optional
|
|
102
|
+
type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>
|
|
103
|
+
|
|
104
|
+
// Make specific keys required
|
|
105
|
+
type RequiredBy<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>
|
|
106
|
+
|
|
107
|
+
// Deep partial
|
|
108
|
+
type DeepPartial<T> = {
|
|
109
|
+
[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K]
|
|
110
|
+
}
|
|
111
|
+
```
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Express Middleware Guide
|
|
2
|
+
|
|
3
|
+
## What is Middleware?
|
|
4
|
+
|
|
5
|
+
Middleware functions are functions that have access to the request object (`req`), the response object (`res`), and the `next` function in the application's request-response cycle.
|
|
6
|
+
|
|
7
|
+
Middleware functions can:
|
|
8
|
+
- Execute any code
|
|
9
|
+
- Make changes to the request and response objects
|
|
10
|
+
- End the request-response cycle
|
|
11
|
+
- Call the next middleware in the stack
|
|
12
|
+
|
|
13
|
+
## Application-level Middleware
|
|
14
|
+
|
|
15
|
+
Bind application-level middleware to an instance of the app object using `app.use()` and `app.METHOD()`.
|
|
16
|
+
|
|
17
|
+
```javascript
|
|
18
|
+
const express = require('express')
|
|
19
|
+
const app = express()
|
|
20
|
+
|
|
21
|
+
// Middleware with no mount path - executed for every request
|
|
22
|
+
app.use((req, res, next) => {
|
|
23
|
+
console.log('Time:', Date.now())
|
|
24
|
+
next()
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
// Middleware mounted on /user/:id
|
|
28
|
+
app.use('/user/:id', (req, res, next) => {
|
|
29
|
+
console.log('Request Type:', req.method)
|
|
30
|
+
next()
|
|
31
|
+
})
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Error-handling Middleware
|
|
35
|
+
|
|
36
|
+
Error-handling middleware always takes four arguments:
|
|
37
|
+
|
|
38
|
+
```javascript
|
|
39
|
+
app.use((err, req, res, next) => {
|
|
40
|
+
console.error(err.stack)
|
|
41
|
+
res.status(500).send('Something broke!')
|
|
42
|
+
})
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Built-in Middleware
|
|
46
|
+
|
|
47
|
+
Express has built-in middleware functions:
|
|
48
|
+
|
|
49
|
+
- `express.static` - serves static assets
|
|
50
|
+
- `express.json` - parses JSON payloads
|
|
51
|
+
- `express.urlencoded` - parses URL-encoded payloads
|
|
52
|
+
|
|
53
|
+
```javascript
|
|
54
|
+
app.use(express.json())
|
|
55
|
+
app.use(express.urlencoded({ extended: true }))
|
|
56
|
+
app.use(express.static('public'))
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Third-party Middleware
|
|
60
|
+
|
|
61
|
+
Common third-party middleware:
|
|
62
|
+
|
|
63
|
+
```javascript
|
|
64
|
+
const cors = require('cors')
|
|
65
|
+
const helmet = require('helmet')
|
|
66
|
+
const morgan = require('morgan')
|
|
67
|
+
|
|
68
|
+
app.use(cors())
|
|
69
|
+
app.use(helmet())
|
|
70
|
+
app.use(morgan('dev'))
|
|
71
|
+
```
|