diff --git a/deno_dist/helper/factory/index.ts b/deno_dist/helper/factory/index.ts new file mode 100644 index 000000000..76ab5d53d --- /dev/null +++ b/deno_dist/helper/factory/index.ts @@ -0,0 +1,10 @@ +import type { Env, Input, MiddlewareHandler } from '../../types.ts' + +/** + * @experimental + * `middleware()` is an experimental feature. + * The API might be changed. + */ +export const middleware = ( + middleware: MiddlewareHandler +) => middleware diff --git a/package.json b/package.json index eccb1f229..2a253e9e1 100644 --- a/package.json +++ b/package.json @@ -189,6 +189,11 @@ "import": "./dist/helper/adapter/index.js", "require": "./dist/cjs/helper/adapter/index.js" }, + "./factory": { + "types": "./dist/types/helper/factory/index.d.ts", + "import": "./dist/helper/factory/index.js", + "require": "./dist/cjs/helper/factory/index.js" + }, "./cloudflare-workers": { "types": "./dist/types/adapter/cloudflare-workers/index.d.ts", "import": "./dist/adapter/cloudflare-workers/index.js", @@ -322,6 +327,9 @@ "adapter": [ "./dist/types/helper/adapter/index.d.ts" ], + "factory": [ + "./dist/types/helper/factory/index.d.ts" + ], "cloudflare-workers": [ "./dist/types/adapter/cloudflare-workers" ], @@ -423,4 +431,4 @@ "node": ">=16.0.0" }, "dependencies": {} -} +} \ No newline at end of file diff --git a/src/helper/factory/index.test.ts b/src/helper/factory/index.test.ts new file mode 100644 index 000000000..5966ab4de --- /dev/null +++ b/src/helper/factory/index.test.ts @@ -0,0 +1,32 @@ +import { hc } from '../../client' +import { Hono } from '../../index' +import { middleware } from './index' + +describe('middleware', () => { + type Env = { Variables: { foo: string } } + const app = new Hono() + + const mw = (message: string) => + middleware(async (c, next) => { + c.set('foo', 'bar') + await next() + c.header('X-Message', message) + }) + + const route = app.get('/message', mw('Hello Middleware'), (c) => { + return c.text(`Hey, ${c.var.foo}`) + }) + + it('Should return the correct header and the content', async () => { + const res = await app.request('/message') + expect(res.status).toBe(200) + expect(res.headers.get('x-message')).toBe('Hello Middleware') + expect(await res.text()).toBe('Hey, bar') + }) + + it('Should provide the correct types', async () => { + const client = hc('http://localhost') + const url = client.message.$url() + expect(url.pathname).toBe('/message') + }) +}) diff --git a/src/helper/factory/index.ts b/src/helper/factory/index.ts new file mode 100644 index 000000000..71b81e4f0 --- /dev/null +++ b/src/helper/factory/index.ts @@ -0,0 +1,10 @@ +import type { Env, Input, MiddlewareHandler } from '../../types' + +/** + * @experimental + * `middleware()` is an experimental feature. + * The API might be changed. + */ +export const middleware = ( + middleware: MiddlewareHandler +) => middleware