Compare commits
7 Commits
@hono/ua-b
...
main
Author | SHA1 | Date |
---|---|---|
|
80481dd5ed | |
|
1baa0b281d | |
|
5cba9a4819 | |
|
acff470c7f | |
|
9235709060 | |
|
40f916f944 | |
|
a2409d2314 |
|
@ -41,8 +41,7 @@ jobs:
|
||||||
with:
|
with:
|
||||||
node-version: 20.x
|
node-version: 20.x
|
||||||
- run: yarn workspaces focus hono-middleware @hono/${{ matrix.package }}
|
- run: yarn workspaces focus hono-middleware @hono/${{ matrix.package }}
|
||||||
- run: yarn workspaces foreach --topological --recursive --from @hono/${{ matrix.package }} run build
|
- run: yarn workspaces foreach --topological --recursive --from @hono/${{ matrix.package }} run publint
|
||||||
- run: yarn workspace @hono/${{ matrix.package }} publint
|
|
||||||
- run: yarn workspace @hono/${{ matrix.package }} typecheck
|
- run: yarn workspace @hono/${{ matrix.package }} typecheck
|
||||||
- run: yarn eslint packages/${{ matrix.package }}
|
- run: yarn eslint packages/${{ matrix.package }}
|
||||||
- run: yarn prettier --check . !packages packages/${{ matrix.package }}
|
- run: yarn prettier --check . !packages packages/${{ matrix.package }}
|
||||||
|
|
|
@ -1,4 +1,9 @@
|
||||||
.changeset
|
.changeset
|
||||||
.vscode
|
.vscode
|
||||||
.yarn
|
.yarn
|
||||||
|
|
||||||
|
# Casbin
|
||||||
|
*.conf
|
||||||
|
*.csv
|
||||||
|
|
||||||
**/generated.ts
|
**/generated.ts
|
||||||
|
|
|
@ -17,8 +17,8 @@
|
||||||
"test": "vitest",
|
"test": "vitest",
|
||||||
"lint": "eslint 'packages/**/*.{ts,tsx}'",
|
"lint": "eslint 'packages/**/*.{ts,tsx}'",
|
||||||
"lint:fix": "eslint --fix 'packages/**/*.{ts,tsx}'",
|
"lint:fix": "eslint --fix 'packages/**/*.{ts,tsx}'",
|
||||||
"format": "prettier --check 'packages/**/*.{ts,tsx}'",
|
"format": "prettier --check .",
|
||||||
"format:fix": "prettier --write 'packages/**/*.{ts,tsx}'"
|
"format:fix": "prettier --write ."
|
||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true,
|
"isolatedDeclarations": true,
|
||||||
"jsx": "react"
|
"jsx": "react"
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "../../dist/out-tsc/packages/auth-js",
|
"outDir": "../../dist/out-tsc/packages/auth-js",
|
||||||
"noEmit": true,
|
|
||||||
"jsx": "react"
|
"jsx": "react"
|
||||||
},
|
},
|
||||||
"include": ["**/*.test.ts", "vitest.config.ts"],
|
"include": ["**/*.test.ts", "vitest.config.ts"],
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true,
|
"isolatedDeclarations": true,
|
||||||
"types": ["node", "bun"]
|
"types": ["node", "bun"]
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["./src/**/*.ts"],
|
"include": ["./src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true,
|
"isolatedDeclarations": true,
|
||||||
"types": ["@cloudflare/workers-types"]
|
"types": ["@cloudflare/workers-types"]
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,8 +1,15 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
|
"emitDeclarationOnly": true,
|
||||||
|
"isolatedDeclarations": true,
|
||||||
"types": ["@cloudflare/workers-types"]
|
"types": ["@cloudflare/workers-types"]
|
||||||
},
|
},
|
||||||
|
"include": ["src/**/*.ts"],
|
||||||
|
"exclude": ["**/*.test.ts"],
|
||||||
"references": []
|
"references": []
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "../../dist/out-tsc/packages/firebase-auth",
|
"outDir": "../../dist/out-tsc/packages/firebase-auth",
|
||||||
"noEmit": true
|
"types": ["@cloudflare/workers-types"]
|
||||||
},
|
},
|
||||||
"include": ["**/*.test.ts", "vitest.config.ts"],
|
"include": ["**/*.test.ts", "firebase-tools.d.ts", "vitest.config.ts"],
|
||||||
"references": [
|
"references": [
|
||||||
{
|
{
|
||||||
"path": "./tsconfig.build.json"
|
"path": "./tsconfig.build.json"
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
# @hono/mcp
|
||||||
|
|
||||||
|
## 0.1.0
|
||||||
|
|
||||||
|
### Minor Changes
|
||||||
|
|
||||||
|
- [#1178](https://github.com/honojs/middleware/pull/1178) [`1baa0b281dd4170f0003f9353a5f4c33fdcca610`](https://github.com/honojs/middleware/commit/1baa0b281dd4170f0003f9353a5f4c33fdcca610) Thanks [@MathurAditya724](https://github.com/MathurAditya724)! - init release
|
|
@ -0,0 +1,35 @@
|
||||||
|
# Hono MCP (Model Context Protocol)
|
||||||
|
|
||||||
|
Connect Hono with a Model Context Protocol (MCP) server over HTTP Streaming Transport.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```ts
|
||||||
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
|
||||||
|
import { StreamableHTTPTransport } from '@hono/mcp'
|
||||||
|
import { Hono } from 'hono'
|
||||||
|
|
||||||
|
const app = new Hono()
|
||||||
|
|
||||||
|
// Your MCP server implementation
|
||||||
|
const mcpServer = new McpServer({
|
||||||
|
name: 'my-mcp-server',
|
||||||
|
version: '1.0.0',
|
||||||
|
})
|
||||||
|
|
||||||
|
app.all('/mcp', async (c) => {
|
||||||
|
const transport = new StreamableHTTPTransport()
|
||||||
|
await mcpServer.connect(transport)
|
||||||
|
return transport.handleRequest(c)
|
||||||
|
})
|
||||||
|
|
||||||
|
export default app
|
||||||
|
```
|
||||||
|
|
||||||
|
## Author
|
||||||
|
|
||||||
|
Aditya Mathur <https://github.com/mathuraditya724>
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT
|
|
@ -0,0 +1,52 @@
|
||||||
|
{
|
||||||
|
"name": "@hono/mcp",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"description": "MCP Middleware for Hono",
|
||||||
|
"type": "module",
|
||||||
|
"module": "dist/index.js",
|
||||||
|
"types": "dist/index.d.ts",
|
||||||
|
"files": [
|
||||||
|
"dist"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsup ./src/index.ts",
|
||||||
|
"prepack": "yarn build",
|
||||||
|
"publint": "attw --pack && publint",
|
||||||
|
"typecheck": "tsc -b tsconfig.json",
|
||||||
|
"test": "vitest"
|
||||||
|
},
|
||||||
|
"exports": {
|
||||||
|
"import": {
|
||||||
|
"types": "./dist/index.d.ts",
|
||||||
|
"default": "./dist/index.js"
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"types": "./dist/index.d.cts",
|
||||||
|
"default": "./dist/index.cjs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"publishConfig": {
|
||||||
|
"registry": "https://registry.npmjs.org",
|
||||||
|
"access": "public"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/honojs/middleware.git",
|
||||||
|
"directory": "packages/mcp"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/honojs/middleware",
|
||||||
|
"peerDependencies": {
|
||||||
|
"@modelcontextprotocol/sdk": "^1.12.0",
|
||||||
|
"hono": "*"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@arethetypeswrong/cli": "^0.17.4",
|
||||||
|
"@modelcontextprotocol/sdk": "^1.12.0",
|
||||||
|
"publint": "^0.3.9",
|
||||||
|
"tsup": "^8.4.0",
|
||||||
|
"typescript": "^5.8.2",
|
||||||
|
"vitest": "^3.0.8",
|
||||||
|
"zod": "^3.25.34"
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,613 @@
|
||||||
|
/**
|
||||||
|
* @module
|
||||||
|
* MCP HTTP Streaming Helper for Hono.
|
||||||
|
*/
|
||||||
|
import type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js'
|
||||||
|
import type {
|
||||||
|
EventStore,
|
||||||
|
StreamableHTTPServerTransportOptions,
|
||||||
|
} from '@modelcontextprotocol/sdk/server/streamableHttp.js'
|
||||||
|
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'
|
||||||
|
import {
|
||||||
|
isInitializeRequest,
|
||||||
|
isJSONRPCError,
|
||||||
|
isJSONRPCRequest,
|
||||||
|
isJSONRPCResponse,
|
||||||
|
JSONRPCMessageSchema,
|
||||||
|
} from '@modelcontextprotocol/sdk/types.js'
|
||||||
|
import type { JSONRPCMessage, RequestId } from '@modelcontextprotocol/sdk/types.js'
|
||||||
|
import type { Context } from 'hono'
|
||||||
|
import { HTTPException } from 'hono/http-exception'
|
||||||
|
import type { SSEStreamingApi } from 'hono/streaming'
|
||||||
|
import { streamSSE } from './streaming'
|
||||||
|
|
||||||
|
export class StreamableHTTPTransport implements Transport {
|
||||||
|
#started = false
|
||||||
|
#initialized = false
|
||||||
|
#onsessioninitialized?: (sessionId: string) => void
|
||||||
|
#sessionIdGenerator?: () => string
|
||||||
|
#eventStore?: EventStore
|
||||||
|
#enableJsonResponse = false
|
||||||
|
#standaloneSseStreamId = '_GET_stream'
|
||||||
|
#streamMapping = new Map<
|
||||||
|
string,
|
||||||
|
{
|
||||||
|
ctx: {
|
||||||
|
header: (name: string, value: string) => void
|
||||||
|
json: (data: unknown) => void
|
||||||
|
}
|
||||||
|
stream?: SSEStreamingApi
|
||||||
|
}
|
||||||
|
>()
|
||||||
|
#requestToStreamMapping = new Map<RequestId, string>()
|
||||||
|
#requestResponseMap = new Map<RequestId, JSONRPCMessage>()
|
||||||
|
|
||||||
|
sessionId?: string | undefined
|
||||||
|
onclose?: () => void
|
||||||
|
onerror?: (error: Error) => void
|
||||||
|
onmessage?: (message: JSONRPCMessage, extra?: { authInfo?: AuthInfo }) => void
|
||||||
|
|
||||||
|
constructor(options?: StreamableHTTPServerTransportOptions) {
|
||||||
|
this.#sessionIdGenerator = options?.sessionIdGenerator
|
||||||
|
this.#enableJsonResponse = options?.enableJsonResponse ?? false
|
||||||
|
this.#eventStore = options?.eventStore
|
||||||
|
this.#onsessioninitialized = options?.onsessioninitialized
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts the transport. This is required by the Transport interface but is a no-op
|
||||||
|
* for the Streamable HTTP transport as connections are managed per-request.
|
||||||
|
*/
|
||||||
|
async start(): Promise<void> {
|
||||||
|
if (this.#started) {
|
||||||
|
throw new Error('Transport already started')
|
||||||
|
}
|
||||||
|
this.#started = true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles an incoming HTTP request, whether GET or POST
|
||||||
|
*/
|
||||||
|
async handleRequest(ctx: Context, parsedBody?: unknown): Promise<Response | undefined> {
|
||||||
|
switch (ctx.req.method) {
|
||||||
|
case 'GET':
|
||||||
|
return this.handleGetRequest(ctx)
|
||||||
|
case 'POST':
|
||||||
|
return this.handlePostRequest(ctx, parsedBody)
|
||||||
|
case 'DELETE':
|
||||||
|
return this.handleDeleteRequest(ctx)
|
||||||
|
default:
|
||||||
|
return this.handleUnsupportedRequest(ctx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles GET requests for SSE stream
|
||||||
|
*/
|
||||||
|
private async handleGetRequest(ctx: Context) {
|
||||||
|
try {
|
||||||
|
// The client MUST include an Accept header, listing text/event-stream as a supported content type.
|
||||||
|
const acceptHeader = ctx.req.header('Accept')
|
||||||
|
if (!acceptHeader?.includes('text/event-stream')) {
|
||||||
|
throw new HTTPException(406, {
|
||||||
|
res: Response.json({
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
error: {
|
||||||
|
code: -32000,
|
||||||
|
message: 'Not Acceptable: Client must accept text/event-stream',
|
||||||
|
},
|
||||||
|
id: null,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// If an Mcp-Session-Id is returned by the server during initialization,
|
||||||
|
// clients using the Streamable HTTP transport MUST include it
|
||||||
|
// in the Mcp-Session-Id header on all of their subsequent HTTP requests.
|
||||||
|
this.validateSession(ctx)
|
||||||
|
|
||||||
|
// After initialization, always include the session ID if we have one
|
||||||
|
if (this.sessionId !== undefined) {
|
||||||
|
ctx.header('mcp-session-id', this.sessionId)
|
||||||
|
}
|
||||||
|
|
||||||
|
let streamId: string | ((stream: SSEStreamingApi) => Promise<string>) =
|
||||||
|
this.#standaloneSseStreamId
|
||||||
|
|
||||||
|
// Handle resumability: check for Last-Event-ID header
|
||||||
|
if (this.#eventStore) {
|
||||||
|
const lastEventId = ctx.req.header('last-event-id')
|
||||||
|
if (lastEventId) {
|
||||||
|
streamId = (stream) =>
|
||||||
|
this.#eventStore!.replayEventsAfter(lastEventId, {
|
||||||
|
send: async (eventId: string, message: JSONRPCMessage) => {
|
||||||
|
try {
|
||||||
|
await stream.writeSSE({
|
||||||
|
id: eventId,
|
||||||
|
event: 'message',
|
||||||
|
data: JSON.stringify(message),
|
||||||
|
})
|
||||||
|
} catch {
|
||||||
|
this.onerror?.(new Error('Failed replay events'))
|
||||||
|
throw new HTTPException(500, {
|
||||||
|
message: 'Failed replay events',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if there's already an active standalone SSE stream for this session
|
||||||
|
if (typeof streamId === 'string' && this.#streamMapping.get(streamId) !== undefined) {
|
||||||
|
// Only one GET SSE stream is allowed per session
|
||||||
|
throw new HTTPException(409, {
|
||||||
|
res: Response.json({
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
error: {
|
||||||
|
code: -32000,
|
||||||
|
message: 'Conflict: Only one SSE stream is allowed per session',
|
||||||
|
},
|
||||||
|
id: null,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return streamSSE(ctx, async (stream) => {
|
||||||
|
const resolvedStreamId = typeof streamId === 'string' ? streamId : await streamId(stream)
|
||||||
|
|
||||||
|
// Assign the response to the standalone SSE stream
|
||||||
|
this.#streamMapping.set(resolvedStreamId, {
|
||||||
|
ctx,
|
||||||
|
stream,
|
||||||
|
})
|
||||||
|
|
||||||
|
// Keep connection alive
|
||||||
|
const keepAlive = setInterval(() => {
|
||||||
|
if (!stream.closed) {
|
||||||
|
stream.writeSSE({ data: '', event: 'ping' }).catch(() => clearInterval(keepAlive))
|
||||||
|
}
|
||||||
|
}, 30000)
|
||||||
|
|
||||||
|
// Set up close handler for client disconnects
|
||||||
|
stream.onAbort(() => {
|
||||||
|
this.#streamMapping.delete(resolvedStreamId)
|
||||||
|
clearInterval(keepAlive)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof HTTPException) {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
|
||||||
|
this.onerror?.(error as Error)
|
||||||
|
|
||||||
|
// return JSON-RPC formatted error
|
||||||
|
throw new HTTPException(400, {
|
||||||
|
res: Response.json({
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
error: {
|
||||||
|
code: -32700,
|
||||||
|
message: 'Parse error',
|
||||||
|
data: String(error),
|
||||||
|
},
|
||||||
|
id: null,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles POST requests containing JSON-RPC messages
|
||||||
|
*/
|
||||||
|
private async handlePostRequest(ctx: Context, parsedBody?: unknown) {
|
||||||
|
try {
|
||||||
|
// Validate the Accept header
|
||||||
|
const acceptHeader = ctx.req.header('Accept')
|
||||||
|
// The client MUST include an Accept header, listing both application/json and text/event-stream as supported content types.
|
||||||
|
if (
|
||||||
|
!acceptHeader?.includes('application/json') ||
|
||||||
|
!acceptHeader.includes('text/event-stream')
|
||||||
|
) {
|
||||||
|
throw new HTTPException(406, {
|
||||||
|
res: Response.json({
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
error: {
|
||||||
|
code: -32000,
|
||||||
|
message:
|
||||||
|
'Not Acceptable: Client must accept both application/json and text/event-stream',
|
||||||
|
},
|
||||||
|
id: null,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const ct = ctx.req.header('Content-Type')
|
||||||
|
if (!ct?.includes('application/json')) {
|
||||||
|
throw new HTTPException(415, {
|
||||||
|
res: Response.json({
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
error: {
|
||||||
|
code: -32000,
|
||||||
|
message: 'Unsupported Media Type: Content-Type must be application/json',
|
||||||
|
},
|
||||||
|
id: null,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const authInfo: AuthInfo | undefined = ctx.get('auth')
|
||||||
|
|
||||||
|
let rawMessage = parsedBody
|
||||||
|
if (rawMessage === undefined) {
|
||||||
|
rawMessage = await ctx.req.json()
|
||||||
|
}
|
||||||
|
|
||||||
|
let messages: JSONRPCMessage[]
|
||||||
|
|
||||||
|
// handle batch and single messages
|
||||||
|
if (Array.isArray(rawMessage)) {
|
||||||
|
messages = rawMessage.map((msg) => JSONRPCMessageSchema.parse(msg))
|
||||||
|
} else {
|
||||||
|
messages = [JSONRPCMessageSchema.parse(rawMessage)]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if this is an initialization request
|
||||||
|
// https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/lifecycle/
|
||||||
|
const isInitializationRequest = messages.some(isInitializeRequest)
|
||||||
|
if (isInitializationRequest) {
|
||||||
|
// If it's a server with session management and the session ID is already set we should reject the request
|
||||||
|
// to avoid re-initialization.
|
||||||
|
if (this.#initialized && this.sessionId !== undefined) {
|
||||||
|
throw new HTTPException(400, {
|
||||||
|
res: Response.json({
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
error: {
|
||||||
|
code: -32600,
|
||||||
|
message: 'Invalid Request: Server already initialized',
|
||||||
|
},
|
||||||
|
id: null,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (messages.length > 1) {
|
||||||
|
throw new HTTPException(400, {
|
||||||
|
res: Response.json({
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
error: {
|
||||||
|
code: -32600,
|
||||||
|
message: 'Invalid Request: Only one initialization request is allowed',
|
||||||
|
},
|
||||||
|
id: null,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.sessionId = this.#sessionIdGenerator?.()
|
||||||
|
this.#initialized = true
|
||||||
|
|
||||||
|
// If we have a session ID and an onsessioninitialized handler, call it immediately
|
||||||
|
// This is needed in cases where the server needs to keep track of multiple sessions
|
||||||
|
if (this.sessionId && this.#onsessioninitialized) {
|
||||||
|
this.#onsessioninitialized(this.sessionId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If an Mcp-Session-Id is returned by the server during initialization,
|
||||||
|
// clients using the Streamable HTTP transport MUST include it
|
||||||
|
// in the Mcp-Session-Id header on all of their subsequent HTTP requests.
|
||||||
|
if (!isInitializationRequest) {
|
||||||
|
this.validateSession(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if it contains requests
|
||||||
|
const hasRequests = messages.some(isJSONRPCRequest)
|
||||||
|
|
||||||
|
if (!hasRequests) {
|
||||||
|
// handle each message
|
||||||
|
for (const message of messages) {
|
||||||
|
this.onmessage?.(message, { authInfo })
|
||||||
|
}
|
||||||
|
|
||||||
|
// if it only contains notifications or responses, return 202
|
||||||
|
return ctx.body(null, 202)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasRequests) {
|
||||||
|
// The default behavior is to use SSE streaming
|
||||||
|
// but in some cases server will return JSON responses
|
||||||
|
const streamId = crypto.randomUUID()
|
||||||
|
|
||||||
|
if (!this.#enableJsonResponse && this.sessionId !== undefined) {
|
||||||
|
ctx.header('mcp-session-id', this.sessionId)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.#enableJsonResponse) {
|
||||||
|
// Store the response for this request to send messages back through this connection
|
||||||
|
// We need to track by request ID to maintain the connection
|
||||||
|
const result = await new Promise<any>((resolve) => {
|
||||||
|
for (const message of messages) {
|
||||||
|
if (isJSONRPCRequest(message)) {
|
||||||
|
this.#streamMapping.set(streamId, {
|
||||||
|
ctx: {
|
||||||
|
header: ctx.header,
|
||||||
|
json: resolve,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
this.#requestToStreamMapping.set(message.id, streamId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle each message
|
||||||
|
for (const message of messages) {
|
||||||
|
this.onmessage?.(message, { authInfo })
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return ctx.json(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
return streamSSE(ctx, async (stream) => {
|
||||||
|
// Store the response for this request to send messages back through this connection
|
||||||
|
// We need to track by request ID to maintain the connection
|
||||||
|
for (const message of messages) {
|
||||||
|
if (isJSONRPCRequest(message)) {
|
||||||
|
this.#streamMapping.set(streamId, {
|
||||||
|
ctx,
|
||||||
|
stream,
|
||||||
|
})
|
||||||
|
this.#requestToStreamMapping.set(message.id, streamId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up close handler for client disconnects
|
||||||
|
stream.onAbort(() => {
|
||||||
|
this.#streamMapping.delete(streamId)
|
||||||
|
})
|
||||||
|
|
||||||
|
// handle each message
|
||||||
|
for (const message of messages) {
|
||||||
|
this.onmessage?.(message, { authInfo })
|
||||||
|
}
|
||||||
|
// The server SHOULD NOT close the SSE stream before sending all JSON-RPC responses
|
||||||
|
// This will be handled by the send() method when responses are ready
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof HTTPException) {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
|
||||||
|
this.onerror?.(error as Error)
|
||||||
|
|
||||||
|
// return JSON-RPC formatted error
|
||||||
|
throw new HTTPException(400, {
|
||||||
|
res: Response.json({
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
error: {
|
||||||
|
code: -32700,
|
||||||
|
message: 'Parse error',
|
||||||
|
data: String(error),
|
||||||
|
},
|
||||||
|
id: null,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles DELETE requests to terminate sessions
|
||||||
|
*/
|
||||||
|
private async handleDeleteRequest(ctx: Context) {
|
||||||
|
this.validateSession(ctx)
|
||||||
|
|
||||||
|
await this.close()
|
||||||
|
|
||||||
|
return ctx.body(null, 200)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles unsupported requests (PUT, PATCH, etc.)
|
||||||
|
*/
|
||||||
|
private handleUnsupportedRequest(ctx: Context) {
|
||||||
|
return ctx.json(
|
||||||
|
{
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
error: {
|
||||||
|
code: -32000,
|
||||||
|
message: 'Method not allowed.',
|
||||||
|
},
|
||||||
|
id: null,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
status: 405,
|
||||||
|
headers: {
|
||||||
|
Allow: 'GET, POST, DELETE',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates session ID for non-initialization requests
|
||||||
|
* Returns true if the session is valid, false otherwise
|
||||||
|
*/
|
||||||
|
private validateSession(ctx: Context): boolean {
|
||||||
|
if (this.#sessionIdGenerator === undefined) {
|
||||||
|
// If the sessionIdGenerator ID is not set, the session management is disabled
|
||||||
|
// and we don't need to validate the session ID
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if (!this.#initialized) {
|
||||||
|
// If the server has not been initialized yet, reject all requests
|
||||||
|
throw new HTTPException(400, {
|
||||||
|
res: Response.json({
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
error: {
|
||||||
|
code: -32000,
|
||||||
|
message: 'Bad Request: Server not initialized',
|
||||||
|
},
|
||||||
|
id: null,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const sessionId = ctx.req.header('mcp-session-id')
|
||||||
|
|
||||||
|
if (!sessionId) {
|
||||||
|
// Non-initialization requests without a session ID should return 400 Bad Request
|
||||||
|
throw new HTTPException(400, {
|
||||||
|
res: Response.json({
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
error: {
|
||||||
|
code: -32000,
|
||||||
|
message: 'Bad Request: Mcp-Session-Id header is required',
|
||||||
|
},
|
||||||
|
id: null,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(sessionId)) {
|
||||||
|
throw new HTTPException(400, {
|
||||||
|
res: Response.json({
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
error: {
|
||||||
|
code: -32000,
|
||||||
|
message: 'Bad Request: Mcp-Session-Id header must be a single value',
|
||||||
|
},
|
||||||
|
id: null,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sessionId !== this.sessionId) {
|
||||||
|
// Reject requests with invalid session ID with 404 Not Found
|
||||||
|
throw new HTTPException(404, {
|
||||||
|
res: Response.json({
|
||||||
|
jsonrpc: '2.0',
|
||||||
|
error: {
|
||||||
|
code: -32001,
|
||||||
|
message: 'Session not found',
|
||||||
|
},
|
||||||
|
id: null,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
async close(): Promise<void> {
|
||||||
|
// Close all SSE connections
|
||||||
|
|
||||||
|
for (const { stream } of this.#streamMapping.values()) {
|
||||||
|
stream?.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
this.#streamMapping.clear()
|
||||||
|
|
||||||
|
// Clear any pending responses
|
||||||
|
this.#requestResponseMap.clear()
|
||||||
|
this.onclose?.()
|
||||||
|
}
|
||||||
|
|
||||||
|
async send(message: JSONRPCMessage, options?: { relatedRequestId?: RequestId }): Promise<void> {
|
||||||
|
let requestId = options?.relatedRequestId
|
||||||
|
if (isJSONRPCResponse(message) || isJSONRPCError(message)) {
|
||||||
|
// If the message is a response, use the request ID from the message
|
||||||
|
requestId = message.id
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if this message should be sent on the standalone SSE stream (no request ID)
|
||||||
|
// Ignore notifications from tools (which have relatedRequestId set)
|
||||||
|
// Those will be sent via dedicated response SSE streams
|
||||||
|
if (requestId === undefined) {
|
||||||
|
// For standalone SSE streams, we can only send requests and notifications
|
||||||
|
if (isJSONRPCResponse(message) || isJSONRPCError(message)) {
|
||||||
|
throw new Error(
|
||||||
|
'Cannot send a response on a standalone SSE stream unless resuming a previous client request'
|
||||||
|
)
|
||||||
|
}
|
||||||
|
const standaloneSse = this.#streamMapping.get(this.#standaloneSseStreamId)
|
||||||
|
|
||||||
|
if (standaloneSse === undefined) {
|
||||||
|
// The spec says the server MAY send messages on the stream, so it's ok to discard if no stream
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate and store event ID if event store is provided
|
||||||
|
let eventId: string | undefined
|
||||||
|
if (this.#eventStore) {
|
||||||
|
// Stores the event and gets the generated event ID
|
||||||
|
eventId = await this.#eventStore.storeEvent(this.#standaloneSseStreamId, message)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send the message to the standalone SSE stream
|
||||||
|
return standaloneSse.stream?.writeSSE({
|
||||||
|
id: eventId,
|
||||||
|
event: 'message',
|
||||||
|
data: JSON.stringify(message),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the response for this request
|
||||||
|
const streamId = this.#requestToStreamMapping.get(requestId)
|
||||||
|
const response = this.#streamMapping.get(streamId!)
|
||||||
|
if (!streamId) {
|
||||||
|
throw new Error(`No connection established for request ID: ${String(requestId)}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.#enableJsonResponse) {
|
||||||
|
// For SSE responses, generate event ID if event store is provided
|
||||||
|
let eventId: string | undefined
|
||||||
|
|
||||||
|
if (this.#eventStore) {
|
||||||
|
eventId = await this.#eventStore.storeEvent(streamId, message)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (response) {
|
||||||
|
// Write the event to the response stream
|
||||||
|
await response.stream?.writeSSE({
|
||||||
|
id: eventId,
|
||||||
|
event: 'message',
|
||||||
|
data: JSON.stringify(message),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isJSONRPCResponse(message) || isJSONRPCError(message)) {
|
||||||
|
this.#requestResponseMap.set(requestId, message)
|
||||||
|
const relatedIds = Array.from(this.#requestToStreamMapping.entries())
|
||||||
|
.filter(([, streamId]) => this.#streamMapping.get(streamId) === response)
|
||||||
|
.map(([id]) => id)
|
||||||
|
|
||||||
|
// Check if we have responses for all requests using this connection
|
||||||
|
const allResponsesReady = relatedIds.every((id) => this.#requestResponseMap.has(id))
|
||||||
|
|
||||||
|
if (allResponsesReady) {
|
||||||
|
if (!response) {
|
||||||
|
throw new Error(`No connection established for request ID: ${String(requestId)}`)
|
||||||
|
}
|
||||||
|
if (this.#enableJsonResponse) {
|
||||||
|
// All responses ready, send as JSON
|
||||||
|
if (this.sessionId !== undefined) {
|
||||||
|
response.ctx.header('mcp-session-id', this.sessionId)
|
||||||
|
}
|
||||||
|
|
||||||
|
const responses = relatedIds.map((id) => this.#requestResponseMap.get(id)!)
|
||||||
|
|
||||||
|
response.ctx.json(responses.length === 1 ? responses[0] : responses)
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
response.stream?.close()
|
||||||
|
}
|
||||||
|
// Clean up
|
||||||
|
for (const id of relatedIds) {
|
||||||
|
this.#requestResponseMap.delete(id)
|
||||||
|
this.#requestToStreamMapping.delete(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
import type { Context } from 'hono'
|
||||||
|
import { SSEStreamingApi } from 'hono/streaming'
|
||||||
|
|
||||||
|
let isOldBunVersion = (): boolean => {
|
||||||
|
// @ts-expect-error @types/bun is not installed
|
||||||
|
const version: string = typeof Bun !== 'undefined' ? Bun.version : undefined
|
||||||
|
if (version === undefined) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
const result = version.startsWith('1.1') || version.startsWith('1.0') || version.startsWith('0.')
|
||||||
|
// Avoid running this check on every call
|
||||||
|
isOldBunVersion = () => result
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
const run = async (
|
||||||
|
stream: SSEStreamingApi,
|
||||||
|
cb: (stream: SSEStreamingApi) => Promise<void>,
|
||||||
|
onError?: (e: Error, stream: SSEStreamingApi) => Promise<void>
|
||||||
|
): Promise<void> => {
|
||||||
|
try {
|
||||||
|
await cb(stream)
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error && onError) {
|
||||||
|
await onError(e, stream)
|
||||||
|
|
||||||
|
await stream.writeSSE({
|
||||||
|
event: 'error',
|
||||||
|
data: e.message,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
console.error(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const contextStash: WeakMap<ReadableStream, Context> = new WeakMap<ReadableStream, Context>()
|
||||||
|
|
||||||
|
export const streamSSE = (
|
||||||
|
c: Context,
|
||||||
|
cb: (stream: SSEStreamingApi) => Promise<void>,
|
||||||
|
onError?: (e: Error, stream: SSEStreamingApi) => Promise<void>
|
||||||
|
): Response => {
|
||||||
|
const { readable, writable } = new TransformStream()
|
||||||
|
const stream = new SSEStreamingApi(writable, readable)
|
||||||
|
|
||||||
|
// Until Bun v1.1.27, Bun didn't call cancel() on the ReadableStream for Response objects from Bun.serve()
|
||||||
|
if (isOldBunVersion()) {
|
||||||
|
c.req.raw.signal.addEventListener('abort', () => {
|
||||||
|
if (!stream.closed) {
|
||||||
|
stream.abort()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// in bun, `c` is destroyed when the request is returned, so hold it until the end of streaming
|
||||||
|
contextStash.set(stream.responseReadable, c)
|
||||||
|
|
||||||
|
c.header('Transfer-Encoding', 'chunked')
|
||||||
|
c.header('Content-Type', 'text/event-stream')
|
||||||
|
c.header('Cache-Control', 'no-cache')
|
||||||
|
c.header('Connection', 'keep-alive')
|
||||||
|
|
||||||
|
run(stream, cb, onError)
|
||||||
|
|
||||||
|
return c.newResponse(stream.responseReadable)
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
|
"rootDir": "src",
|
||||||
|
"outDir": "dist",
|
||||||
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
|
"emitDeclarationOnly": true,
|
||||||
|
"isolatedDeclarations": true
|
||||||
|
},
|
||||||
|
"include": ["src/**/*.ts"],
|
||||||
|
"exclude": ["**/*.test.ts"],
|
||||||
|
"references": []
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
|
"files": [],
|
||||||
|
"include": [],
|
||||||
|
"references": [
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.build.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.spec.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "../../dist/out-tsc/packages/hello",
|
||||||
|
"types": ["vitest/globals"]
|
||||||
|
},
|
||||||
|
"include": ["**/*.test.ts", "vitest.config.ts"],
|
||||||
|
"references": [
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.build.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
import { defineProject } from 'vitest/config'
|
||||||
|
|
||||||
|
export default defineProject({
|
||||||
|
test: {
|
||||||
|
globals: true,
|
||||||
|
},
|
||||||
|
})
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true,
|
"isolatedDeclarations": true,
|
||||||
"types": ["node", "ws"]
|
"types": ["node", "ws"]
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["package.json", "src/**/*.ts"],
|
"include": ["package.json", "src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo"
|
||||||
"emitDeclarationOnly": false
|
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
"exclude": ["**/*.test.ts"],
|
"exclude": ["**/*.test.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
# @hono/ua-blocker
|
# @hono/ua-blocker
|
||||||
|
|
||||||
|
## 0.1.1
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- [#1229](https://github.com/honojs/middleware/pull/1229) [`40f916f944f368775f9fc00451f649edcd140286`](https://github.com/honojs/middleware/commit/40f916f944f368775f9fc00451f649edcd140286) Thanks [@github-actions](https://github.com/apps/github-actions)! - chore(ua-blocker): update robots.json from upstream
|
||||||
|
|
||||||
## 0.1.0
|
## 0.1.0
|
||||||
|
|
||||||
### Minor Changes
|
### Minor Changes
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { uaBlocker } from '@hono/ua-blocker'
|
|
||||||
import { nonRespectingAiBots, useAiRobotsTxt } from '@hono/ua-blocker/ai-bots'
|
|
||||||
import { Hono } from 'hono'
|
import { Hono } from 'hono'
|
||||||
|
import { uaBlocker } from '../src'
|
||||||
|
import { nonRespectingAiBots, useAiRobotsTxt } from '../src/ai-bots'
|
||||||
|
|
||||||
const app = new Hono()
|
const app = new Hono()
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@hono/ua-blocker",
|
"name": "@hono/ua-blocker",
|
||||||
"version": "0.1.0",
|
"version": "0.1.1",
|
||||||
"description": "User agent-based blocker for Hono",
|
"description": "User agent-based blocker for Hono",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"module": "dist/index.js",
|
"module": "dist/index.js",
|
||||||
|
|
|
@ -314,6 +314,13 @@
|
||||||
"description": "MistralAI-User is for user actions in LeChat. When users ask LeChat a question, it may visit a web page to help answer and include a link to the source in its response.",
|
"description": "MistralAI-User is for user actions in LeChat. When users ask LeChat a question, it may visit a web page to help answer and include a link to the source in its response.",
|
||||||
"respect": "Yes"
|
"respect": "Yes"
|
||||||
},
|
},
|
||||||
|
"MyCentralAIScraperBot": {
|
||||||
|
"operator": "Unclear at this time.",
|
||||||
|
"respect": "Unclear at this time.",
|
||||||
|
"function": "AI data scraper",
|
||||||
|
"frequency": "Unclear at this time.",
|
||||||
|
"description": "Operator and data use is unclear at this time."
|
||||||
|
},
|
||||||
"NovaAct": {
|
"NovaAct": {
|
||||||
"operator": "Unclear at this time.",
|
"operator": "Unclear at this time.",
|
||||||
"respect": "Unclear at this time.",
|
"respect": "Unclear at this time.",
|
||||||
|
@ -398,6 +405,13 @@
|
||||||
"operator": "[phind](https://www.phind.com/)",
|
"operator": "[phind](https://www.phind.com/)",
|
||||||
"respect": "Unclear at this time."
|
"respect": "Unclear at this time."
|
||||||
},
|
},
|
||||||
|
"Poseidon Research Crawler": {
|
||||||
|
"operator": "[Poseidon Research](https://www.poseidonresearch.com)",
|
||||||
|
"description": "Lab focused on scaling the interpretability research necessary to make better AI systems possible.",
|
||||||
|
"frequency": "No explicit frequency provided.",
|
||||||
|
"function": "AI research crawler",
|
||||||
|
"respect": "Unclear at this time."
|
||||||
|
},
|
||||||
"QualifiedBot": {
|
"QualifiedBot": {
|
||||||
"description": "Operated by Qualified as part of their suite of AI product offerings.",
|
"description": "Operated by Qualified as part of their suite of AI product offerings.",
|
||||||
"frequency": "No explicit frequency provided.",
|
"frequency": "No explicit frequency provided.",
|
||||||
|
|
|
@ -44,6 +44,7 @@ User-agent: Meta-ExternalAgent
|
||||||
User-agent: meta-externalfetcher
|
User-agent: meta-externalfetcher
|
||||||
User-agent: Meta-ExternalFetcher
|
User-agent: Meta-ExternalFetcher
|
||||||
User-agent: MistralAI-User/1.0
|
User-agent: MistralAI-User/1.0
|
||||||
|
User-agent: MyCentralAIScraperBot
|
||||||
User-agent: NovaAct
|
User-agent: NovaAct
|
||||||
User-agent: OAI-SearchBot
|
User-agent: OAI-SearchBot
|
||||||
User-agent: omgili
|
User-agent: omgili
|
||||||
|
@ -56,6 +57,7 @@ User-agent: Perplexity-User
|
||||||
User-agent: PerplexityBot
|
User-agent: PerplexityBot
|
||||||
User-agent: PetalBot
|
User-agent: PetalBot
|
||||||
User-agent: PhindBot
|
User-agent: PhindBot
|
||||||
|
User-agent: Poseidon Research Crawler
|
||||||
User-agent: QualifiedBot
|
User-agent: QualifiedBot
|
||||||
User-agent: QuillBot
|
User-agent: QuillBot
|
||||||
User-agent: quillbot.com
|
User-agent: quillbot.com
|
||||||
|
@ -78,7 +80,7 @@ User-agent: YandexAdditionalBot
|
||||||
User-agent: YouBot
|
User-agent: YouBot
|
||||||
Disallow: /
|
Disallow: /
|
||||||
`;
|
`;
|
||||||
export const ALL_BOTS = ["AI2Bot", "Ai2Bot-Dolma", "aiHitBot", "Amazonbot", "Andibot", "anthropic-ai", "Applebot", "Applebot-Extended", "bedrockbot", "Brightbot 1.0", "Bytespider", "CCBot", "ChatGPT-User", "Claude-SearchBot", "Claude-User", "Claude-Web", "ClaudeBot", "cohere-ai", "cohere-training-data-crawler", "Cotoyogi", "Crawlspace", "Diffbot", "DuckAssistBot", "EchoboxBot", "FacebookBot", "Factset_spyderbot", "FirecrawlAgent", "FriendlyCrawler", "Google-CloudVertexBot", "Google-Extended", "GoogleOther", "GoogleOther-Image", "GoogleOther-Video", "GPTBot", "iaskspider/2.0", "ICC-Crawler", "ImagesiftBot", "img2dataset", "ISSCyberRiskCrawler", "Kangaroo Bot", "meta-externalagent", "Meta-ExternalAgent", "meta-externalfetcher", "Meta-ExternalFetcher", "MistralAI-User/1.0", "NovaAct", "OAI-SearchBot", "omgili", "omgilibot", "Operator", "PanguBot", "Panscient", "panscient.com", "Perplexity-User", "PerplexityBot", "PetalBot", "PhindBot", "QualifiedBot", "QuillBot", "quillbot.com", "SBIntuitionsBot", "Scrapy", "SemrushBot", "SemrushBot-BA", "SemrushBot-CT", "SemrushBot-OCOB", "SemrushBot-SI", "SemrushBot-SWA", "Sidetrade indexer bot", "TikTokSpider", "Timpibot", "VelenPublicWebCrawler", "Webzio-Extended", "wpbot", "YandexAdditional", "YandexAdditionalBot", "YouBot"];
|
export const ALL_BOTS = ["AI2Bot", "Ai2Bot-Dolma", "aiHitBot", "Amazonbot", "Andibot", "anthropic-ai", "Applebot", "Applebot-Extended", "bedrockbot", "Brightbot 1.0", "Bytespider", "CCBot", "ChatGPT-User", "Claude-SearchBot", "Claude-User", "Claude-Web", "ClaudeBot", "cohere-ai", "cohere-training-data-crawler", "Cotoyogi", "Crawlspace", "Diffbot", "DuckAssistBot", "EchoboxBot", "FacebookBot", "Factset_spyderbot", "FirecrawlAgent", "FriendlyCrawler", "Google-CloudVertexBot", "Google-Extended", "GoogleOther", "GoogleOther-Image", "GoogleOther-Video", "GPTBot", "iaskspider/2.0", "ICC-Crawler", "ImagesiftBot", "img2dataset", "ISSCyberRiskCrawler", "Kangaroo Bot", "meta-externalagent", "Meta-ExternalAgent", "meta-externalfetcher", "Meta-ExternalFetcher", "MistralAI-User/1.0", "MyCentralAIScraperBot", "NovaAct", "OAI-SearchBot", "omgili", "omgilibot", "Operator", "PanguBot", "Panscient", "panscient.com", "Perplexity-User", "PerplexityBot", "PetalBot", "PhindBot", "Poseidon Research Crawler", "QualifiedBot", "QuillBot", "quillbot.com", "SBIntuitionsBot", "Scrapy", "SemrushBot", "SemrushBot-BA", "SemrushBot-CT", "SemrushBot-OCOB", "SemrushBot-SI", "SemrushBot-SWA", "Sidetrade indexer bot", "TikTokSpider", "Timpibot", "VelenPublicWebCrawler", "Webzio-Extended", "wpbot", "YandexAdditional", "YandexAdditionalBot", "YouBot"];
|
||||||
export const NON_RESPECTING_BOTS = ["Andibot", "anthropic-ai", "Applebot", "Brightbot 1.0", "Bytespider", "Claude-Web", "cohere-ai", "cohere-training-data-crawler", "Diffbot", "DuckAssistBot", "EchoboxBot", "Factset_spyderbot", "iaskspider/2.0", "img2dataset", "ISSCyberRiskCrawler", "Kangaroo Bot", "Meta-ExternalAgent", "meta-externalfetcher", "Meta-ExternalFetcher", "NovaAct", "Operator", "PanguBot", "Perplexity-User", "PhindBot", "QualifiedBot", "QuillBot", "quillbot.com", "Scrapy", "Sidetrade indexer bot", "TikTokSpider", "Timpibot", "Webzio-Extended", "wpbot"];
|
export const NON_RESPECTING_BOTS = ["Andibot", "anthropic-ai", "Applebot", "Brightbot 1.0", "Bytespider", "Claude-Web", "cohere-ai", "cohere-training-data-crawler", "Diffbot", "DuckAssistBot", "EchoboxBot", "Factset_spyderbot", "iaskspider/2.0", "img2dataset", "ISSCyberRiskCrawler", "Kangaroo Bot", "Meta-ExternalAgent", "meta-externalfetcher", "Meta-ExternalFetcher", "MyCentralAIScraperBot", "NovaAct", "Operator", "PanguBot", "Perplexity-User", "PhindBot", "Poseidon Research Crawler", "QualifiedBot", "QuillBot", "quillbot.com", "Scrapy", "Sidetrade indexer bot", "TikTokSpider", "Timpibot", "Webzio-Extended", "wpbot"];
|
||||||
export const ALL_BOTS_REGEX = /(AI2BOT|AI2BOT-DOLMA|AIHITBOT|AMAZONBOT|ANDIBOT|ANTHROPIC-AI|APPLEBOT|APPLEBOT-EXTENDED|BEDROCKBOT|BRIGHTBOT 1.0|BYTESPIDER|CCBOT|CHATGPT-USER|CLAUDE-SEARCHBOT|CLAUDE-USER|CLAUDE-WEB|CLAUDEBOT|COHERE-AI|COHERE-TRAINING-DATA-CRAWLER|COTOYOGI|CRAWLSPACE|DIFFBOT|DUCKASSISTBOT|ECHOBOXBOT|FACEBOOKBOT|FACTSET_SPYDERBOT|FIRECRAWLAGENT|FRIENDLYCRAWLER|GOOGLE-CLOUDVERTEXBOT|GOOGLE-EXTENDED|GOOGLEOTHER|GOOGLEOTHER-IMAGE|GOOGLEOTHER-VIDEO|GPTBOT|IASKSPIDER\/2.0|ICC-CRAWLER|IMAGESIFTBOT|IMG2DATASET|ISSCYBERRISKCRAWLER|KANGAROO BOT|META-EXTERNALAGENT|META-EXTERNALAGENT|META-EXTERNALFETCHER|META-EXTERNALFETCHER|MISTRALAI-USER\/1.0|NOVAACT|OAI-SEARCHBOT|OMGILI|OMGILIBOT|OPERATOR|PANGUBOT|PANSCIENT|PANSCIENT.COM|PERPLEXITY-USER|PERPLEXITYBOT|PETALBOT|PHINDBOT|QUALIFIEDBOT|QUILLBOT|QUILLBOT.COM|SBINTUITIONSBOT|SCRAPY|SEMRUSHBOT|SEMRUSHBOT-BA|SEMRUSHBOT-CT|SEMRUSHBOT-OCOB|SEMRUSHBOT-SI|SEMRUSHBOT-SWA|SIDETRADE INDEXER BOT|TIKTOKSPIDER|TIMPIBOT|VELENPUBLICWEBCRAWLER|WEBZIO-EXTENDED|WPBOT|YANDEXADDITIONAL|YANDEXADDITIONALBOT|YOUBOT)/;
|
export const ALL_BOTS_REGEX = /(AI2BOT|AI2BOT-DOLMA|AIHITBOT|AMAZONBOT|ANDIBOT|ANTHROPIC-AI|APPLEBOT|APPLEBOT-EXTENDED|BEDROCKBOT|BRIGHTBOT 1.0|BYTESPIDER|CCBOT|CHATGPT-USER|CLAUDE-SEARCHBOT|CLAUDE-USER|CLAUDE-WEB|CLAUDEBOT|COHERE-AI|COHERE-TRAINING-DATA-CRAWLER|COTOYOGI|CRAWLSPACE|DIFFBOT|DUCKASSISTBOT|ECHOBOXBOT|FACEBOOKBOT|FACTSET_SPYDERBOT|FIRECRAWLAGENT|FRIENDLYCRAWLER|GOOGLE-CLOUDVERTEXBOT|GOOGLE-EXTENDED|GOOGLEOTHER|GOOGLEOTHER-IMAGE|GOOGLEOTHER-VIDEO|GPTBOT|IASKSPIDER\/2.0|ICC-CRAWLER|IMAGESIFTBOT|IMG2DATASET|ISSCYBERRISKCRAWLER|KANGAROO BOT|META-EXTERNALAGENT|META-EXTERNALAGENT|META-EXTERNALFETCHER|META-EXTERNALFETCHER|MISTRALAI-USER\/1.0|MYCENTRALAISCRAPERBOT|NOVAACT|OAI-SEARCHBOT|OMGILI|OMGILIBOT|OPERATOR|PANGUBOT|PANSCIENT|PANSCIENT.COM|PERPLEXITY-USER|PERPLEXITYBOT|PETALBOT|PHINDBOT|POSEIDON RESEARCH CRAWLER|QUALIFIEDBOT|QUILLBOT|QUILLBOT.COM|SBINTUITIONSBOT|SCRAPY|SEMRUSHBOT|SEMRUSHBOT-BA|SEMRUSHBOT-CT|SEMRUSHBOT-OCOB|SEMRUSHBOT-SI|SEMRUSHBOT-SWA|SIDETRADE INDEXER BOT|TIKTOKSPIDER|TIMPIBOT|VELENPUBLICWEBCRAWLER|WEBZIO-EXTENDED|WPBOT|YANDEXADDITIONAL|YANDEXADDITIONALBOT|YOUBOT)/;
|
||||||
export const NON_RESPECTING_BOTS_REGEX = /(ANDIBOT|ANTHROPIC-AI|APPLEBOT|BRIGHTBOT 1.0|BYTESPIDER|CLAUDE-WEB|COHERE-AI|COHERE-TRAINING-DATA-CRAWLER|DIFFBOT|DUCKASSISTBOT|ECHOBOXBOT|FACTSET_SPYDERBOT|IASKSPIDER\/2.0|IMG2DATASET|ISSCYBERRISKCRAWLER|KANGAROO BOT|META-EXTERNALAGENT|META-EXTERNALFETCHER|META-EXTERNALFETCHER|NOVAACT|OPERATOR|PANGUBOT|PERPLEXITY-USER|PHINDBOT|QUALIFIEDBOT|QUILLBOT|QUILLBOT.COM|SCRAPY|SIDETRADE INDEXER BOT|TIKTOKSPIDER|TIMPIBOT|WEBZIO-EXTENDED|WPBOT)/;
|
export const NON_RESPECTING_BOTS_REGEX = /(ANDIBOT|ANTHROPIC-AI|APPLEBOT|BRIGHTBOT 1.0|BYTESPIDER|CLAUDE-WEB|COHERE-AI|COHERE-TRAINING-DATA-CRAWLER|DIFFBOT|DUCKASSISTBOT|ECHOBOXBOT|FACTSET_SPYDERBOT|IASKSPIDER\/2.0|IMG2DATASET|ISSCYBERRISKCRAWLER|KANGAROO BOT|META-EXTERNALAGENT|META-EXTERNALFETCHER|META-EXTERNALFETCHER|MYCENTRALAISCRAPERBOT|NOVAACT|OPERATOR|PANGUBOT|PERPLEXITY-USER|PHINDBOT|POSEIDON RESEARCH CRAWLER|QUALIFIEDBOT|QUILLBOT|QUILLBOT.COM|SCRAPY|SIDETRADE INDEXER BOT|TIKTOKSPIDER|TIMPIBOT|WEBZIO-EXTENDED|WPBOT)/;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo"
|
||||||
"emitDeclarationOnly": false
|
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts", "src/**/*.json"],
|
"include": ["src/**/*.ts", "src/**/*.json"],
|
||||||
"exclude": ["**/*.test.ts"],
|
"exclude": ["**/*.test.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "dist",
|
|
||||||
"tsBuildInfoFile": "dist/tsconfig.script.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.script.tsbuildinfo",
|
||||||
"allowImportingTsExtensions": true,
|
"allowImportingTsExtensions": true,
|
||||||
"noEmit": true,
|
"noEmit": true,
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "./dist/out-tsc/packages/ua-blocker",
|
"outDir": "../../dist/out-tsc/packages/ua-blocker",
|
||||||
"types": ["vitest/globals"]
|
"types": ["vitest/globals"]
|
||||||
},
|
},
|
||||||
"include": ["**/*.test.ts", "vitest.config.ts"],
|
"include": ["examples/**/*.ts", "**/*.test.ts", "vitest.config.ts"],
|
||||||
"references": [
|
"references": [
|
||||||
{
|
{
|
||||||
"path": "./tsconfig.build.json"
|
"path": "./tsconfig.build.json"
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo"
|
||||||
"emitDeclarationOnly": false
|
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
"exclude": ["**/*.test.ts", "**/*.test-d.ts"],
|
"exclude": ["**/*.test.ts", "**/*.test-d.ts"],
|
||||||
"references": [{ "path": "../zod-validator/tsconfig.json" }]
|
"references": [{ "path": "../zod-validator/tsconfig.build.json" }]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
"rootDir": "src",
|
"rootDir": "src",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
"tsBuildInfoFile": "dist/tsconfig.build.tsbuildinfo",
|
||||||
"emitDeclarationOnly": false,
|
"emitDeclarationOnly": true,
|
||||||
"isolatedDeclarations": true
|
"isolatedDeclarations": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": ["src/**/*.ts"],
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
"references": [
|
"references": [
|
||||||
|
|
|
@ -2,15 +2,14 @@
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "ES2022",
|
"target": "ES2022",
|
||||||
"module": "esnext",
|
"module": "esnext",
|
||||||
"composite": true,
|
|
||||||
"declaration": true,
|
"declaration": true,
|
||||||
"declarationMap": true,
|
"declarationMap": true,
|
||||||
"moduleResolution": "bundler",
|
"moduleResolution": "bundler",
|
||||||
"esModuleInterop": true,
|
"esModuleInterop": true,
|
||||||
"emitDeclarationOnly": true,
|
|
||||||
"emitDecoratorMetadata": true,
|
"emitDecoratorMetadata": true,
|
||||||
"experimentalDecorators": true,
|
"experimentalDecorators": true,
|
||||||
"forceConsistentCasingInFileNames": true,
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"noEmitOnError": true,
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"noUnusedLocals": false,
|
"noUnusedLocals": false,
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"extends": "./tsconfig.base.json",
|
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"noEmit": true
|
"noEmit": true
|
||||||
},
|
},
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue